235 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes='lower-switch,unify-loop-exits' -S | FileCheck %s3 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 [[Y:%.*]]22; CHECK: exit:23; CHECK-NEXT: ret void24; CHECK: loop.exit.guard:25; CHECK-NEXT: [[GUARD_X:%.*]] = phi i1 [ true, [[B]] ], [ false, [[C]] ], [ false, [[D]] ]26; CHECK-NEXT: br i1 [[GUARD_X]], label [[X:%.*]], label [[Y]]27;28entry:29 br i1 %PredEntry, label %A, label %G30 31A:32 br label %B33 34B:35 br i1 %PredB, label %C, label %E36 37C:38 br i1 %PredC, label %D, label %F39 40D:41 br i1 %PredD, label %A, label %F42 43E:44 br label %exit45 46F:47 br label %exit48 49G:50 br label %F51 52exit:53 ret void54}55 56define void @loop_1_callbr(i1 %PredEntry, i1 %PredB, i1 %PredC, i1 %PredD) {57; CHECK-LABEL: @loop_1_callbr(58; CHECK-NEXT: entry:59; CHECK-NEXT: br i1 [[PREDENTRY:%.*]], label [[A:%.*]], label [[G:%.*]]60; CHECK: A:61; CHECK-NEXT: br label [[B:%.*]]62; CHECK: B:63; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PREDB:%.*]])64; CHECK-NEXT: to label [[C:%.*]] [label %B.target.E]65; CHECK: C:66; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PREDC:%.*]])67; CHECK-NEXT: to label [[D:%.*]] [label %C.target.F]68; CHECK: D:69; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PREDD:%.*]])70; CHECK-NEXT: to label [[A]] [label %D.target.F]71; CHECK: E:72; CHECK-NEXT: br label [[EXIT:%.*]]73; CHECK: F:74; CHECK-NEXT: br label [[EXIT]]75; CHECK: G:76; CHECK-NEXT: br label [[Y:%.*]]77; CHECK: exit:78; CHECK-NEXT: ret void79; CHECK: B.target.E:80; CHECK-NEXT: br label [[LOOP_EXIT_GUARD:%.*]]81; CHECK: C.target.F:82; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]83; CHECK: D.target.F:84; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]85; CHECK: loop.exit.guard:86; CHECK-NEXT: [[GUARD_X:%.*]] = phi i1 [ true, [[B_TARGET_E:%.*]] ], [ false, [[C_TARGET_F:%.*]] ], [ false, [[D_TARGET_F:%.*]] ]87; CHECK-NEXT: br i1 [[GUARD_X]], label [[X:%.*]], label [[Y]]88;89entry:90 br i1 %PredEntry, label %A, label %G91 92A:93 br label %B94 95B:96 callbr void asm "", "r,!i"(i1 %PredB) to label %C [label %E]97 98C:99 callbr void asm "", "r,!i"(i1 %PredC) to label %D [label %F]100 101D:102 callbr void asm "", "r,!i"(i1 %PredD) to label %A [label %F]103 104E:105 br label %exit106 107F:108 br label %exit109 110G:111 br label %F112 113exit:114 ret void115}116 117define void @loop_2(i1 %PredA, i1 %PredB, i1 %PredC) {118; CHECK-LABEL: @loop_2(119; CHECK-NEXT: entry:120; CHECK-NEXT: br label [[A:%.*]]121; CHECK: A:122; CHECK-NEXT: br i1 [[PREDA:%.*]], label [[B:%.*]], label [[LOOP_EXIT_GUARD:%.*]]123; CHECK: B:124; CHECK-NEXT: br i1 [[PREDB:%.*]], label [[C:%.*]], label [[LOOP_EXIT_GUARD]]125; CHECK: C:126; CHECK-NEXT: br i1 [[PREDC:%.*]], label [[D:%.*]], label [[LOOP_EXIT_GUARD]]127; CHECK: D:128; CHECK-NEXT: br label [[A]]129; CHECK: X:130; CHECK-NEXT: br label [[EXIT:%.*]]131; CHECK: Y:132; CHECK-NEXT: br label [[EXIT]]133; CHECK: Z:134; CHECK-NEXT: br label [[EXIT]]135; CHECK: exit:136; CHECK-NEXT: ret void137; CHECK: loop.exit.guard:138; CHECK-NEXT: [[GUARD_X:%.*]] = phi i1 [ true, [[A]] ], [ false, [[B]] ], [ false, [[C]] ]139; CHECK-NEXT: [[GUARD_Y:%.*]] = phi i1 [ false, [[A]] ], [ true, [[B]] ], [ false, [[C]] ]140; CHECK-NEXT: br i1 [[GUARD_X]], label [[X:%.*]], label [[LOOP_EXIT_GUARD1:%.*]]141; CHECK: loop.exit.guard1:142; CHECK-NEXT: br i1 [[GUARD_Y]], label [[Y:%.*]], label [[Z:%.*]]143;144entry:145 br label %A146 147A:148 br i1 %PredA, label %B, label %X149 150B:151 br i1 %PredB, label %C, label %Y152 153C:154 br i1 %PredC, label %D, label %Z155 156D:157 br label %A158 159X:160 br label %exit161 162Y:163 br label %exit164 165Z:166 br label %exit167 168exit:169 ret void170}171 172define void @loop_2_callbr(i1 %PredA, i1 %PredB, i1 %PredC) {173; CHECK-LABEL: @loop_2_callbr(174; CHECK-NEXT: entry:175; CHECK-NEXT: br label [[A:%.*]]176; CHECK: A:177; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PREDA:%.*]])178; CHECK-NEXT: to label [[B:%.*]] [label %A.target.X]179; CHECK: B:180; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PREDB:%.*]])181; CHECK-NEXT: to label [[C:%.*]] [label %B.target.Y]182; CHECK: C:183; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PREDC:%.*]])184; CHECK-NEXT: to label [[D:%.*]] [label %C.target.Z]185; CHECK: D:186; CHECK-NEXT: br label [[A]]187; CHECK: X:188; CHECK-NEXT: br label [[EXIT:%.*]]189; CHECK: Y:190; CHECK-NEXT: br label [[EXIT]]191; CHECK: Z:192; CHECK-NEXT: br label [[EXIT]]193; CHECK: exit:194; CHECK-NEXT: ret void195; CHECK: A.target.X:196; CHECK-NEXT: br label [[LOOP_EXIT_GUARD:%.*]]197; CHECK: B.target.Y:198; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]199; CHECK: C.target.Z:200; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]201; CHECK: loop.exit.guard:202; CHECK-NEXT: [[GUARD_X:%.*]] = phi i1 [ true, [[A_TARGET_X:%.*]] ], [ false, [[B_TARGET_Y:%.*]] ], [ false, [[C_TARGET_Z:%.*]] ]203; CHECK-NEXT: [[GUARD_Y:%.*]] = phi i1 [ false, [[A_TARGET_X]] ], [ true, [[B_TARGET_Y]] ], [ false, [[C_TARGET_Z]] ]204; CHECK-NEXT: br i1 [[GUARD_X]], label [[X:%.*]], label [[LOOP_EXIT_GUARD1:%.*]]205; CHECK: loop.exit.guard1:206; CHECK-NEXT: br i1 [[GUARD_Y]], label [[Y:%.*]], label [[Z:%.*]]207;208entry:209 br label %A210 211A:212 callbr void asm "", "r,!i"(i1 %PredA) to label %B [label %X]213 214B:215 callbr void asm "", "r,!i"(i1 %PredB) to label %C [label %Y]216 217C:218 callbr void asm "", "r,!i"(i1 %PredC) to label %D [label %Z]219 220D:221 br label %A222 223X:224 br label %exit225 226Y:227 br label %exit228 229Z:230 br label %exit231 232exit:233 ret void234}235