@@ -9,18 +9,38 @@ define i32 @peel_last_with_trip_count_check_lcssa_phi(i32 %n) {
99; CHECK-SAME: i32 [[N:%.*]]) {
1010; CHECK-NEXT: [[ENTRY:.*]]:
1111; CHECK-NEXT: [[SUB:%.*]] = add i32 [[N]], -1
12+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i32 [[SUB]], 0
13+ ; CHECK-NEXT: br i1 [[TMP0]], label %[[ENTRY_SPLIT:.*]], label %[[EXIT_PEEL_BEGIN:.*]]
14+ ; CHECK: [[ENTRY_SPLIT]]:
1215; CHECK-NEXT: br label %[[LOOP:.*]]
1316; CHECK: [[LOOP]]:
14- ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
17+ ; CHECK-NEXT: [[IV1:%.*]] = phi i32 [ 0, %[[ENTRY_SPLIT]] ], [ [[IV_NEXT1:%.*]], %[[LOOP]] ]
18+ ; CHECK-NEXT: call void @foo(i32 2)
19+ ; CHECK-NEXT: [[IV_NEXT1]] = add nuw i32 [[IV1]], 1
20+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[N]], 1
21+ ; CHECK-NEXT: [[EC1:%.*]] = icmp ne i32 [[IV_NEXT1]], [[TMP1]]
22+ ; CHECK-NEXT: br i1 [[EC1]], label %[[LOOP]], label %[[EXIT_PEEL_BEGIN_LOOPEXIT:.*]], !llvm.loop [[LOOP0:![0-9]+]]
23+ ; CHECK: [[EXIT_PEEL_BEGIN_LOOPEXIT]]:
24+ ; CHECK-NEXT: [[SEL_LCSSA_PH:%.*]] = phi i32 [ 2, %[[LOOP]] ]
25+ ; CHECK-NEXT: [[DOTPH:%.*]] = phi i32 [ [[IV_NEXT1]], %[[LOOP]] ]
26+ ; CHECK-NEXT: br label %[[EXIT_PEEL_BEGIN]]
27+ ; CHECK: [[EXIT_PEEL_BEGIN]]:
28+ ; CHECK-NEXT: [[SEL_LCSSA:%.*]] = phi i32 [ poison, %[[ENTRY]] ], [ [[SEL_LCSSA_PH]], %[[EXIT_PEEL_BEGIN_LOOPEXIT]] ]
29+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[DOTPH]], %[[EXIT_PEEL_BEGIN_LOOPEXIT]] ]
30+ ; CHECK-NEXT: br label %[[LOOP_PEEL:.*]]
31+ ; CHECK: [[LOOP_PEEL]]:
1532; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[IV]], [[SUB]]
1633; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i32 1, i32 2
1734; CHECK-NEXT: call void @foo(i32 [[SEL]])
18- ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
35+ ; CHECK-NEXT: [[IV_NEXT:%.* ]] = add i32 [[IV]], 1
1936; CHECK-NEXT: [[EC:%.*]] = icmp ne i32 [[IV_NEXT]], [[N]]
20- ; CHECK-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT:.*]]
37+ ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_PEEL_NEXT:.*]], label %[[EXIT_PEEL_NEXT]]
38+ ; CHECK: [[EXIT_PEEL_NEXT]]:
39+ ; CHECK-NEXT: br label %[[LOOP_PEEL_NEXT:.*]]
40+ ; CHECK: [[LOOP_PEEL_NEXT]]:
41+ ; CHECK-NEXT: br label %[[EXIT:.*]]
2142; CHECK: [[EXIT]]:
22- ; CHECK-NEXT: [[SEL_LCSSA:%.*]] = phi i32 [ [[SEL]], %[[LOOP]] ]
23- ; CHECK-NEXT: ret i32 [[SEL_LCSSA]]
43+ ; CHECK-NEXT: ret i32 [[SEL]]
2444;
2545entry:
2646 %sub = add i32 %n , -1
@@ -160,21 +180,44 @@ define void @peel_last_with_trip_count_check_nested_loop(i32 %n) {
160180; CHECK-NEXT: [[ENTRY:.*:]]
161181; CHECK-NEXT: [[SUB:%.*]] = add i32 [[N]], -1
162182; CHECK-NEXT: br label %[[OUTER_HEADER:.*]]
163- ; CHECK: [[OUTER_HEADER_LOOPEXIT:.*]]:
183+ ; CHECK: [[OUTER_HEADER_LOOPEXIT_PEEL_BEGIN_LOOPEXIT:.*]]:
184+ ; CHECK-NEXT: [[DOTPH:%.*]] = phi i32 [ [[IV_NEXT1:%.*]], %[[INNER_LATCH:.*]] ]
185+ ; CHECK-NEXT: br label %[[OUTER_HEADER_LOOPEXIT_PEEL_BEGIN:.*]]
186+ ; CHECK: [[OUTER_HEADER_LOOPEXIT_PEEL_BEGIN]]:
187+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[OUTER_HEADER]] ], [ [[DOTPH]], %[[OUTER_HEADER_LOOPEXIT_PEEL_BEGIN_LOOPEXIT]] ]
188+ ; CHECK-NEXT: br label %[[INNER_HEADER_PEEL:.*]]
189+ ; CHECK: [[INNER_HEADER_PEEL]]:
190+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[IV]], [[SUB]]
191+ ; CHECK-NEXT: br i1 [[C]], label %[[INNER_LATCH_PEEL:.*]], label %[[THEN_PEEL:.*]]
192+ ; CHECK: [[THEN_PEEL]]:
193+ ; CHECK-NEXT: call void @foo(i32 1)
194+ ; CHECK-NEXT: br label %[[INNER_LATCH_PEEL]]
195+ ; CHECK: [[INNER_LATCH_PEEL]]:
196+ ; CHECK-NEXT: [[IV_NEXT:%.*]] = add i32 [[IV]], 1
197+ ; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]]
198+ ; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[OUTER_HEADER_LOOPEXIT_PEEL_NEXT:.*]], label %[[OUTER_HEADER_LOOPEXIT_PEEL_NEXT]]
199+ ; CHECK: [[OUTER_HEADER_LOOPEXIT_PEEL_NEXT]]:
200+ ; CHECK-NEXT: br label %[[INNER_HEADER_PEEL_NEXT:.*]]
201+ ; CHECK: [[INNER_HEADER_PEEL_NEXT]]:
202+ ; CHECK-NEXT: br label %[[OUTER_HEADER_LOOPEXIT:.*]]
203+ ; CHECK: [[OUTER_HEADER_LOOPEXIT]]:
164204; CHECK-NEXT: br label %[[OUTER_HEADER]]
165205; CHECK: [[OUTER_HEADER]]:
206+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[SUB]], 0
207+ ; CHECK-NEXT: br i1 [[TMP1]], label %[[OUTER_HEADER_SPLIT:.*]], label %[[OUTER_HEADER_LOOPEXIT_PEEL_BEGIN]]
208+ ; CHECK: [[OUTER_HEADER_SPLIT]]:
166209; CHECK-NEXT: br label %[[INNER_HEADER:.*]]
167210; CHECK: [[INNER_HEADER]]:
168- ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[OUTER_HEADER]] ], [ [[IV_NEXT:%.*]], %[[INNER_LATCH:.*]] ]
169- ; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[IV]], [[SUB]]
170- ; CHECK-NEXT: br i1 [[C]], label %[[INNER_LATCH]], label %[[THEN:.*]]
211+ ; CHECK-NEXT: [[IV1:%.*]] = phi i32 [ 0, %[[OUTER_HEADER_SPLIT]] ], [ [[IV_NEXT1]], %[[INNER_LATCH]] ]
212+ ; CHECK-NEXT: br i1 false, label %[[INNER_LATCH]], label %[[THEN:.*]]
171213; CHECK: [[THEN]]:
172214; CHECK-NEXT: call void @foo(i32 1)
173215; CHECK-NEXT: br label %[[INNER_LATCH]]
174216; CHECK: [[INNER_LATCH]]:
175- ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
176- ; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV_NEXT]], [[N]]
177- ; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[OUTER_HEADER_LOOPEXIT]], label %[[INNER_HEADER]]
217+ ; CHECK-NEXT: [[IV_NEXT1]] = add nuw i32 [[IV1]], 1
218+ ; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[N]], 1
219+ ; CHECK-NEXT: [[EXITCOND_NOT1:%.*]] = icmp eq i32 [[IV_NEXT1]], [[TMP2]]
220+ ; CHECK-NEXT: br i1 [[EXITCOND_NOT1]], label %[[OUTER_HEADER_LOOPEXIT_PEEL_BEGIN_LOOPEXIT]], label %[[INNER_HEADER]], !llvm.loop [[LOOP2:![0-9]+]]
178221;
179222entry:
180223 %sub = add i32 %n , -1
@@ -197,3 +240,8 @@ inner.latch:
197240 %exitcond.not = icmp eq i32 %iv.next , %n
198241 br i1 %exitcond.not , label %outer.header , label %inner.header
199242}
243+ ;.
244+ ; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]]}
245+ ; CHECK: [[META1]] = !{!"llvm.loop.peeled.count", i32 1}
246+ ; CHECK: [[LOOP2]] = distinct !{[[LOOP2]], [[META1]]}
247+ ;.
0 commit comments