Skip to content

Commit 4bc25ee

Browse files
committed
[𝘀𝗽𝗿] initial version
Created using spr 1.3.5
1 parent ab902ee commit 4bc25ee

File tree

7 files changed

+65
-31
lines changed

7 files changed

+65
-31
lines changed

llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8113,9 +8113,13 @@ void BoUpSLP::buildTree_rec(ArrayRef<Value *> VL, unsigned Depth,
81138113
auto *VL0 = cast<Instruction>(S.OpValue);
81148114
BB = VL0->getParent();
81158115

8116-
if (S.MainOp && !DT->isReachableFromEntry(BB)) {
8116+
if (S.MainOp &&
8117+
(BB->isEHPad() || isa_and_nonnull<UnreachableInst>(BB->getTerminator()) ||
8118+
!DT->isReachableFromEntry(BB))) {
81178119
// Don't go into unreachable blocks. They may contain instructions with
81188120
// dependency cycles which confuse the final scheduling.
8121+
// Do not vectorize EH and non-returning blocks, not profitable in most
8122+
// cases.
81198123
LLVM_DEBUG(dbgs() << "SLP: bundle in unreachable block.\n");
81208124
newTreeEntry(VL, std::nullopt /*not vectorized*/, S, UserTreeIdx);
81218125
return;

llvm/test/Transforms/SLPVectorizer/AArch64/landing_pad.ll

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
; YAML-NEXT: Function: foo
2929
; YAML-NEXT: Args:
3030
; YAML-NEXT: - String: 'SLP vectorized with cost '
31-
; YAML-NEXT: - Cost: '2'
31+
; YAML-NEXT: - Cost: '8'
3232
; YAML-NEXT: - String: ' and with tree size '
33-
; YAML-NEXT: - TreeSize: '9'
33+
; YAML-NEXT: - TreeSize: '5'
3434

3535
define void @foo() personality ptr @bar {
3636
; CHECK-LABEL: @foo(
@@ -44,8 +44,10 @@ define void @foo() personality ptr @bar {
4444
; CHECK-NEXT: ret void
4545
; CHECK: bb3:
4646
; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i64> [ [[TMP4:%.*]], [[BB6:%.*]] ], [ poison, [[BB1:%.*]] ]
47+
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i64> [[TMP2]], i32 0
48+
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i64> [[TMP2]], i32 1
4749
; CHECK-NEXT: [[TMP3:%.*]] = invoke i64 poison(ptr addrspace(1) nonnull poison, i64 0, i64 0, i64 poison) [ "deopt"() ]
48-
; CHECK-NEXT: to label [[BB4:%.*]] unwind label [[BB10:%.*]]
50+
; CHECK-NEXT: to label [[BB4:%.*]] unwind label [[BB10:%.*]]
4951
; CHECK: bb4:
5052
; CHECK-NEXT: br i1 poison, label [[BB11:%.*]], label [[BB5:%.*]]
5153
; CHECK: bb5:
@@ -55,26 +57,31 @@ define void @foo() personality ptr @bar {
5557
; CHECK-NEXT: br label [[BB3]]
5658
; CHECK: bb7:
5759
; CHECK-NEXT: [[LOCAL_5_84111:%.*]] = phi i64 [ poison, [[BB8]] ], [ poison, [[BB5]] ]
58-
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> poison, i64 [[LOCAL_5_84111]], i32 0
5960
; CHECK-NEXT: [[TMP6:%.*]] = invoke i64 poison(ptr addrspace(1) nonnull poison, i64 poison, i64 poison, i64 poison) [ "deopt"() ]
60-
; CHECK-NEXT: to label [[BB8]] unwind label [[BB12:%.*]]
61+
; CHECK-NEXT: to label [[BB8]] unwind label [[BB12:%.*]]
6162
; CHECK: bb8:
6263
; CHECK-NEXT: br i1 poison, label [[BB7]], label [[BB6]]
6364
; CHECK: bb9:
6465
; CHECK-NEXT: [[INDVARS_IV528799:%.*]] = phi i64 [ poison, [[BB10]] ], [ poison, [[BB12]] ]
6566
; CHECK-NEXT: [[TMP7]] = phi <2 x i64> [ [[TMP8:%.*]], [[BB10]] ], [ [[TMP9:%.*]], [[BB12]] ]
6667
; CHECK-NEXT: br label [[BB2]]
6768
; CHECK: bb10:
68-
; CHECK-NEXT: [[TMP8]] = phi <2 x i64> [ [[TMP2]], [[BB3]] ]
69+
; CHECK-NEXT: [[LOCAL_10_38123_LCSSA:%.*]] = phi i64 [ [[TMP10]], [[BB3]] ]
70+
; CHECK-NEXT: [[LOCAL_5_33118_LCSSA:%.*]] = phi i64 [ [[TMP5]], [[BB3]] ]
6971
; CHECK-NEXT: [[LANDING_PAD68:%.*]] = landingpad { ptr, i64 }
70-
; CHECK-NEXT: cleanup
72+
; CHECK-NEXT: cleanup
73+
; CHECK-NEXT: [[TMP12:%.*]] = insertelement <2 x i64> poison, i64 [[LOCAL_10_38123_LCSSA]], i32 0
74+
; CHECK-NEXT: [[TMP8]] = insertelement <2 x i64> [[TMP12]], i64 [[LOCAL_5_33118_LCSSA]], i32 1
7175
; CHECK-NEXT: br label [[BB9]]
7276
; CHECK: bb11:
7377
; CHECK-NEXT: ret void
7478
; CHECK: bb12:
75-
; CHECK-NEXT: [[TMP9]] = phi <2 x i64> [ [[TMP5]], [[BB7]] ]
79+
; CHECK-NEXT: [[LOCAL_10_89113_LCSSA:%.*]] = phi i64 [ poison, [[BB7]] ]
80+
; CHECK-NEXT: [[LOCAL_5_84111_LCSSA:%.*]] = phi i64 [ [[LOCAL_5_84111]], [[BB7]] ]
7681
; CHECK-NEXT: [[LANDING_PAD149:%.*]] = landingpad { ptr, i64 }
77-
; CHECK-NEXT: cleanup
82+
; CHECK-NEXT: cleanup
83+
; CHECK-NEXT: [[TMP11:%.*]] = insertelement <2 x i64> poison, i64 [[LOCAL_10_89113_LCSSA]], i32 0
84+
; CHECK-NEXT: [[TMP9]] = insertelement <2 x i64> [[TMP11]], i64 [[LOCAL_5_84111_LCSSA]], i32 1
7885
; CHECK-NEXT: br label [[BB9]]
7986
;
8087
bb1:

llvm/test/Transforms/SLPVectorizer/X86/crash_bullet.ll

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@ define void @_ZN23btGeneric6DofConstraint8getInfo1EPN17btTypedConstraint17btCons
1818
; CHECK: land.lhs.true.i.1:
1919
; CHECK-NEXT: br i1 undef, label [[FOR_INC_1:%.*]], label [[IF_THEN7_1]]
2020
; CHECK: if.then7.1:
21-
; CHECK-NEXT: store i32 1, ptr [[INFO]], align 4
22-
; CHECK-NEXT: store i32 5, ptr [[NUB5]], align 4
21+
; CHECK-NEXT: [[INC_1:%.*]] = add nsw i32 0, 1
22+
; CHECK-NEXT: store i32 [[INC_1]], ptr [[INFO]], align 4
23+
; CHECK-NEXT: [[DEC_1:%.*]] = add nsw i32 6, -1
24+
; CHECK-NEXT: store i32 [[DEC_1]], ptr [[NUB5]], align 4
2325
; CHECK-NEXT: br label [[FOR_INC_1]]
2426
; CHECK: for.inc.1:
25-
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x i32> [ <i32 1, i32 5>, [[IF_THEN7_1]] ], [ <i32 0, i32 6>, [[LAND_LHS_TRUE_I_1]] ]
26-
; CHECK-NEXT: [[TMP1:%.*]] = add nsw <2 x i32> [[TMP0]], <i32 1, i32 -1>
27-
; CHECK-NEXT: store <2 x i32> [[TMP1]], ptr [[INFO]], align 4
27+
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[DEC_1]], [[IF_THEN7_1]] ], [ 6, [[LAND_LHS_TRUE_I_1]] ]
28+
; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ [[INC_1]], [[IF_THEN7_1]] ], [ 0, [[LAND_LHS_TRUE_I_1]] ]
29+
; CHECK-NEXT: [[INC_2:%.*]] = add nsw i32 [[TMP1]], 1
30+
; CHECK-NEXT: store i32 [[INC_2]], ptr [[INFO]], align 4
31+
; CHECK-NEXT: [[DEC_2:%.*]] = add nsw i32 [[TMP0]], -1
32+
; CHECK-NEXT: store i32 [[DEC_2]], ptr [[NUB5]], align 4
2833
; CHECK-NEXT: unreachable
2934
;
3035
entry:

llvm/test/Transforms/SLPVectorizer/X86/extractelement-phi-in-landingpad.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ define void @test() personality ptr null {
1010
; CHECK-NEXT: invoke void null()
1111
; CHECK-NEXT: to label %[[BB65]] unwind label %[[BB4]]
1212
; CHECK: [[BB4]]:
13-
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x i32> [ zeroinitializer, %[[BB]] ], [ poison, %[[BB2]] ]
13+
; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ 0, %[[BB]] ], [ 0, %[[BB2]] ]
14+
; CHECK-NEXT: [[PHI6:%.*]] = phi i32 [ 0, %[[BB]] ], [ 0, %[[BB2]] ]
1415
; CHECK-NEXT: [[LANDINGPAD:%.*]] = landingpad { ptr, i32 }
1516
; CHECK-NEXT: cleanup
16-
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i32> [[TMP0]], i32 1
1717
; CHECK-NEXT: call void null(i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]], i32 [[TMP1]])
1818
; CHECK-NEXT: ret void
1919
; CHECK: [[BB65]]:

llvm/test/Transforms/SLPVectorizer/X86/funclet.ll

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,24 @@ define void @test1(ptr %a, ptr %b, ptr %c) #0 personality ptr @__CxxFrameHandler
77
; CHECK-LABEL: @test1(
88
; CHECK-NEXT: entry:
99
; CHECK-NEXT: invoke void @_CxxThrowException(ptr null, ptr null)
10-
; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CATCH_DISPATCH:%.*]]
10+
; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CATCH_DISPATCH:%.*]]
1111
; CHECK: catch.dispatch:
1212
; CHECK-NEXT: [[TMP0:%.*]] = catchswitch within none [label %catch] unwind to caller
1313
; CHECK: catch:
1414
; CHECK-NEXT: [[TMP1:%.*]] = catchpad within [[TMP0]] [ptr null, i32 64, ptr null]
15-
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x double>, ptr [[A:%.*]], align 8
16-
; CHECK-NEXT: [[TMP5:%.*]] = load <2 x double>, ptr [[B:%.*]], align 8
17-
; CHECK-NEXT: [[TMP6:%.*]] = fmul <2 x double> [[TMP3]], [[TMP5]]
18-
; CHECK-NEXT: [[TMP7:%.*]] = call <2 x double> @llvm.floor.v2f64(<2 x double> [[TMP6]]) [ "funclet"(token [[TMP1]]) ]
19-
; CHECK-NEXT: store <2 x double> [[TMP7]], ptr [[C:%.*]], align 8
15+
; CHECK-NEXT: [[I0:%.*]] = load double, ptr [[A:%.*]], align 8
16+
; CHECK-NEXT: [[I1:%.*]] = load double, ptr [[B:%.*]], align 8
17+
; CHECK-NEXT: [[MUL:%.*]] = fmul double [[I0]], [[I1]]
18+
; CHECK-NEXT: [[CALL:%.*]] = tail call double @floor(double [[MUL]]) #[[ATTR1:[0-9]+]] [ "funclet"(token [[TMP1]]) ]
19+
; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds double, ptr [[A]], i64 1
20+
; CHECK-NEXT: [[I3:%.*]] = load double, ptr [[ARRAYIDX3]], align 8
21+
; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds double, ptr [[B]], i64 1
22+
; CHECK-NEXT: [[I4:%.*]] = load double, ptr [[ARRAYIDX4]], align 8
23+
; CHECK-NEXT: [[MUL5:%.*]] = fmul double [[I3]], [[I4]]
24+
; CHECK-NEXT: [[CALL5:%.*]] = tail call double @floor(double [[MUL5]]) #[[ATTR1]] [ "funclet"(token [[TMP1]]) ]
25+
; CHECK-NEXT: store double [[CALL]], ptr [[C:%.*]], align 8
26+
; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds double, ptr [[C]], i64 1
27+
; CHECK-NEXT: store double [[CALL5]], ptr [[ARRAYIDX5]], align 8
2028
; CHECK-NEXT: catchret from [[TMP1]] to label [[TRY_CONT:%.*]]
2129
; CHECK: try.cont:
2230
; CHECK-NEXT: ret void

