@@ -221,6 +221,220 @@ exit:
221221}
222222
223223define void @many_exits ([100 x i64 ] %len ) {
224+ ; CHECK-LABEL: @many_exits(
225+ ; CHECK-NEXT: entry:
226+ ; CHECK-NEXT: [[LEN1:%.*]] = extractvalue [100 x i64] [[LEN:%.*]], 1
227+ ; CHECK-NEXT: [[LEN2:%.*]] = extractvalue [100 x i64] [[LEN]], 2
228+ ; CHECK-NEXT: [[LEN3:%.*]] = extractvalue [100 x i64] [[LEN]], 3
229+ ; CHECK-NEXT: [[LEN4:%.*]] = extractvalue [100 x i64] [[LEN]], 4
230+ ; CHECK-NEXT: [[LEN5:%.*]] = extractvalue [100 x i64] [[LEN]], 5
231+ ; CHECK-NEXT: [[LEN6:%.*]] = extractvalue [100 x i64] [[LEN]], 6
232+ ; CHECK-NEXT: [[LEN7:%.*]] = extractvalue [100 x i64] [[LEN]], 7
233+ ; CHECK-NEXT: [[LEN8:%.*]] = extractvalue [100 x i64] [[LEN]], 8
234+ ; CHECK-NEXT: [[LEN9:%.*]] = extractvalue [100 x i64] [[LEN]], 9
235+ ; CHECK-NEXT: [[LEN10:%.*]] = extractvalue [100 x i64] [[LEN]], 10
236+ ; CHECK-NEXT: [[LEN11:%.*]] = extractvalue [100 x i64] [[LEN]], 11
237+ ; CHECK-NEXT: [[LEN12:%.*]] = extractvalue [100 x i64] [[LEN]], 12
238+ ; CHECK-NEXT: [[LEN13:%.*]] = extractvalue [100 x i64] [[LEN]], 13
239+ ; CHECK-NEXT: [[LEN14:%.*]] = extractvalue [100 x i64] [[LEN]], 14
240+ ; CHECK-NEXT: [[LEN15:%.*]] = extractvalue [100 x i64] [[LEN]], 15
241+ ; CHECK-NEXT: [[LEN16:%.*]] = extractvalue [100 x i64] [[LEN]], 16
242+ ; CHECK-NEXT: [[LEN17:%.*]] = extractvalue [100 x i64] [[LEN]], 17
243+ ; CHECK-NEXT: [[LEN18:%.*]] = extractvalue [100 x i64] [[LEN]], 18
244+ ; CHECK-NEXT: [[LEN19:%.*]] = extractvalue [100 x i64] [[LEN]], 19
245+ ; CHECK-NEXT: [[LEN20:%.*]] = extractvalue [100 x i64] [[LEN]], 20
246+ ; CHECK-NEXT: [[LEN21:%.*]] = extractvalue [100 x i64] [[LEN]], 21
247+ ; CHECK-NEXT: [[LEN22:%.*]] = extractvalue [100 x i64] [[LEN]], 22
248+ ; CHECK-NEXT: [[LEN23:%.*]] = extractvalue [100 x i64] [[LEN]], 23
249+ ; CHECK-NEXT: [[LEN24:%.*]] = extractvalue [100 x i64] [[LEN]], 24
250+ ; CHECK-NEXT: [[LEN25:%.*]] = extractvalue [100 x i64] [[LEN]], 25
251+ ; CHECK-NEXT: [[LEN26:%.*]] = extractvalue [100 x i64] [[LEN]], 26
252+ ; CHECK-NEXT: [[LEN27:%.*]] = extractvalue [100 x i64] [[LEN]], 27
253+ ; CHECK-NEXT: [[LEN28:%.*]] = extractvalue [100 x i64] [[LEN]], 28
254+ ; CHECK-NEXT: [[LEN29:%.*]] = extractvalue [100 x i64] [[LEN]], 29
255+ ; CHECK-NEXT: [[LEN30:%.*]] = extractvalue [100 x i64] [[LEN]], 30
256+ ; CHECK-NEXT: [[LEN31:%.*]] = extractvalue [100 x i64] [[LEN]], 31
257+ ; CHECK-NEXT: [[LEN32:%.*]] = extractvalue [100 x i64] [[LEN]], 32
258+ ; CHECK-NEXT: [[LEN33:%.*]] = extractvalue [100 x i64] [[LEN]], 33
259+ ; CHECK-NEXT: [[LEN34:%.*]] = extractvalue [100 x i64] [[LEN]], 34
260+ ; CHECK-NEXT: [[LEN35:%.*]] = extractvalue [100 x i64] [[LEN]], 35
261+ ; CHECK-NEXT: [[LEN36:%.*]] = extractvalue [100 x i64] [[LEN]], 36
262+ ; CHECK-NEXT: [[LEN37:%.*]] = extractvalue [100 x i64] [[LEN]], 37
263+ ; CHECK-NEXT: [[LEN38:%.*]] = extractvalue [100 x i64] [[LEN]], 38
264+ ; CHECK-NEXT: [[LEN39:%.*]] = extractvalue [100 x i64] [[LEN]], 39
265+ ; CHECK-NEXT: br label [[LOOP:%.*]]
266+ ; CHECK: loop:
267+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
268+ ; CHECK-NEXT: [[LEN0:%.*]] = extractvalue [100 x i64] [[LEN]], 0
269+ ; CHECK-NEXT: [[EARLY0:%.*]] = icmp eq i64 [[IV]], [[LEN0]]
270+ ; CHECK-NEXT: call void @side_effect()
271+ ; CHECK-NEXT: br i1 [[EARLY0]], label [[EXIT:%.*]], label [[CONT0:%.*]]
272+ ; CHECK: cont0:
273+ ; CHECK-NEXT: [[EARLY1:%.*]] = icmp eq i64 [[IV]], [[LEN1]]
274+ ; CHECK-NEXT: call void @side_effect()
275+ ; CHECK-NEXT: br i1 [[EARLY1]], label [[EXIT]], label [[CONT1:%.*]]
276+ ; CHECK: cont1:
277+ ; CHECK-NEXT: [[EARLY2:%.*]] = icmp eq i64 [[IV]], [[LEN2]]
278+ ; CHECK-NEXT: call void @side_effect()
279+ ; CHECK-NEXT: br i1 [[EARLY2]], label [[EXIT]], label [[CONT2:%.*]]
280+ ; CHECK: cont2:
281+ ; CHECK-NEXT: [[EARLY3:%.*]] = icmp eq i64 [[IV]], [[LEN3]]
282+ ; CHECK-NEXT: call void @side_effect()
283+ ; CHECK-NEXT: br i1 [[EARLY3]], label [[EXIT]], label [[CONT3:%.*]]
284+ ; CHECK: cont3:
285+ ; CHECK-NEXT: [[EARLY4:%.*]] = icmp eq i64 [[IV]], [[LEN4]]
286+ ; CHECK-NEXT: call void @side_effect()
287+ ; CHECK-NEXT: br i1 [[EARLY4]], label [[EXIT]], label [[CONT4:%.*]]
288+ ; CHECK: cont4:
289+ ; CHECK-NEXT: [[EARLY5:%.*]] = icmp eq i64 [[IV]], [[LEN5]]
290+ ; CHECK-NEXT: call void @side_effect()
291+ ; CHECK-NEXT: br i1 [[EARLY5]], label [[EXIT]], label [[CONT5:%.*]]
292+ ; CHECK: cont5:
293+ ; CHECK-NEXT: [[EARLY6:%.*]] = icmp eq i64 [[IV]], [[LEN6]]
294+ ; CHECK-NEXT: call void @side_effect()
295+ ; CHECK-NEXT: br i1 [[EARLY6]], label [[EXIT]], label [[CONT6:%.*]]
296+ ; CHECK: cont6:
297+ ; CHECK-NEXT: [[EARLY7:%.*]] = icmp eq i64 [[IV]], [[LEN7]]
298+ ; CHECK-NEXT: call void @side_effect()
299+ ; CHECK-NEXT: br i1 [[EARLY7]], label [[EXIT]], label [[CONT7:%.*]]
300+ ; CHECK: cont7:
301+ ; CHECK-NEXT: [[EARLY8:%.*]] = icmp eq i64 [[IV]], [[LEN8]]
302+ ; CHECK-NEXT: call void @side_effect()
303+ ; CHECK-NEXT: br i1 [[EARLY8]], label [[EXIT]], label [[CONT8:%.*]]
304+ ; CHECK: cont8:
305+ ; CHECK-NEXT: [[EARLY9:%.*]] = icmp eq i64 [[IV]], [[LEN9]]
306+ ; CHECK-NEXT: call void @side_effect()
307+ ; CHECK-NEXT: br i1 [[EARLY9]], label [[EXIT]], label [[CONT9:%.*]]
308+ ; CHECK: cont9:
309+ ; CHECK-NEXT: [[EARLY10:%.*]] = icmp eq i64 [[IV]], [[LEN10]]
310+ ; CHECK-NEXT: call void @side_effect()
311+ ; CHECK-NEXT: br i1 [[EARLY10]], label [[EXIT]], label [[CONT10:%.*]]
312+ ; CHECK: cont10:
313+ ; CHECK-NEXT: [[EARLY11:%.*]] = icmp eq i64 [[IV]], [[LEN11]]
314+ ; CHECK-NEXT: call void @side_effect()
315+ ; CHECK-NEXT: br i1 [[EARLY11]], label [[EXIT]], label [[CONT11:%.*]]
316+ ; CHECK: cont11:
317+ ; CHECK-NEXT: [[EARLY12:%.*]] = icmp eq i64 [[IV]], [[LEN12]]
318+ ; CHECK-NEXT: call void @side_effect()
319+ ; CHECK-NEXT: br i1 [[EARLY12]], label [[EXIT]], label [[CONT12:%.*]]
320+ ; CHECK: cont12:
321+ ; CHECK-NEXT: [[EARLY13:%.*]] = icmp eq i64 [[IV]], [[LEN13]]
322+ ; CHECK-NEXT: call void @side_effect()
323+ ; CHECK-NEXT: br i1 [[EARLY13]], label [[EXIT]], label [[CONT13:%.*]]
324+ ; CHECK: cont13:
325+ ; CHECK-NEXT: [[EARLY14:%.*]] = icmp eq i64 [[IV]], [[LEN14]]
326+ ; CHECK-NEXT: call void @side_effect()
327+ ; CHECK-NEXT: br i1 [[EARLY14]], label [[EXIT]], label [[CONT14:%.*]]
328+ ; CHECK: cont14:
329+ ; CHECK-NEXT: [[EARLY15:%.*]] = icmp eq i64 [[IV]], [[LEN15]]
330+ ; CHECK-NEXT: call void @side_effect()
331+ ; CHECK-NEXT: br i1 [[EARLY15]], label [[EXIT]], label [[CONT15:%.*]]
332+ ; CHECK: cont15:
333+ ; CHECK-NEXT: [[EARLY16:%.*]] = icmp eq i64 [[IV]], [[LEN16]]
334+ ; CHECK-NEXT: call void @side_effect()
335+ ; CHECK-NEXT: br i1 [[EARLY16]], label [[EXIT]], label [[CONT16:%.*]]
336+ ; CHECK: cont16:
337+ ; CHECK-NEXT: [[EARLY17:%.*]] = icmp eq i64 [[IV]], [[LEN17]]
338+ ; CHECK-NEXT: call void @side_effect()
339+ ; CHECK-NEXT: br i1 [[EARLY17]], label [[EXIT]], label [[CONT17:%.*]]
340+ ; CHECK: cont17:
341+ ; CHECK-NEXT: [[EARLY18:%.*]] = icmp eq i64 [[IV]], [[LEN18]]
342+ ; CHECK-NEXT: call void @side_effect()
343+ ; CHECK-NEXT: br i1 [[EARLY18]], label [[EXIT]], label [[CONT18:%.*]]
344+ ; CHECK: cont18:
345+ ; CHECK-NEXT: [[EARLY19:%.*]] = icmp eq i64 [[IV]], [[LEN19]]
346+ ; CHECK-NEXT: call void @side_effect()
347+ ; CHECK-NEXT: br i1 [[EARLY19]], label [[EXIT]], label [[CONT19:%.*]]
348+ ; CHECK: cont19:
349+ ; CHECK-NEXT: [[EARLY20:%.*]] = icmp eq i64 [[IV]], [[LEN20]]
350+ ; CHECK-NEXT: call void @side_effect()
351+ ; CHECK-NEXT: br i1 [[EARLY20]], label [[EXIT]], label [[CONT20:%.*]]
352+ ; CHECK: cont20:
353+ ; CHECK-NEXT: [[EARLY21:%.*]] = icmp eq i64 [[IV]], [[LEN21]]
354+ ; CHECK-NEXT: call void @side_effect()
355+ ; CHECK-NEXT: br i1 [[EARLY21]], label [[EXIT]], label [[CONT21:%.*]]
356+ ; CHECK: cont21:
357+ ; CHECK-NEXT: [[EARLY22:%.*]] = icmp eq i64 [[IV]], [[LEN22]]
358+ ; CHECK-NEXT: call void @side_effect()
359+ ; CHECK-NEXT: br i1 [[EARLY22]], label [[EXIT]], label [[CONT22:%.*]]
360+ ; CHECK: cont22:
361+ ; CHECK-NEXT: [[EARLY23:%.*]] = icmp eq i64 [[IV]], [[LEN23]]
362+ ; CHECK-NEXT: call void @side_effect()
363+ ; CHECK-NEXT: br i1 [[EARLY23]], label [[EXIT]], label [[CONT23:%.*]]
364+ ; CHECK: cont23:
365+ ; CHECK-NEXT: [[EARLY24:%.*]] = icmp eq i64 [[IV]], [[LEN24]]
366+ ; CHECK-NEXT: call void @side_effect()
367+ ; CHECK-NEXT: br i1 [[EARLY24]], label [[EXIT]], label [[CONT24:%.*]]
368+ ; CHECK: cont24:
369+ ; CHECK-NEXT: [[EARLY25:%.*]] = icmp eq i64 [[IV]], [[LEN25]]
370+ ; CHECK-NEXT: call void @side_effect()
371+ ; CHECK-NEXT: br i1 [[EARLY25]], label [[EXIT]], label [[CONT25:%.*]]
372+ ; CHECK: cont25:
373+ ; CHECK-NEXT: [[EARLY26:%.*]] = icmp eq i64 [[IV]], [[LEN26]]
374+ ; CHECK-NEXT: call void @side_effect()
375+ ; CHECK-NEXT: br i1 [[EARLY26]], label [[EXIT]], label [[CONT26:%.*]]
376+ ; CHECK: cont26:
377+ ; CHECK-NEXT: [[EARLY27:%.*]] = icmp eq i64 [[IV]], [[LEN27]]
378+ ; CHECK-NEXT: call void @side_effect()
379+ ; CHECK-NEXT: br i1 [[EARLY27]], label [[EXIT]], label [[CONT27:%.*]]
380+ ; CHECK: cont27:
381+ ; CHECK-NEXT: [[EARLY28:%.*]] = icmp eq i64 [[IV]], [[LEN28]]
382+ ; CHECK-NEXT: call void @side_effect()
383+ ; CHECK-NEXT: br i1 [[EARLY28]], label [[EXIT]], label [[CONT28:%.*]]
384+ ; CHECK: cont28:
385+ ; CHECK-NEXT: [[EARLY29:%.*]] = icmp eq i64 [[IV]], [[LEN29]]
386+ ; CHECK-NEXT: call void @side_effect()
387+ ; CHECK-NEXT: br i1 [[EARLY29]], label [[EXIT]], label [[CONT29:%.*]]
388+ ; CHECK: cont29:
389+ ; CHECK-NEXT: [[EARLY30:%.*]] = icmp eq i64 [[IV]], [[LEN30]]
390+ ; CHECK-NEXT: call void @side_effect()
391+ ; CHECK-NEXT: br i1 [[EARLY30]], label [[EXIT]], label [[CONT30:%.*]]
392+ ; CHECK: cont30:
393+ ; CHECK-NEXT: [[EARLY31:%.*]] = icmp eq i64 [[IV]], [[LEN31]]
394+ ; CHECK-NEXT: call void @side_effect()
395+ ; CHECK-NEXT: br i1 [[EARLY31]], label [[EXIT]], label [[CONT31:%.*]]
396+ ; CHECK: cont31:
397+ ; CHECK-NEXT: [[EARLY32:%.*]] = icmp eq i64 [[IV]], [[LEN32]]
398+ ; CHECK-NEXT: call void @side_effect()
399+ ; CHECK-NEXT: br i1 [[EARLY32]], label [[EXIT]], label [[CONT32:%.*]]
400+ ; CHECK: cont32:
401+ ; CHECK-NEXT: [[EARLY33:%.*]] = icmp eq i64 [[IV]], [[LEN33]]
402+ ; CHECK-NEXT: call void @side_effect()
403+ ; CHECK-NEXT: br i1 [[EARLY33]], label [[EXIT]], label [[CONT33:%.*]]
404+ ; CHECK: cont33:
405+ ; CHECK-NEXT: [[EARLY34:%.*]] = icmp eq i64 [[IV]], [[LEN34]]
406+ ; CHECK-NEXT: call void @side_effect()
407+ ; CHECK-NEXT: br i1 [[EARLY34]], label [[EXIT]], label [[CONT34:%.*]]
408+ ; CHECK: cont34:
409+ ; CHECK-NEXT: [[EARLY35:%.*]] = icmp eq i64 [[IV]], [[LEN35]]
410+ ; CHECK-NEXT: call void @side_effect()
411+ ; CHECK-NEXT: br i1 [[EARLY35]], label [[EXIT]], label [[CONT35:%.*]]
412+ ; CHECK: cont35:
413+ ; CHECK-NEXT: [[EARLY36:%.*]] = icmp eq i64 [[IV]], [[LEN36]]
414+ ; CHECK-NEXT: call void @side_effect()
415+ ; CHECK-NEXT: br i1 [[EARLY36]], label [[EXIT]], label [[CONT36:%.*]]
416+ ; CHECK: cont36:
417+ ; CHECK-NEXT: [[EARLY37:%.*]] = icmp eq i64 [[IV]], [[LEN37]]
418+ ; CHECK-NEXT: call void @side_effect()
419+ ; CHECK-NEXT: br i1 [[EARLY37]], label [[EXIT]], label [[CONT37:%.*]]
420+ ; CHECK: cont37:
421+ ; CHECK-NEXT: [[EARLY38:%.*]] = icmp eq i64 [[IV]], [[LEN38]]
422+ ; CHECK-NEXT: call void @side_effect()
423+ ; CHECK-NEXT: br i1 [[EARLY38]], label [[EXIT]], label [[CONT38:%.*]]
424+ ; CHECK: cont38:
425+ ; CHECK-NEXT: [[EARLY39:%.*]] = icmp eq i64 [[IV]], [[LEN39]]
426+ ; CHECK-NEXT: call void @side_effect()
427+ ; CHECK-NEXT: br i1 [[EARLY39]], label [[EXIT]], label [[CONT39:%.*]]
428+ ; CHECK: cont39:
429+ ; CHECK-NEXT: br label [[BACKEDGE]]
430+ ; CHECK: backedge:
431+ ; CHECK-NEXT: call void @side_effect()
432+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i64 [[IV]], 999
433+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
434+ ; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP]], label [[EXIT]]
435+ ; CHECK: exit:
436+ ; CHECK-NEXT: ret void
437+ ;
224438entry:
225439 br label %loop
226440loop:
0 commit comments