1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -unify-loop-exits -enable-new-pm=0 -S | FileCheck %s 3; RUN: opt < %s -passes='lowerswitch,unify-loop-exits' -S | FileCheck %s 4 5define void @loop_1(i1 %PredEntry, i1 %PredB, i1 %PredC, i1 %PredD) { 6; CHECK-LABEL: @loop_1( 7; CHECK-NEXT: entry: 8; CHECK-NEXT: br i1 [[PREDENTRY:%.*]], label [[A:%.*]], label [[G:%.*]] 9; CHECK: A: 10; CHECK-NEXT: br label [[B:%.*]] 11; CHECK: B: 12; CHECK-NEXT: br i1 [[PREDB:%.*]], label [[C:%.*]], label [[LOOP_EXIT_GUARD:%.*]] 13; CHECK: C: 14; CHECK-NEXT: br i1 [[PREDC:%.*]], label [[D:%.*]], label [[LOOP_EXIT_GUARD]] 15; CHECK: D: 16; CHECK-NEXT: br i1 [[PREDD:%.*]], label [[A]], label [[LOOP_EXIT_GUARD]] 17; CHECK: E: 18; CHECK-NEXT: br label [[EXIT:%.*]] 19; CHECK: F: 20; CHECK-NEXT: br label [[EXIT]] 21; CHECK: G: 22; CHECK-NEXT: br label [[F:%.*]] 23; CHECK: exit: 24; CHECK-NEXT: ret void 25; CHECK: loop.exit.guard: 26; CHECK-NEXT: [[GUARD_E:%.*]] = phi i1 [ true, [[B]] ], [ false, [[C]] ], [ false, [[D]] ] 27; CHECK-NEXT: br i1 [[GUARD_E]], label [[E:%.*]], label [[F]] 28; 29entry: 30 br i1 %PredEntry, label %A, label %G 31 32A: 33 br label %B 34 35B: 36 br i1 %PredB, label %C, label %E 37 38C: 39 br i1 %PredC, label %D, label %F 40 41D: 42 br i1 %PredD, label %A, label %F 43 44E: 45 br label %exit 46 47F: 48 br label %exit 49 50G: 51 br label %F 52 53exit: 54 ret void 55} 56 57define void @loop_2(i1 %PredA, i1 %PredB, i1 %PredC) { 58; CHECK-LABEL: @loop_2( 59; CHECK-NEXT: entry: 60; CHECK-NEXT: br label [[A:%.*]] 61; CHECK: A: 62; CHECK-NEXT: br i1 [[PREDA:%.*]], label [[B:%.*]], label [[LOOP_EXIT_GUARD:%.*]] 63; CHECK: B: 64; CHECK-NEXT: br i1 [[PREDB:%.*]], label [[C:%.*]], label [[LOOP_EXIT_GUARD]] 65; CHECK: C: 66; CHECK-NEXT: br i1 [[PREDC:%.*]], label [[D:%.*]], label [[LOOP_EXIT_GUARD]] 67; CHECK: D: 68; CHECK-NEXT: br label [[A]] 69; CHECK: X: 70; CHECK-NEXT: br label [[EXIT:%.*]] 71; CHECK: Y: 72; CHECK-NEXT: br label [[EXIT]] 73; CHECK: Z: 74; CHECK-NEXT: br label [[EXIT]] 75; CHECK: exit: 76; CHECK-NEXT: ret void 77; CHECK: loop.exit.guard: 78; CHECK-NEXT: [[GUARD_X:%.*]] = phi i1 [ true, [[A]] ], [ false, [[B]] ], [ false, [[C]] ] 79; CHECK-NEXT: [[GUARD_Y:%.*]] = phi i1 [ false, [[A]] ], [ true, [[B]] ], [ false, [[C]] ] 80; CHECK-NEXT: br i1 [[GUARD_X]], label [[X:%.*]], label [[LOOP_EXIT_GUARD1:%.*]] 81; CHECK: loop.exit.guard1: 82; CHECK-NEXT: br i1 [[GUARD_Y]], label [[Y:%.*]], label [[Z:%.*]] 83; 84entry: 85 br label %A 86 87A: 88 br i1 %PredA, label %B, label %X 89 90B: 91 br i1 %PredB, label %C, label %Y 92 93C: 94 br i1 %PredC, label %D, label %Z 95 96D: 97 br label %A 98 99X: 100 br label %exit 101 102Y: 103 br label %exit 104 105Z: 106 br label %exit 107 108exit: 109 ret void 110} 111