llvm/test/Transforms/SLPVectorizer/X86/landing_pad.ll

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ define void @foo() personality ptr @bar {
1414
; CHECK-NEXT: ret void
1515
; CHECK: bb3:
1616
; CHECK-NEXT: [[TMP1:%.*]] = phi <2 x i32> [ [[TMP3:%.*]], [[BB6:%.*]] ], [ poison, [[BB1:%.*]] ]
17+
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i32> [[TMP1]], i32 0
18+
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i32> [[TMP1]], i32 1
1719
; CHECK-NEXT: [[TMP2:%.*]] = invoke i32 poison(ptr addrspace(1) nonnull poison, i32 0, i32 0, i32 poison) [ "deopt"() ]
1820
; CHECK-NEXT: to label [[BB4:%.*]] unwind label [[BB10:%.*]]
1921
; CHECK: bb4:
@@ -25,27 +27,32 @@ define void @foo() personality ptr @bar {
2527
; CHECK-NEXT: br label [[BB3]]
2628
; CHECK: bb7:
2729
; CHECK-NEXT: [[LOCAL_5_84111:%.*]] = phi i32 [ poison, [[BB8]] ], [ poison, [[BB5]] ]
28-
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i32> poison, i32 [[LOCAL_5_84111]], i32 0
2930
; CHECK-NEXT: [[TMP5:%.*]] = invoke i32 poison(ptr addrspace(1) nonnull poison, i32 poison, i32 poison, i32 poison) [ "deopt"() ]
3031
; CHECK-NEXT: to label [[BB8]] unwind label [[BB12:%.*]]
3132
; CHECK: bb8:
3233
; CHECK-NEXT: br i1 poison, label [[BB7]], label [[BB6]]
3334
; CHECK: bb9:
3435
; CHECK-NEXT: [[INDVARS_IV528799:%.*]] = phi i64 [ poison, [[BB10]] ], [ poison, [[BB12]] ]
3536
; CHECK-NEXT: [[TMP6:%.*]] = phi <2 x i32> [ [[TMP8:%.*]], [[BB10]] ], [ [[TMP9:%.*]], [[BB12]] ]
36-
; CHECK-NEXT: [[TMP7]] = shufflevector <2 x i32> [[TMP6]], <2 x i32> poison, <4 x i32> <i32 poison, i32 poison, i32 1, i32 0>
37+
; CHECK-NEXT: [[TMP7]] = shufflevector <2 x i32> [[TMP6]], <2 x i32> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 1>
3738
; CHECK-NEXT: br label [[BB2]]
3839
; CHECK: bb10:
39-
; CHECK-NEXT: [[TMP8]] = phi <2 x i32> [ [[TMP1]], [[BB3]] ]
40+
; CHECK-NEXT: [[LOCAL_10_38123_LCSSA:%.*]] = phi i32 [ [[TMP10]], [[BB3]] ]
41+
; CHECK-NEXT: [[LOCAL_5_33118_LCSSA:%.*]] = phi i32 [ [[TMP4]], [[BB3]] ]
4042
; CHECK-NEXT: [[LANDING_PAD68:%.*]] = landingpad { ptr, i32 }
4143
; CHECK-NEXT: cleanup
44+
; CHECK-NEXT: [[TMP12:%.*]] = insertelement <2 x i32> poison, i32 [[LOCAL_10_38123_LCSSA]], i32 0
45+
; CHECK-NEXT: [[TMP8]] = insertelement <2 x i32> [[TMP12]], i32 [[LOCAL_5_33118_LCSSA]], i32 1
4246
; CHECK-NEXT: br label [[BB9]]
4347
; CHECK: bb11:
4448
; CHECK-NEXT: ret void
4549
; CHECK: bb12:
46-
; CHECK-NEXT: [[TMP9]] = phi <2 x i32> [ [[TMP4]], [[BB7]] ]
50+
; CHECK-NEXT: [[LOCAL_10_89113_LCSSA:%.*]] = phi i32 [ poison, [[BB7]] ]
51+
; CHECK-NEXT: [[LOCAL_5_84111_LCSSA:%.*]] = phi i32 [ [[LOCAL_5_84111]], [[BB7]] ]
4752
; CHECK-NEXT: [[LANDING_PAD149:%.*]] = landingpad { ptr, i32 }
4853
; CHECK-NEXT: cleanup
54+
; CHECK-NEXT: [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[LOCAL_10_89113_LCSSA]], i32 0
55+
; CHECK-NEXT: [[TMP9]] = insertelement <2 x i32> [[TMP11]], i32 [[LOCAL_5_84111_LCSSA]], i32 1
4956
; CHECK-NEXT: br label [[BB9]]
5057
;
5158
bb1:

llvm/test/Transforms/SLPVectorizer/X86/phi_landingpad.ll

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@ define void @test_phi_in_landingpad() personality ptr
77
; CHECK-LABEL: @test_phi_in_landingpad(
88
; CHECK-NEXT: entry:
99
; CHECK-NEXT: invoke void @foo()
10-
; CHECK-NEXT: to label [[INNER:%.*]] unwind label [[LPAD:%.*]]
10+
; CHECK-NEXT: to label [[INNER:%.*]] unwind label [[LPAD:%.*]]
1111
; CHECK: inner:
1212
; CHECK-NEXT: invoke void @foo()
13-
; CHECK-NEXT: to label [[DONE:%.*]] unwind label [[LPAD]]
13+
; CHECK-NEXT: to label [[DONE:%.*]] unwind label [[LPAD]]
1414
; CHECK: lpad:
15-
; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x double> [ undef, [[ENTRY:%.*]] ], [ undef, [[INNER]] ]
15+
; CHECK-NEXT: [[X1:%.*]] = phi double [ undef, [[ENTRY:%.*]] ], [ undef, [[INNER]] ]
16+
; CHECK-NEXT: [[Y1:%.*]] = phi double [ undef, [[ENTRY]] ], [ undef, [[INNER]] ]
1617
; CHECK-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 }
17-
; CHECK-NEXT: catch ptr null
18+
; CHECK-NEXT: catch ptr null
19+
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x double> poison, double [[X1]], i32 0
20+
; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x double> [[TMP3]], double [[Y1]], i32 1
1821
; CHECK-NEXT: br label [[DONE]]
1922
; CHECK: done:
2023
; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x double> [ undef, [[INNER]] ], [ [[TMP0]], [[LPAD]] ]

0 commit comments

Comments
 (0)