Skip to content

Commit 066b888

Browse files
committed
[SLP]Correctly set vector operand for extracts with poisons
When extracts are vectorized and it has some poison values instead of instructions, need to correctly set the vectorized operand not as poison, but as a main vector operand of the main extract instruction. Fixes #122583
1 parent 16e45b8 commit 066b888

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2441,6 +2441,17 @@ class BoUpSLP {
24412441
// operations or alternating sequences (e.g., +, -), we can safely
24422442
// tell the inverse operations by checking commutativity.
24432443
if (isa<PoisonValue>(VL[Lane])) {
2444+
if (auto *EI = dyn_cast<ExtractElementInst>(VL0)) {
2445+
if (OpIdx == 0) {
2446+
OpsVec[OpIdx][Lane] = {EI->getVectorOperand(), true, false};
2447+
continue;
2448+
}
2449+
} else if (auto *EV = dyn_cast<ExtractValueInst>(VL0)) {
2450+
if (OpIdx == 0) {
2451+
OpsVec[OpIdx][Lane] = {EV->getAggregateOperand(), true, false};
2452+
continue;
2453+
}
2454+
}
24442455
OpsVec[OpIdx][Lane] = {
24452456
PoisonValue::get(VL0->getOperand(OpIdx)->getType()), true,
24462457
false};

llvm/test/Transforms/SLPVectorizer/X86/extractelemets-extended-by-poison.ll

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,22 @@ define i32 @test() {
55
; CHECK-LABEL: define i32 @test() {
66
; CHECK-NEXT: [[ENTRY:.*:]]
77
; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i64>, ptr null, align 16
8-
; CHECK-NEXT: [[TMP1:%.*]] = or i64 poison, 0
8+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i64> [[TMP0]], <4 x i64> poison, <8 x i32> <i32 1, i32 2, i32 2, i32 3, i32 3, i32 3, i32 2, i32 1>
9+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i64> [[TMP0]], i32 1
10+
; CHECK-NEXT: [[TMP13:%.*]] = or i64 [[TMP12]], 0
911
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i64> [[TMP0]], <4 x i64> poison, <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 1, i32 poison, i32 poison>
1012
; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i64> [[TMP0]], <4 x i64> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>
1113
; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <8 x i64> [[TMP3]], <8 x i64> <i64 poison, i64 poison, i64 poison, i64 poison, i64 0, i64 poison, i64 poison, i64 poison>, <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 12, i32 1, i32 poison, i32 poison>
1214
; CHECK-NEXT: [[TMP5:%.*]] = call <8 x i64> @llvm.vector.insert.v8i64.v4i64(<8 x i64> [[TMP4]], <4 x i64> [[TMP0]], i64 0)
1315
; CHECK-NEXT: [[TMP6:%.*]] = trunc <8 x i64> [[TMP5]] to <8 x i32>
1416
; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <8 x i32> [[TMP6]], <8 x i32> poison, <16 x i32> <i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 4, i32 4, i32 5, i32 5>
17+
; CHECK-NEXT: [[TMP14:%.*]] = trunc <8 x i64> [[TMP1]] to <8 x i32>
18+
; CHECK-NEXT: [[TMP15:%.*]] = add <8 x i32> [[TMP14]], zeroinitializer
1519
; CHECK-NEXT: [[TMP8:%.*]] = add <16 x i32> [[TMP7]], zeroinitializer
1620
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i64> [[TMP0]], i32 0
1721
; CHECK-NEXT: [[INC_3_3_I_1:%.*]] = or i64 [[TMP9]], 0
1822
; CHECK-NEXT: [[TMP10:%.*]] = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> [[TMP8]])
19-
; CHECK-NEXT: [[TMP11:%.*]] = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> poison)
23+
; CHECK-NEXT: [[TMP11:%.*]] = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> [[TMP15]])
2024
; CHECK-NEXT: [[OP_RDX:%.*]] = or i32 [[TMP10]], [[TMP11]]
2125
; CHECK-NEXT: ret i32 [[OP_RDX]]
2226
;

0 commit comments

Comments
 (0)