@@ -85,48 +85,28 @@ define i64 @peel_single_block_loop_iv_step_1_eq_pred() {
85
85
; CHECK-NEXT: [[ENTRY:.*]]:
86
86
; CHECK-NEXT: br label %[[LOOP:.*]]
87
87
; CHECK: [[LOOP]]:
88
- <<<<<<< HEAD
89
- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
90
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV]], 63
91
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 10, i32 20
92
- ; CHECK-NEXT: call void @foo(i32 [[COND]])
93
- ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
94
- ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 64
95
- ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
96
- ; CHECK: [[EXIT]]:
97
- ||||||| parent of 4da8bc5afc5b (!fixup address latest comments, thanks)
98
- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
99
- ; CHECK-NEXT: [[CMP18_NOT:%.*]] = icmp eq i64 [[IV]], 63
100
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP18_NOT]], i32 10, i32 20
101
- ; CHECK-NEXT: call void @foo(i32 [[COND]])
102
- ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
103
- ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 64
104
- ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
105
- ; CHECK: [[EXIT]]:
106
- =======
107
- ; CHECK-NEXT: [[IV1:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV:%.*]], %[[LOOP]] ]
88
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_LCSSA:%.*]], %[[LOOP]] ]
108
89
; CHECK-NEXT: call void @foo(i32 20)
109
- ; CHECK-NEXT: [[IV ]] = add nuw nsw i64 [[IV1 ]], 1
110
- ; CHECK-NEXT: [[CMP18_NOT :%.*]] = icmp eq i64 [[IV ]], 63
111
- ; CHECK-NEXT: br i1 [[CMP18_NOT ]], label %[[EXIT_PEEL_BEGIN:.*]], label %[[LOOP]], !llvm.loop [[LOOP2:![0-9]+]]
90
+ ; CHECK-NEXT: [[IV_LCSSA ]] = add nuw nsw i64 [[IV ]], 1
91
+ ; CHECK-NEXT: [[CMP_PEEL :%.*]] = icmp eq i64 [[IV_LCSSA ]], 63
92
+ ; CHECK-NEXT: br i1 [[CMP_PEEL ]], label %[[EXIT_PEEL_BEGIN:.*]], label %[[LOOP]], !llvm.loop [[LOOP2:![0-9]+]]
112
93
; CHECK: [[EXIT_PEEL_BEGIN]]:
113
- >>>>>>> 4da8bc5afc5b (!fixup address latest comments, thanks)
114
- ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[IV]], %[[LOOP]] ]
115
- ; CHECK-NEXT: [[IV_LCSSA1:%.*]] = phi i64 [ [[IV1]], %[[LOOP]] ]
94
+ ; CHECK-NEXT: [[IV_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_LCSSA]], %[[LOOP]] ]
95
+ ; CHECK-NEXT: [[IV_LCSSA1:%.*]] = phi i64 [ [[IV]], %[[LOOP]] ]
116
96
; CHECK-NEXT: br label %[[LOOP_PEEL:.*]]
117
97
; CHECK: [[LOOP_PEEL]]:
118
- ; CHECK-NEXT: [[CMP_PEEL :%.*]] = icmp eq i64 [[IV_LCSSA ]], 63
119
- ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP_PEEL ]], i32 10, i32 20
98
+ ; CHECK-NEXT: [[CMP_PEEL1 :%.*]] = icmp eq i64 [[IV_NEXT_LCSSA ]], 63
99
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP_PEEL1 ]], i32 10, i32 20
120
100
; CHECK-NEXT: call void @foo(i32 [[COND]])
121
- ; CHECK-NEXT: [[IV_NEXT:%.*]] = add i64 [[IV_LCSSA ]], 1
101
+ ; CHECK-NEXT: [[IV_NEXT:%.*]] = add i64 [[IV_NEXT_LCSSA ]], 1
122
102
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 64
123
103
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_PEEL_NEXT:.*]], label %[[EXIT_PEEL_NEXT]]
124
104
; CHECK: [[EXIT_PEEL_NEXT]]:
125
105
; CHECK-NEXT: br label %[[LOOP_PEEL_NEXT:.*]]
126
106
; CHECK: [[LOOP_PEEL_NEXT]]:
127
107
; CHECK-NEXT: br label %[[EXIT:.*]]
128
108
; CHECK: [[EXIT]]:
129
- ; CHECK-NEXT: ret i64 [[IV_LCSSA ]]
109
+ ; CHECK-NEXT: ret i64 [[IV_NEXT_LCSSA ]]
130
110
;
131
111
entry:
132
112
br label %loop
@@ -184,7 +164,35 @@ define i64 @peel_single_block_loop_iv_step_1_nested_loop() {
184
164
; CHECK-NEXT: [[OUTER_IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[OUTER_IV_NEXT:%.*]], %[[OUTER_LATCH:.*]] ]
185
165
; CHECK-NEXT: br label %[[LOOP:.*]]
186
166
; CHECK: [[LOOP]]:
187
- <<<;
167
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[OUTER_HEADER]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
168
+ ; CHECK-NEXT: call void @foo(i32 20)
169
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
170
+ ; CHECK-NEXT: [[EC:%.*]] = icmp ne i64 [[IV_NEXT]], 63
171
+ ; CHECK-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[OUTER_LATCH_PEEL_BEGIN:.*]], !llvm.loop [[LOOP3:![0-9]+]]
172
+ ; CHECK: [[OUTER_LATCH_PEEL_BEGIN]]:
173
+ ; CHECK-NEXT: [[IV_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_NEXT]], %[[LOOP]] ]
174
+ ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[IV]], %[[LOOP]] ]
175
+ ; CHECK-NEXT: br label %[[LOOP_PEEL:.*]]
176
+ ; CHECK: [[LOOP_PEEL]]:
177
+ ; CHECK-NEXT: [[CMP_PEEL:%.*]] = icmp eq i64 [[IV_NEXT_LCSSA]], 63
178
+ ; CHECK-NEXT: [[COND_PEEL:%.*]] = select i1 [[CMP_PEEL]], i32 10, i32 20
179
+ ; CHECK-NEXT: call void @foo(i32 [[COND_PEEL]])
180
+ ; CHECK-NEXT: [[IV_NEXT_PEEL:%.*]] = add i64 [[IV_NEXT_LCSSA]], 1
181
+ ; CHECK-NEXT: [[EC_PEEL:%.*]] = icmp ne i64 [[IV_NEXT_PEEL]], 64
182
+ ; CHECK-NEXT: br i1 [[EC_PEEL]], label %[[OUTER_LATCH_PEEL_NEXT:.*]], label %[[OUTER_LATCH_PEEL_NEXT]]
183
+ ; CHECK: [[OUTER_LATCH_PEEL_NEXT]]:
184
+ ; CHECK-NEXT: br label %[[LOOP_PEEL_NEXT:.*]]
185
+ ; CHECK: [[LOOP_PEEL_NEXT]]:
186
+ ; CHECK-NEXT: br label %[[OUTER_LATCH]]
187
+ ; CHECK: [[OUTER_LATCH]]:
188
+ ; CHECK-NEXT: call void @foo(i32 1)
189
+ ; CHECK-NEXT: [[OUTER_IV_NEXT]] = add i64 [[OUTER_IV]], 1
190
+ ; CHECK-NEXT: [[OUTER_EC:%.*]] = icmp ne i64 [[OUTER_IV_NEXT]], 100
191
+ ; CHECK-NEXT: br i1 [[OUTER_EC]], label %[[EXIT:.*]], label %[[OUTER_HEADER]]
192
+ ; CHECK: [[EXIT]]:
193
+ ; CHECK-NEXT: [[IV_LCSSA_LCSSA:%.*]] = phi i64 [ [[IV_NEXT_LCSSA]], %[[OUTER_LATCH]] ]
194
+ ; CHECK-NEXT: ret i64 [[IV_LCSSA_LCSSA]]
195
+ ;
188
196
entry:
189
197
br label %outer.header
190
198
@@ -216,6 +224,40 @@ define i64 @peel_multi_block_loop_iv_step_1() {
216
224
; CHECK-NEXT: [[ENTRY:.*]]:
217
225
; CHECK-NEXT: br label %[[LOOP:.*]]
218
226
; CHECK: [[LOOP]]:
227
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LATCH:.*]] ]
228
+ ; CHECK-NEXT: call void @foo(i32 20)
229
+ ; CHECK-NEXT: [[C:%.*]] = call i1 @cond()
230
+ ; CHECK-NEXT: br i1 [[C]], label %[[THEN:.*]], label %[[LATCH]]
231
+ ; CHECK: [[THEN]]:
232
+ ; CHECK-NEXT: call void @foo(i32 20)
233
+ ; CHECK-NEXT: br label %[[LATCH]]
234
+ ; CHECK: [[LATCH]]:
235
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
236
+ ; CHECK-NEXT: [[EC:%.*]] = icmp ne i64 [[IV_NEXT]], 63
237
+ ; CHECK-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT_PEEL_BEGIN:.*]], !llvm.loop [[LOOP4:![0-9]+]]
238
+ ; CHECK: [[EXIT_PEEL_BEGIN]]:
239
+ ; CHECK-NEXT: [[IV_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_NEXT]], %[[LATCH]] ]
240
+ ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[IV]], %[[LATCH]] ]
241
+ ; CHECK-NEXT: br label %[[LOOP_PEEL:.*]]
242
+ ; CHECK: [[LOOP_PEEL]]:
243
+ ; CHECK-NEXT: [[CMP_PEEL:%.*]] = icmp eq i64 [[IV_NEXT_LCSSA]], 63
244
+ ; CHECK-NEXT: [[COND_PEEL:%.*]] = select i1 [[CMP_PEEL]], i32 10, i32 20
245
+ ; CHECK-NEXT: call void @foo(i32 [[COND_PEEL]])
246
+ ; CHECK-NEXT: [[C_PEEL:%.*]] = call i1 @cond()
247
+ ; CHECK-NEXT: br i1 [[C_PEEL]], label %[[THEN_PEEL:.*]], label %[[LATCH_PEEL:.*]]
248
+ ; CHECK: [[THEN_PEEL]]:
249
+ ; CHECK-NEXT: call void @foo(i32 [[COND_PEEL]])
250
+ ; CHECK-NEXT: br label %[[LATCH_PEEL]]
251
+ ; CHECK: [[LATCH_PEEL]]:
252
+ ; CHECK-NEXT: [[IV_NEXT_PEEL:%.*]] = add i64 [[IV_NEXT_LCSSA]], 1
253
+ ; CHECK-NEXT: [[EC_PEEL:%.*]] = icmp ne i64 [[IV_NEXT_PEEL]], 64
254
+ ; CHECK-NEXT: br i1 [[EC_PEEL]], label %[[EXIT_PEEL_NEXT:.*]], label %[[EXIT_PEEL_NEXT]]
255
+ ; CHECK: [[EXIT_PEEL_NEXT]]:
256
+ ; CHECK-NEXT: br label %[[LOOP_PEEL_NEXT:.*]]
257
+ ; CHECK: [[LOOP_PEEL_NEXT]]:
258
+ ; CHECK-NEXT: br label %[[EXIT:.*]]
259
+ ; CHECK: [[EXIT]]:
260
+ ; CHECK-NEXT: ret i64 [[IV_NEXT_LCSSA]]
219
261
;
220
262
entry:
221
263
br label %loop
@@ -317,16 +359,27 @@ define i64 @peel_single_block_loop_iv_step_1_btc_1() {
317
359
; CHECK-NEXT: [[ENTRY:.*]]:
318
360
; CHECK-NEXT: br label %[[LOOP:.*]]
319
361
; CHECK: [[LOOP]]:
320
- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
362
+ ; CHECK-NEXT: [[IV1:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT1:%.*]], %[[LOOP]] ]
363
+ ; CHECK-NEXT: call void @foo(i32 20)
364
+ ; CHECK-NEXT: [[IV_NEXT1]] = add nuw nsw i64 [[IV1]], 1
365
+ ; CHECK-NEXT: br i1 false, label %[[LOOP]], label %[[EXIT_PEEL_BEGIN:.*]], !llvm.loop [[LOOP5:![0-9]+]]
366
+ ; CHECK: [[EXIT_PEEL_BEGIN]]:
367
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT1]], %[[LOOP]] ]
368
+ ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[IV1]], %[[LOOP]] ]
369
+ ; CHECK-NEXT: br label %[[LOOP_PEEL:.*]]
370
+ ; CHECK: [[LOOP_PEEL]]:
321
371
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV]], 1
322
372
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 10, i32 20
323
373
; CHECK-NEXT: call void @foo(i32 [[COND]])
324
- ; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
374
+ ; CHECK-NEXT: [[IV_NEXT:%.* ]] = add i64 [[IV]], 1
325
375
; CHECK-NEXT: [[EC:%.*]] = icmp ne i64 [[IV_NEXT]], 2
326
- ; CHECK-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT:.*]]
376
+ ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT_PEEL_NEXT:.*]], label %[[EXIT_PEEL_NEXT]]
377
+ ; CHECK: [[EXIT_PEEL_NEXT]]:
378
+ ; CHECK-NEXT: br label %[[LOOP_PEEL_NEXT:.*]]
379
+ ; CHECK: [[LOOP_PEEL_NEXT]]:
380
+ ; CHECK-NEXT: br label %[[EXIT:.*]]
327
381
; CHECK: [[EXIT]]:
328
- ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i64 [ [[IV]], %[[LOOP]] ]
329
- ; CHECK-NEXT: ret i64 [[IV_LCSSA]]
382
+ ; CHECK-NEXT: ret i64 [[IV]]
330
383
;
331
384
entry:
332
385
br label %loop
@@ -467,7 +520,7 @@ define i32 @peel_loop_with_branch_and_phi_uses(ptr %x, i1 %c) {
467
520
; CHECK-NEXT: [[ADD1]] = add nsw i32 [[L1]], [[RED1]]
468
521
; CHECK-NEXT: [[IV_NEXT1]] = add nuw nsw i32 [[IV1]], 1
469
522
; CHECK-NEXT: [[EC1:%.*]] = icmp ne i32 [[IV_NEXT1]], 99
470
- ; CHECK-NEXT: br i1 [[EC1]], label %[[LOOP_HEADER]], label %[[LOOPEXIT_PEEL_BEGIN:.*]], !llvm.loop [[LOOP5 :![0-9]+]]
523
+ ; CHECK-NEXT: br i1 [[EC1]], label %[[LOOP_HEADER]], label %[[LOOPEXIT_PEEL_BEGIN:.*]], !llvm.loop [[LOOP6 :![0-9]+]]
471
524
; CHECK: [[LOOPEXIT_PEEL_BEGIN]]:
472
525
; CHECK-NEXT: [[RED:%.*]] = phi i32 [ [[ADD1]], %[[LOOP_LATCH]] ]
473
526
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT1]], %[[LOOP_LATCH]] ]
@@ -584,3 +637,12 @@ exit:
584
637
585
638
declare void @foo (i32 )
586
639
declare i1 @cond ()
640
+ ;.
641
+ ; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]]}
642
+ ; CHECK: [[META1]] = !{!"llvm.loop.peeled.count", i32 1}
643
+ ; CHECK: [[LOOP2]] = distinct !{[[LOOP2]], [[META1]]}
644
+ ; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]]}
645
+ ; CHECK: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]]}
646
+ ; CHECK: [[LOOP5]] = distinct !{[[LOOP5]], [[META1]]}
647
+ ; CHECK: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]]}
648
+ ;.
0 commit comments