1- ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
1+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none -- version 5
22; RUN: opt -p loop-vectorize -S %s | FileCheck %s
33
44; If a FOR isn't used the VPInstruction::FirstOrderRecurrenceSplice will be dead
@@ -24,35 +24,34 @@ define void @no_use() {
2424; CHECK-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
2525; CHECK: [[MIDDLE_BLOCK]]:
2626; CHECK-NEXT: [[VECTOR_RECUR_EXTRACT:%.*]] = extractelement <4 x i32> [[STEP_ADD]], i32 3
27- ; CHECK-NEXT: br i1 false, label %[[F_EXIT :.*]], label %[[SCALAR_PH]]
27+ ; CHECK-NEXT: br i1 false, label %[[EXIT :.*]], label %[[SCALAR_PH]]
2828; CHECK: [[SCALAR_PH]]:
2929; CHECK-NEXT: [[SCALAR_RECUR_INIT:%.*]] = phi i32 [ [[VECTOR_RECUR_EXTRACT]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
3030; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 40, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
31- ; CHECK-NEXT: br label %[[FOR_COND_I :.*]]
32- ; CHECK: [[FOR_COND_I ]]:
33- ; CHECK-NEXT: [[D_0_I :%.*]] = phi i32 [ [[SCALAR_RECUR_INIT]], %[[SCALAR_PH]] ], [ [[E_0_I:%.*]], %[[FOR_COND_I ]] ]
34- ; CHECK-NEXT: [[E_0_I]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC_I:%.*]], %[[FOR_COND_I ]] ]
31+ ; CHECK-NEXT: br label %[[LOOP :.*]]
32+ ; CHECK: [[LOOP ]]:
33+ ; CHECK-NEXT: [[FOR :%.*]] = phi i32 [ [[SCALAR_RECUR_INIT]], %[[SCALAR_PH]] ], [ [[E_0_I:%.*]], %[[LOOP ]] ]
34+ ; CHECK-NEXT: [[E_0_I]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC_I:%.*]], %[[LOOP ]] ]
3535; CHECK-NEXT: [[INC_I]] = add i32 [[E_0_I]], 1
3636; CHECK-NEXT: [[EXITCOND_NOT_I:%.*]] = icmp eq i32 [[E_0_I]], 43
37- ; CHECK-NEXT: br i1 [[EXITCOND_NOT_I]], label %[[F_EXIT ]], label %[[FOR_COND_I ]], !llvm.loop [[LOOP3:![0-9]+]]
38- ; CHECK: [[F_EXIT ]]:
37+ ; CHECK-NEXT: br i1 [[EXITCOND_NOT_I]], label %[[EXIT ]], label %[[LOOP ]], !llvm.loop [[LOOP3:![0-9]+]]
38+ ; CHECK: [[EXIT ]]:
3939; CHECK-NEXT: ret void
4040;
4141entry:
42- br label %for.cond.i
42+ br label %loop
4343
44- for.cond.i :
45- %d.0.i = phi i32 [ 0 , %entry ], [ %e.0.i , %for.cond.i ]
46- %e.0.i = phi i32 [ 0 , %entry ], [ %inc.i , %for.cond.i ]
47- %inc.i = add i32 %e.0.i , 1
48- %exitcond.not.i = icmp eq i32 %e.0.i , 43
49- br i1 %exitcond.not.i , label %f. exit , label %for.cond.i
44+ loop :
45+ %for = phi i32 [ 0 , %entry ], [ %iv , %loop ]
46+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
47+ %iv.next = add i32 %iv , 1
48+ %exitcond.not.i = icmp eq i32 %iv , 43
49+ br i1 %exitcond.not.i , label %exit , label %loop
5050
51- f. exit:
51+ exit:
5252 ret void
5353}
5454
55-
5655define void @dead_use () {
5756; CHECK-LABEL: define void @dead_use() {
5857; CHECK-NEXT: [[ENTRY:.*]]:
@@ -70,41 +69,32 @@ define void @dead_use() {
7069; CHECK-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
7170; CHECK: [[MIDDLE_BLOCK]]:
7271; CHECK-NEXT: [[VECTOR_RECUR_EXTRACT:%.*]] = extractelement <4 x i32> [[STEP_ADD]], i32 3
73- ; CHECK-NEXT: br i1 false, label %[[F_EXIT :.*]], label %[[SCALAR_PH]]
72+ ; CHECK-NEXT: br i1 false, label %[[EXIT :.*]], label %[[SCALAR_PH]]
7473; CHECK: [[SCALAR_PH]]:
7574; CHECK-NEXT: [[SCALAR_RECUR_INIT:%.*]] = phi i32 [ [[VECTOR_RECUR_EXTRACT]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
7675; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 40, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
77- ; CHECK-NEXT: br label %[[FOR_COND_I :.*]]
78- ; CHECK: [[FOR_COND_I ]]:
79- ; CHECK-NEXT: [[D_0_I:%.*]] = phi i32 [ [[SCALAR_RECUR_INIT]], %[[SCALAR_PH]] ], [ [[E_0_I:%.*]], %[[FOR_COND_I ]] ]
80- ; CHECK-NEXT: [[E_0_I]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC_I:%.*]], %[[FOR_COND_I ]] ]
76+ ; CHECK-NEXT: br label %[[LOOP :.*]]
77+ ; CHECK: [[LOOP ]]:
78+ ; CHECK-NEXT: [[D_0_I:%.*]] = phi i32 [ [[SCALAR_RECUR_INIT]], %[[SCALAR_PH]] ], [ [[E_0_I:%.*]], %[[LOOP ]] ]
79+ ; CHECK-NEXT: [[E_0_I]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC_I:%.*]], %[[LOOP ]] ]
8180; CHECK-NEXT: [[DEAD:%.*]] = add i32 [[D_0_I]], 1
8281; CHECK-NEXT: [[INC_I]] = add i32 [[E_0_I]], 1
8382; CHECK-NEXT: [[EXITCOND_NOT_I:%.*]] = icmp eq i32 [[E_0_I]], 43
84- ; CHECK-NEXT: br i1 [[EXITCOND_NOT_I]], label %[[F_EXIT ]], label %[[FOR_COND_I ]], !llvm.loop [[LOOP5:![0-9]+]]
85- ; CHECK: [[F_EXIT ]]:
83+ ; CHECK-NEXT: br i1 [[EXITCOND_NOT_I]], label %[[EXIT ]], label %[[LOOP ]], !llvm.loop [[LOOP5:![0-9]+]]
84+ ; CHECK: [[EXIT ]]:
8685; CHECK-NEXT: ret void
8786;
8887entry:
89- br label %for.cond.i
88+ br label %loop
9089
91- for.cond.i :
92- %d.0.i = phi i32 [ 0 , %entry ], [ %e.0.i , %for.cond.i ]
93- %e.0.i = phi i32 [ 0 , %entry ], [ %inc.i , %for.cond.i ]
94- %dead = add i32 %d.0.i , 1
95- %inc.i = add i32 %e.0.i , 1
96- %exitcond.not.i = icmp eq i32 %e.0.i , 43
97- br i1 %exitcond.not.i , label %f. exit , label %for.cond.i
90+ loop :
91+ %for = phi i32 [ 0 , %entry ], [ %iv , %loop ]
92+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
93+ %dead = add i32 %for , 1
94+ %iv.next = add i32 %iv , 1
95+ %exitcond.not.i = icmp eq i32 %iv , 43
96+ br i1 %exitcond.not.i , label %exit , label %loop
9897
99- f. exit:
98+ exit:
10099 ret void
101100}
102-
103- ;.
104- ; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
105- ; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
106- ; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
107- ; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
108- ; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
109- ; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]}
110- ;.
0 commit comments