Skip to content

Commit 9d25b28

Browse files
committed
[InstCombine] Explicitly canonicalize splat shuffles to use poison RHS
This is usually handled by demanded elements simplification. However, as that is not supported for scalable vectors, also handle it explicitly here.
1 parent 0f5eef1 commit 9d25b28

File tree

4 files changed

+9
-4
lines changed

4 files changed

+9
-4
lines changed

llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2774,6 +2774,11 @@ Instruction *InstCombinerImpl::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
27742774
if (Instruction *I = simplifyBinOpSplats(SVI))
27752775
return I;
27762776

2777+
// Canonicalize splat shuffle to use poison RHS. Handle this explicitly in
2778+
// order to support scalable vectors.
2779+
if (match(SVI.getShuffleMask(), m_ZeroMask()) && !isa<PoisonValue>(RHS))
2780+
return replaceOperand(SVI, 1, PoisonValue::get(RHS->getType()));
2781+
27772782
if (isa<ScalableVectorType>(LHS->getType()))
27782783
return nullptr;
27792784

llvm/test/Transforms/InstCombine/vec_shuffle.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ define float @test6(<4 x float> %X) {
6767

6868
define float @testvscale6(<vscale x 4 x float> %X) {
6969
; CHECK-LABEL: @testvscale6(
70-
; CHECK-NEXT: [[T2:%.*]] = shufflevector <vscale x 4 x float> [[X:%.*]], <vscale x 4 x float> undef, <vscale x 4 x i32> zeroinitializer
70+
; CHECK-NEXT: [[T2:%.*]] = shufflevector <vscale x 4 x float> [[X:%.*]], <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
7171
; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x float> [[T2]], i64 0
7272
; CHECK-NEXT: ret float [[R]]
7373
;

llvm/test/Transforms/InstCombine/vscale_extractelement.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ define i8 @extractelement_bitcast_useless_insert(<vscale x 2 x i32> %a, i32 %x)
5656
define i32 @extractelement_shuffle_maybe_out_of_range(i32 %v) {
5757
; CHECK-LABEL: @extractelement_shuffle_maybe_out_of_range(
5858
; CHECK-NEXT: [[IN:%.*]] = insertelement <vscale x 4 x i32> undef, i32 [[V:%.*]], i64 0
59-
; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[IN]], <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
59+
; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[IN]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
6060
; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[SPLAT]], i64 4
6161
; CHECK-NEXT: ret i32 [[R]]
6262
;
@@ -69,7 +69,7 @@ define i32 @extractelement_shuffle_maybe_out_of_range(i32 %v) {
6969
define i32 @extractelement_shuffle_invalid_index(i32 %v) {
7070
; CHECK-LABEL: @extractelement_shuffle_invalid_index(
7171
; CHECK-NEXT: [[IN:%.*]] = insertelement <vscale x 4 x i32> undef, i32 [[V:%.*]], i64 0
72-
; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[IN]], <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
72+
; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[IN]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
7373
; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[SPLAT]], i64 4294967295
7474
; CHECK-NEXT: ret i32 [[R]]
7575
;

llvm/test/Transforms/InstCombine/vscale_insertelement.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ define <vscale x 4 x float> @insertelement_sequene_may_not_be_splat(float %x) {
8989
define void @ossfuzz_27416(i32 %v, ptr %p) {
9090
; CHECK-LABEL: @ossfuzz_27416(
9191
; CHECK-NEXT: [[IN:%.*]] = insertelement <vscale x 4 x i32> undef, i32 [[V:%.*]], i64 0
92-
; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[IN]], <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
92+
; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[IN]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
9393
; CHECK-NEXT: [[I1:%.*]] = insertelement <vscale x 4 x i32> [[SPLAT]], i32 undef, i64 128
9494
; CHECK-NEXT: store <vscale x 4 x i32> [[I1]], ptr [[P:%.*]], align 16
9595
; CHECK-NEXT: ret void

0 commit comments

Comments
 (0)