Skip to content

Commit c7456cc

Browse files
dianqkfhahn
authored andcommitted
[SLP] Check if instructions exist after vectorization (llvm#120434)
Fixes llvm#120433. (cherry-picked from e7a4d78) rdar://148832843
1 parent b0d6e64 commit c7456cc

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -18580,8 +18580,11 @@ bool SLPVectorizerPass::vectorizeCmpInsts(iterator_range<ItT> CmpInsts,
1858018580
if (R.isDeleted(I))
1858118581
continue;
1858218582
for (Value *Op : I->operands())
18583-
if (auto *RootOp = dyn_cast<Instruction>(Op))
18583+
if (auto *RootOp = dyn_cast<Instruction>(Op)) {
1858418584
Changed |= vectorizeRootInstruction(nullptr, RootOp, BB, R, TTI);
18585+
if (R.isDeleted(I))
18586+
break;
18587+
}
1858518588
}
1858618589
// Try to vectorize operands as vector bundles.
1858718590
for (CmpInst *I : CmpInsts) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -passes=slp-vectorizer < %s | FileCheck %s
3+
4+
define void @foo() {
5+
; CHECK-LABEL: define void @foo() {
6+
; CHECK-NEXT: [[BB:.*]]:
7+
; CHECK-NEXT: br label %[[BB1:.*]]
8+
; CHECK: [[BB1]]:
9+
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x i32> [ [[TMP11:%.*]], %[[BB3:.*]] ], [ zeroinitializer, %[[BB]] ]
10+
; CHECK-NEXT: br label %[[BB3]]
11+
; CHECK: [[BB3]]:
12+
; CHECK-NEXT: [[TMP1:%.*]] = trunc <2 x i32> [[TMP0]] to <2 x i1>
13+
; CHECK-NEXT: [[TMP2:%.*]] = mul <2 x i1> [[TMP1]], zeroinitializer
14+
; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i1> zeroinitializer, [[TMP2]]
15+
; CHECK-NEXT: [[TMP4:%.*]] = and <2 x i1> [[TMP3]], zeroinitializer
16+
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0
17+
; CHECK-NEXT: [[TMP6:%.*]] = zext i1 [[TMP5]] to i32
18+
; CHECK-NEXT: [[TMP7:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1
19+
; CHECK-NEXT: [[TMP8:%.*]] = zext i1 [[TMP7]] to i32
20+
; CHECK-NEXT: [[I22:%.*]] = or i32 [[TMP6]], [[TMP8]]
21+
; CHECK-NEXT: [[TMP9:%.*]] = insertelement <2 x i32> <i32 poison, i32 0>, i32 [[I22]], i32 0
22+
; CHECK-NEXT: [[TMP10:%.*]] = icmp ult <2 x i32> [[TMP9]], zeroinitializer
23+
; CHECK-NEXT: [[TMP11]] = select <2 x i1> [[TMP10]], <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
24+
; CHECK-NEXT: br label %[[BB1]]
25+
;
26+
bb:
27+
br label %bb1
28+
29+
bb1: ; preds = %bb3, %bb
30+
%i = phi i32 [ %i26, %bb3 ], [ 0, %bb ]
31+
%i2 = phi i32 [ %i24, %bb3 ], [ 0, %bb ]
32+
br label %bb3
33+
34+
bb3: ; preds = %bb1
35+
%i4 = zext i32 %i2 to i64
36+
%i5 = mul i64 %i4, 0
37+
%i10 = or i64 0, %i5
38+
%i11 = trunc i64 %i10 to i32
39+
%i12 = and i32 %i11, 0
40+
%i13 = zext i32 %i to i64
41+
%i14 = mul i64 %i13, 0
42+
%i19 = or i64 0, %i14
43+
%i20 = trunc i64 %i19 to i32
44+
%i21 = and i32 %i20, 0
45+
%i22 = or i32 %i12, %i21
46+
%i23 = icmp ult i32 %i22, 0
47+
%i24 = select i1 %i23, i32 0, i32 0
48+
%i25 = icmp ult i32 0, 0
49+
%i26 = select i1 %i25, i32 0, i32 0
50+
br label %bb1
51+
}

0 commit comments

Comments
 (0)