diff --git a/llvm/test/Transforms/VectorCombine/AArch64/scalarize-scalable.ll b/llvm/test/Transforms/VectorCombine/AArch64/scalarize-scalable.ll index ac7bc91fa3f25..6350ce7598a71 100644 --- a/llvm/test/Transforms/VectorCombine/AArch64/scalarize-scalable.ll +++ b/llvm/test/Transforms/VectorCombine/AArch64/scalarize-scalable.ll @@ -30,7 +30,7 @@ define @scalarize_scalable_udiv(i32 %x, i32 %y) { ; CHECK-NEXT: ret [[R]] ; %splatx = insertelement poison, i32 %x, i64 0 - %splaty = insertelement poison, i32 %y, i64 0 + %splaty = insertelement splat (i32 1), i32 %y, i64 0 %r = udiv %splatx, %splaty ret %r } diff --git a/llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant-inseltpoison.ll b/llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant-inseltpoison.ll index 05251cb829b2b..d45d5f4d44ff3 100644 --- a/llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant-inseltpoison.ll +++ b/llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant-inseltpoison.ll @@ -305,10 +305,10 @@ define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) { define <2 x i64> @urem_constant_op0(i64 %x) { ; CHECK-LABEL: @urem_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> poison, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = urem <2 x i64> , %ins ret <2 x i64> %bo } @@ -316,10 +316,10 @@ define <2 x i64> @urem_constant_op0(i64 %x) { define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @urem_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> poison, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = urem <2 x i64> , %ins ret <2 x i64> %bo } @@ -331,7 +331,7 @@ define <2 x i64> @urem_constant_op1(i64 %x) { ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> poison, i64 %x, i32 1 - %bo = urem <2 x i64> %ins, + %bo = urem <2 x i64> %ins, ret <2 x i64> %bo } @@ -360,10 +360,10 @@ define <2 x i64> @srem_constant_op0(i64 %x) { define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @srem_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> poison, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = srem <2 x i64> , %ins ret <2 x i64> %bo } @@ -375,7 +375,7 @@ define <2 x i64> @srem_constant_op1(i64 %x) { ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> poison, i64 %x, i32 1 - %bo = srem <2 x i64> %ins, + %bo = srem <2 x i64> %ins, ret <2 x i64> %bo } @@ -393,10 +393,10 @@ define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) { define <2 x i64> @udiv_constant_op0(i64 %x) { ; CHECK-LABEL: @udiv_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> poison, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = udiv exact <2 x i64> , %ins ret <2 x i64> %bo } @@ -404,10 +404,10 @@ define <2 x i64> @udiv_constant_op0(i64 %x) { define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @udiv_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> poison, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = udiv exact <2 x i64> , %ins ret <2 x i64> %bo } @@ -419,7 +419,7 @@ define <2 x i64> @udiv_constant_op1(i64 %x) { ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> poison, i64 %x, i32 1 - %bo = udiv <2 x i64> %ins, + %bo = udiv <2 x i64> %ins, ret <2 x i64> %bo } @@ -437,10 +437,10 @@ define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) { define <2 x i64> @sdiv_constant_op0(i64 %x) { ; CHECK-LABEL: @sdiv_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> poison, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = sdiv <2 x i64> , %ins ret <2 x i64> %bo } @@ -448,10 +448,10 @@ define <2 x i64> @sdiv_constant_op0(i64 %x) { define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> poison, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = sdiv <2 x i64> , %ins ret <2 x i64> %bo } @@ -463,7 +463,7 @@ define <2 x i64> @sdiv_constant_op1(i64 %x) { ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> poison, i64 %x, i32 1 - %bo = sdiv exact <2 x i64> %ins, + %bo = sdiv exact <2 x i64> %ins, ret <2 x i64> %bo } diff --git a/llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant.ll b/llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant.ll index bbdd76c58b58e..2b5a58ea44de4 100644 --- a/llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant.ll +++ b/llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant.ll @@ -305,10 +305,10 @@ define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) { define <2 x i64> @urem_constant_op0(i64 %x) { ; CHECK-LABEL: @urem_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> undef, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = urem <2 x i64> , %ins ret <2 x i64> %bo } @@ -316,10 +316,10 @@ define <2 x i64> @urem_constant_op0(i64 %x) { define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @urem_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> undef, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = urem <2 x i64> , %ins ret <2 x i64> %bo } @@ -327,11 +327,11 @@ define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) { define <2 x i64> @urem_constant_op1(i64 %x) { ; CHECK-LABEL: @urem_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2 -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 - %bo = urem <2 x i64> %ins, + %bo = urem <2 x i64> %ins, ret <2 x i64> %bo } @@ -349,10 +349,10 @@ define <2 x i64> @urem_constant_op1_not_undef_lane(i64 %x) { define <2 x i64> @srem_constant_op0(i64 %x) { ; CHECK-LABEL: @srem_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> undef, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = srem <2 x i64> , %ins ret <2 x i64> %bo } @@ -360,10 +360,10 @@ define <2 x i64> @srem_constant_op0(i64 %x) { define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @srem_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> undef, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = srem <2 x i64> , %ins ret <2 x i64> %bo } @@ -371,11 +371,11 @@ define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) { define <2 x i64> @srem_constant_op1(i64 %x) { ; CHECK-LABEL: @srem_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2 -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 - %bo = srem <2 x i64> %ins, + %bo = srem <2 x i64> %ins, ret <2 x i64> %bo } @@ -393,10 +393,10 @@ define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) { define <2 x i64> @udiv_constant_op0(i64 %x) { ; CHECK-LABEL: @udiv_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> undef, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = udiv exact <2 x i64> , %ins ret <2 x i64> %bo } @@ -404,10 +404,10 @@ define <2 x i64> @udiv_constant_op0(i64 %x) { define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @udiv_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> undef, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = udiv exact <2 x i64> , %ins ret <2 x i64> %bo } @@ -415,11 +415,11 @@ define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) { define <2 x i64> @udiv_constant_op1(i64 %x) { ; CHECK-LABEL: @udiv_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2 -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 - %bo = udiv <2 x i64> %ins, + %bo = udiv <2 x i64> %ins, ret <2 x i64> %bo } @@ -437,10 +437,10 @@ define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) { define <2 x i64> @sdiv_constant_op0(i64 %x) { ; CHECK-LABEL: @sdiv_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> undef, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = sdiv <2 x i64> , %ins ret <2 x i64> %bo } @@ -448,10 +448,10 @@ define <2 x i64> @sdiv_constant_op0(i64 %x) { define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; - %ins = insertelement <2 x i64> undef, i64 %x, i32 0 + %ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0 %bo = sdiv <2 x i64> , %ins ret <2 x i64> %bo } @@ -459,11 +459,11 @@ define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) { define <2 x i64> @sdiv_constant_op1(i64 %x) { ; CHECK-LABEL: @sdiv_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2 -; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 +; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 - %bo = sdiv exact <2 x i64> %ins, + %bo = sdiv exact <2 x i64> %ins, ret <2 x i64> %bo } diff --git a/llvm/test/Transforms/VectorCombine/binop-scalarize.ll b/llvm/test/Transforms/VectorCombine/binop-scalarize.ll new file mode 100644 index 0000000000000..52a706a0b59a7 --- /dev/null +++ b/llvm/test/Transforms/VectorCombine/binop-scalarize.ll @@ -0,0 +1,22 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt < %s -S -p vector-combine | FileCheck %s + +; FIXME: The way we scalarize this today is by creating a +; +; %v = udiv <4 x i8> splat (i8 1), +; +; to insert the scalar into, which is immediate UB. Coincidentally, at creation +; this gets constant folded into , but we shouldn't +; rely on this. +define <4 x i8> @udiv_ub(i8 %x, i8 %y) { +; CHECK-LABEL: define <4 x i8> @udiv_ub( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[V_SCALAR:%.*]] = udiv i8 [[X]], [[Y]] +; CHECK-NEXT: [[V:%.*]] = insertelement <4 x i8> , i8 [[V_SCALAR]], i64 0 +; CHECK-NEXT: ret <4 x i8> [[V]] +; + %x.insert = insertelement <4 x i8> splat (i8 1), i8 %x, i32 0 + %y.insert = insertelement <4 x i8> , i8 %y, i32 0 + %v = udiv <4 x i8> %x.insert, %y.insert + ret <4 x i8> %v +}