@@ -193,28 +193,56 @@ unreachable.exit:
193
193
define void @peel_exits_to_blocks_branch_to_unreachable_block (i32* %ptr , i32 %N , i32 %x , i1 %c.1 ) {
194
194
; CHECK-LABEL: @peel_exits_to_blocks_branch_to_unreachable_block(
195
195
; CHECK-NEXT: entry:
196
+ ; CHECK-NEXT: br label [[LOOP_HEADER_PEEL_BEGIN:%.*]]
197
+ ; CHECK: loop.header.peel.begin:
198
+ ; CHECK-NEXT: br label [[LOOP_HEADER_PEEL:%.*]]
199
+ ; CHECK: loop.header.peel:
200
+ ; CHECK-NEXT: [[C_PEEL:%.*]] = icmp ult i32 1, 2
201
+ ; CHECK-NEXT: br i1 [[C_PEEL]], label [[THEN_PEEL:%.*]], label [[ELSE_PEEL:%.*]]
202
+ ; CHECK: else.peel:
203
+ ; CHECK-NEXT: [[C_2_PEEL:%.*]] = icmp eq i32 1, [[X:%.*]]
204
+ ; CHECK-NEXT: br i1 [[C_2_PEEL]], label [[EXIT_2:%.*]], label [[LOOP_LATCH_PEEL:%.*]]
205
+ ; CHECK: then.peel:
206
+ ; CHECK-NEXT: br i1 [[C_1:%.*]], label [[EXIT_1:%.*]], label [[LOOP_LATCH_PEEL]]
207
+ ; CHECK: loop.latch.peel:
208
+ ; CHECK-NEXT: [[M_PEEL:%.*]] = phi i32 [ 0, [[THEN_PEEL]] ], [ [[X]], [[ELSE_PEEL]] ]
209
+ ; CHECK-NEXT: [[GEP_PEEL:%.*]] = getelementptr i32, i32* [[PTR:%.*]], i32 1
210
+ ; CHECK-NEXT: store i32 [[M_PEEL]], i32* [[GEP_PEEL]], align 4
211
+ ; CHECK-NEXT: [[IV_NEXT_PEEL:%.*]] = add nuw nsw i32 1, 1
212
+ ; CHECK-NEXT: [[C_3_PEEL:%.*]] = icmp ult i32 1, 1000
213
+ ; CHECK-NEXT: br i1 [[C_3_PEEL]], label [[LOOP_HEADER_PEEL_NEXT:%.*]], label [[EXIT:%.*]]
214
+ ; CHECK: loop.header.peel.next:
215
+ ; CHECK-NEXT: br label [[LOOP_HEADER_PEEL_NEXT1:%.*]]
216
+ ; CHECK: loop.header.peel.next1:
217
+ ; CHECK-NEXT: br label [[ENTRY_PEEL_NEWPH:%.*]]
218
+ ; CHECK: entry.peel.newph:
196
219
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
197
220
; CHECK: loop.header:
198
- ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
199
- ; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], 2
200
- ; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
221
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT_PEEL]], [[ENTRY_PEEL_NEWPH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
222
+ ; CHECK-NEXT: br i1 false, label [[THEN:%.*]], label [[ELSE:%.*]]
201
223
; CHECK: then:
202
- ; CHECK-NEXT: br i1 [[C_1:%.* ]], label [[EXIT_1 :%.*]], label [[LOOP_LATCH]]
224
+ ; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1_LOOPEXIT :%.*]], label [[LOOP_LATCH]]
203
225
; CHECK: else:
204
- ; CHECK-NEXT: [[C_2:%.*]] = icmp eq i32 [[IV]], [[X:%.* ]]
205
- ; CHECK-NEXT: br i1 [[C_2]], label [[EXIT_2 :%.*]], label [[LOOP_LATCH]]
226
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp eq i32 [[IV]], [[X]]
227
+ ; CHECK-NEXT: br i1 [[C_2]], label [[EXIT_2_LOOPEXIT :%.*]], label [[LOOP_LATCH]]
206
228
; CHECK: loop.latch:
207
229
; CHECK-NEXT: [[M:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[X]], [[ELSE]] ]
208
- ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, i32* [[PTR:%.* ]], i32 [[IV]]
230
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, i32* [[PTR]], i32 [[IV]]
209
231
; CHECK-NEXT: store i32 [[M]], i32* [[GEP]], align 4
210
232
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
211
233
; CHECK-NEXT: [[C_3:%.*]] = icmp ult i32 [[IV]], 1000
212
- ; CHECK-NEXT: br i1 [[C_3]], label [[LOOP_HEADER]], label [[EXIT:%.*]]
234
+ ; CHECK-NEXT: br i1 [[C_3]], label [[LOOP_HEADER]], label [[EXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP2:![0-9]+]]
235
+ ; CHECK: exit.loopexit:
236
+ ; CHECK-NEXT: br label [[EXIT]]
213
237
; CHECK: exit:
214
238
; CHECK-NEXT: ret void
239
+ ; CHECK: exit.1.loopexit:
240
+ ; CHECK-NEXT: br label [[EXIT_1]]
215
241
; CHECK: exit.1:
216
242
; CHECK-NEXT: call void @foo()
217
243
; CHECK-NEXT: br label [[UNREACHABLE_TERM:%.*]]
244
+ ; CHECK: exit.2.loopexit:
245
+ ; CHECK-NEXT: br label [[EXIT_2]]
218
246
; CHECK: exit.2:
219
247
; CHECK-NEXT: call void @bar()
220
248
; CHECK-NEXT: br label [[UNREACHABLE_TERM]]
0 commit comments