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