[llvm] [VectorCombine] Add tests for UB issue, remove immediate UB from existing tests. NFC (PR #138395)

via llvm-commits llvm-commits at lists.llvm.org
Sat May 3 05:46:32 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Luke Lau (lukel97)

<details>
<summary>Changes</summary>

This adds a test that exercises the part of scalarizeBinOpOrCmp that produces immediate UB, but is fortunately currently folded into a correct transform.

I also noticed a bunch of immediate UB in some of the existing tests so this also cleans them up. They should still all be scalarized though.


---
Full diff: https://github.com/llvm/llvm-project/pull/138395.diff


4 Files Affected:

- (modified) llvm/test/Transforms/VectorCombine/AArch64/scalarize-scalable.ll (+1-1) 
- (modified) llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant-inseltpoison.ll (+18-18) 
- (modified) llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant.ll (+24-24) 
- (added) llvm/test/Transforms/VectorCombine/binop-scalarize.ll (+22) 


``````````diff
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 <vscale x 4 x i32> @scalarize_scalable_udiv(i32 %x, i32 %y) {
 ; CHECK-NEXT:    ret <vscale x 4 x i32> [[R]]
 ;
   %splatx = insertelement <vscale x 4 x i32> poison, i32 %x, i64 0
-  %splaty = insertelement <vscale x 4 x i32> poison, i32 %y, i64 0
+  %splaty = insertelement <vscale x 4 x i32> splat (i32 1), i32 %y, i64 0
   %r = udiv <vscale x 4 x i32> %splatx, %splaty
   ret <vscale x 4 x i32> %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> <i64 5, i64 undef>, %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> <i64 5, i64 2>, %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, <i64 undef, i64 2>
+  %bo = urem <2 x i64> %ins, <i64 2, i64 2>
   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> <i64 5, i64 2>, %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, <i64 undef, i64 2>
+  %bo = srem <2 x i64> %ins, <i64 2, i64 2>
   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 5, i64 undef>, 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> <i64 5, i64 undef>, %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 5, i64 2>, 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> <i64 5, i64 2>, %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, <i64 undef, i64 2>
+  %bo = udiv <2 x i64> %ins, <i64 2, i64 2>
   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 5, i64 undef>, 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> <i64 5, i64 undef>, %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 5, i64 2>, 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> <i64 5, i64 2>, %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, <i64 undef, i64 2>
+  %bo = sdiv exact <2 x i64> %ins, <i64 2, i64 2>
   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> <i64 5, i64 undef>, %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> <i64 5, i64 2>, %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 poison, i64 0>, 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, <i64 undef, i64 2>
+  %bo = urem <2 x i64> %ins, <i64 2, i64 2>
   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> <i64 5, i64 undef>, %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> <i64 5, i64 2>, %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 poison, i64 0>, 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, <i64 undef, i64 2>
+  %bo = srem <2 x i64> %ins, <i64 2, i64 2>
   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 5, i64 undef>, 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> <i64 5, i64 undef>, %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 5, i64 2>, 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> <i64 5, i64 2>, %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 poison, i64 0>, 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, <i64 undef, i64 2>
+  %bo = udiv <2 x i64> %ins, <i64 2, i64 2>
   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 5, i64 undef>, 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> <i64 5, i64 undef>, %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 5, i64 2>, 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> <i64 5, i64 2>, %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 poison, i64 0>, 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, <i64 undef, i64 2>
+  %bo = sdiv exact <2 x i64> %ins, <i64 2, i64 2>
   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), <i8 0, i8 1, i8 1, i8 1>
+;
+; to insert the scalar into, which is immediate UB.  Coincidentally, at creation
+; this gets constant folded into <i8 poison, i8 1, i8 1, i8 1>, 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 poison, i8 1, i8 1, i8 1>, 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 0, i8 1, i8 1, i8 1>, i8 %y, i32 0
+  %v = udiv <4 x i8> %x.insert, %y.insert
+  ret <4 x i8> %v
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/138395


More information about the llvm-commits mailing list