; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -passes=instcombine < %s | FileCheck %s target triple = "aarch64-unknown-linux-gnu" ; op2 = tbl(op1 dup_x(idx)) -> op2 = vector_splat(extractelement(op1, idx)) define @dup_ext_i8( %data) #0 { ; ; CHECK-LABEL: @dup_ext_i8( ; CHECK-NEXT: [[TMP1:%.*]] = extractelement [[DATA:%.*]], i64 1 ; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement poison, i8 [[TMP1]], i64 0 ; CHECK-NEXT: [[OUT:%.*]] = shufflevector [[DOTSPLATINSERT]], poison, zeroinitializer ; CHECK-NEXT: ret [[OUT]] ; %tmp = call @llvm.aarch64.sve.dup.x.nxv16i8(i8 1) %out = call @llvm.aarch64.sve.tbl.nxv16i8( %data, %tmp) ret %out } define @dup_ext_i16( %data) #0 { ; ; CHECK-LABEL: @dup_ext_i16( ; CHECK-NEXT: [[TMP1:%.*]] = extractelement [[DATA:%.*]], i64 1 ; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement poison, i16 [[TMP1]], i64 0 ; CHECK-NEXT: [[OUT:%.*]] = shufflevector [[DOTSPLATINSERT]], poison, zeroinitializer ; CHECK-NEXT: ret [[OUT]] ; %tmp = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 1) %out = call @llvm.aarch64.sve.tbl.nxv8i16( %data, %tmp) ret %out } define @dup_ext_i32( %data) #0 { ; ; CHECK-LABEL: @dup_ext_i32( ; CHECK-NEXT: [[TMP1:%.*]] = extractelement [[DATA:%.*]], i64 1 ; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement poison, i32 [[TMP1]], i64 0 ; CHECK-NEXT: [[OUT:%.*]] = shufflevector [[DOTSPLATINSERT]], poison, zeroinitializer ; CHECK-NEXT: ret [[OUT]] ; %tmp = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 1) %out = call @llvm.aarch64.sve.tbl.nxv4i32( %data, %tmp) ret %out } define @dup_ext_i64( %data) #0 { ; ; CHECK-LABEL: @dup_ext_i64( ; CHECK-NEXT: [[TMP1:%.*]] = extractelement [[DATA:%.*]], i64 1 ; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement poison, i64 [[TMP1]], i64 0 ; CHECK-NEXT: [[OUT:%.*]] = shufflevector [[DOTSPLATINSERT]], poison, zeroinitializer ; CHECK-NEXT: ret [[OUT]] ; %tmp = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 1) %out = call @llvm.aarch64.sve.tbl.nxv2i64( %data, %tmp) ret %out } define @dup_ext_f16( %data) #0 { ; ; CHECK-LABEL: @dup_ext_f16( ; CHECK-NEXT: [[TMP1:%.*]] = extractelement [[DATA:%.*]], i64 1 ; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement poison, half [[TMP1]], i64 0 ; CHECK-NEXT: [[OUT:%.*]] = shufflevector [[DOTSPLATINSERT]], poison, zeroinitializer ; CHECK-NEXT: ret [[OUT]] ; %tmp = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 1) %out = call @llvm.aarch64.sve.tbl.nxv8f16( %data, %tmp) ret %out } define @dup_ext_f32( %data) #0 { ; ; CHECK-LABEL: @dup_ext_f32( ; CHECK-NEXT: [[TMP1:%.*]] = extractelement [[DATA:%.*]], i64 1 ; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement poison, float [[TMP1]], i64 0 ; CHECK-NEXT: [[OUT:%.*]] = shufflevector [[DOTSPLATINSERT]], poison, zeroinitializer ; CHECK-NEXT: ret [[OUT]] ; %tmp = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 1) %out = call @llvm.aarch64.sve.tbl.nxv4f32( %data, %tmp) ret %out } define @dup_ext_f64( %data) #0 { ; ; CHECK-LABEL: @dup_ext_f64( ; CHECK-NEXT: [[TMP1:%.*]] = extractelement [[DATA:%.*]], i64 1 ; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement poison, double [[TMP1]], i64 0 ; CHECK-NEXT: [[OUT:%.*]] = shufflevector [[DOTSPLATINSERT]], poison, zeroinitializer ; CHECK-NEXT: ret [[OUT]] ; %tmp = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 1) %out = call @llvm.aarch64.sve.tbl.nxv2f64( %data, %tmp) ret %out } declare @llvm.aarch64.sve.dup.x.nxv16i8( i8) declare @llvm.aarch64.sve.dup.x.nxv8i16(i16) declare @llvm.aarch64.sve.dup.x.nxv4i32(i32) declare @llvm.aarch64.sve.dup.x.nxv2i64(i64) declare @llvm.aarch64.sve.tbl.nxv16i8( , ) declare @llvm.aarch64.sve.tbl.nxv8i16( , ) declare @llvm.aarch64.sve.tbl.nxv4i32( , ) declare @llvm.aarch64.sve.tbl.nxv2i64( , ) declare @llvm.aarch64.sve.tbl.nxv8f16( , ) declare @llvm.aarch64.sve.tbl.nxv4f32( , ) declare @llvm.aarch64.sve.tbl.nxv2f64( , ) attributes #0 = { "target-features"="+sve" }