475 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 4; Loop consists of A and B:5; - A is the header6; - A and B are exiting blocks7; - C and return are exit blocks.8; Pattern: Value (%mytmp42) defined in exiting block (A) and used in9; exit block (return).10; The relevant code uses DT::dominates(Value,11; BasicBlock). This is misnamed because it actually checks12; strict dominance, causing the pattern to be miscompiled13; (the use receives an undef value).14define i32 @exiting-used-in-exit(ptr %arg1, ptr %arg2) local_unnamed_addr align 2 {15; CHECK-LABEL: @exiting-used-in-exit(16; CHECK-NEXT: entry:17; CHECK-NEXT: br label [[A:%.*]]18; CHECK: A:19; CHECK-NEXT: [[MYTMP42:%.*]] = load i32, ptr [[ARG1:%.*]], align 420; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[MYTMP42]], 021; CHECK-NEXT: br i1 [[CMP1]], label [[B:%.*]], label [[LOOP_EXIT_GUARD:%.*]]22; CHECK: B:23; CHECK-NEXT: [[MYTMP41:%.*]] = load i32, ptr [[ARG2:%.*]], align 424; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[MYTMP41]], 025; CHECK-NEXT: br i1 [[CMP]], label [[A]], label [[LOOP_EXIT_GUARD]]26; CHECK: C:27; CHECK-NEXT: [[INC:%.*]] = add i32 [[MYTMP41_MOVED:%.*]], 128; CHECK-NEXT: br label [[RETURN:%.*]]29; CHECK: return:30; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[INC]], [[C:%.*]] ], [ [[PHI_MOVED:%.*]], [[LOOP_EXIT_GUARD]] ]31; CHECK-NEXT: ret i32 [[PHI]]32; CHECK: loop.exit.guard:33; CHECK-NEXT: [[MYTMP41_MOVED]] = phi i32 [ poison, [[A]] ], [ [[MYTMP41]], [[B]] ]34; CHECK-NEXT: [[PHI_MOVED]] = phi i32 [ [[MYTMP42]], [[A]] ], [ poison, [[B]] ]35; CHECK-NEXT: [[GUARD_RETURN:%.*]] = phi i1 [ true, [[A]] ], [ false, [[B]] ]36; CHECK-NEXT: br i1 [[GUARD_RETURN]], label [[RETURN]], label [[C]]37;38entry:39 br label %A40 41A:42 %mytmp42 = load i32, ptr %arg1, align 443 %cmp1 = icmp slt i32 %mytmp42, 044 br i1 %cmp1, label %B, label %return45 46B:47 %mytmp41 = load i32, ptr %arg2, align 448 %cmp = icmp slt i32 %mytmp41, 049 br i1 %cmp, label %A, label %C50 51C:52 %inc = add i32 %mytmp41, 153 br label %return54 55return:56 %phi = phi i32 [ %inc, %C ], [ %mytmp42, %A ]57 ret i32 %phi58}59 60define i32 @exiting-used-in-exit_callbr(ptr %arg1, ptr %arg2) local_unnamed_addr align 2 {61; CHECK-LABEL: @exiting-used-in-exit_callbr(62; CHECK-NEXT: entry:63; CHECK-NEXT: callbr void asm "", ""()64; CHECK-NEXT: to label [[A:%.*]] []65; CHECK: A:66; CHECK-NEXT: [[MYTMP42:%.*]] = load i32, ptr [[ARG1:%.*]], align 467; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[MYTMP42]], 068; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[CMP1]])69; CHECK-NEXT: to label [[B:%.*]] [label %A.target.return]70; CHECK: B:71; CHECK-NEXT: [[MYTMP41:%.*]] = load i32, ptr [[ARG2:%.*]], align 472; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[MYTMP41]], 073; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[CMP]])74; CHECK-NEXT: to label [[A]] [label %B.target.C]75; CHECK: C:76; CHECK-NEXT: [[INC:%.*]] = add i32 [[MYTMP41_MOVED:%.*]], 177; CHECK-NEXT: callbr void asm "", ""()78; CHECK-NEXT: to label [[RETURN:%.*]] []79; CHECK: return:80; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[INC]], [[C:%.*]] ], [ [[PHI_MOVED:%.*]], [[LOOP_EXIT_GUARD:%.*]] ]81; CHECK-NEXT: ret i32 [[PHI]]82; CHECK: A.target.return:83; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]84; CHECK: B.target.C:85; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]86; CHECK: loop.exit.guard:87; CHECK-NEXT: [[MYTMP41_MOVED]] = phi i32 [ poison, [[A_TARGET_RETURN:%.*]] ], [ [[MYTMP41]], [[B_TARGET_C:%.*]] ]88; CHECK-NEXT: [[PHI_MOVED]] = phi i32 [ [[MYTMP42]], [[A_TARGET_RETURN]] ], [ poison, [[B_TARGET_C]] ]89; CHECK-NEXT: [[GUARD_RETURN:%.*]] = phi i1 [ true, [[A_TARGET_RETURN]] ], [ false, [[B_TARGET_C]] ]90; CHECK-NEXT: br i1 [[GUARD_RETURN]], label [[RETURN]], label [[C]]91;92entry:93 callbr void asm "", ""() to label %A []94 95A:96 %mytmp42 = load i32, ptr %arg1, align 497 %cmp1 = icmp slt i32 %mytmp42, 098 callbr void asm "", "r,!i"(i1 %cmp1) to label %B [label %return]99 100B:101 %mytmp41 = load i32, ptr %arg2, align 4102 %cmp = icmp slt i32 %mytmp41, 0103 callbr void asm "", "r,!i"(i1 %cmp) to label %A [label %C]104 105C:106 %inc = add i32 %mytmp41, 1107 callbr void asm "", ""() to label %return []108 109return:110 %phi = phi i32 [ %inc, %C ], [ %mytmp42, %A ]111 ret i32 %phi112}113 114; Loop consists of A, B and C:115; - A is the header116; - A and C are exiting blocks117; - B is an "internal" block that dominates exiting block C118; - D and return are exit blocks.119; Pattern: Value (%mytmp41) defined in internal block (B) and used in an120; exit block (D).121define i32 @internal-used-in-exit(ptr %arg1, ptr %arg2) local_unnamed_addr align 2 {122; CHECK-LABEL: @internal-used-in-exit(123; CHECK-NEXT: entry:124; CHECK-NEXT: [[MYTMP42:%.*]] = load i32, ptr [[ARG1:%.*]], align 4125; CHECK-NEXT: br label [[A:%.*]]126; CHECK: A:127; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[MYTMP42]], 0128; CHECK-NEXT: br i1 [[CMP1]], label [[B:%.*]], label [[LOOP_EXIT_GUARD:%.*]]129; CHECK: B:130; CHECK-NEXT: [[MYTMP41:%.*]] = load i32, ptr [[ARG2:%.*]], align 4131; CHECK-NEXT: br label [[C:%.*]]132; CHECK: C:133; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[MYTMP42]], 0134; CHECK-NEXT: br i1 [[CMP]], label [[A]], label [[LOOP_EXIT_GUARD]]135; CHECK: D:136; CHECK-NEXT: [[INC:%.*]] = add i32 [[MYTMP41_MOVED:%.*]], 1137; CHECK-NEXT: br label [[RETURN:%.*]]138; CHECK: return:139; CHECK-NEXT: ret i32 0140; CHECK: loop.exit.guard:141; CHECK-NEXT: [[MYTMP41_MOVED]] = phi i32 [ poison, [[A]] ], [ [[MYTMP41]], [[C]] ]142; CHECK-NEXT: [[GUARD_RETURN:%.*]] = phi i1 [ true, [[A]] ], [ false, [[C]] ]143; CHECK-NEXT: br i1 [[GUARD_RETURN]], label [[RETURN]], label [[D:%.*]]144;145entry:146 %mytmp42 = load i32, ptr %arg1, align 4147 br label %A148 149A:150 %cmp1 = icmp slt i32 %mytmp42, 0151 br i1 %cmp1, label %B, label %return152 153B:154 %mytmp41 = load i32, ptr %arg2, align 4155 br label %C156 157C:158 %cmp = icmp slt i32 %mytmp42, 0159 br i1 %cmp, label %A, label %D160 161D:162 %inc = add i32 %mytmp41, 1163 br label %return164 165return:166 ret i32 0167}168 169define i32 @internal-used-in-exit_callbr(ptr %arg1, ptr %arg2) local_unnamed_addr align 2 {170; CHECK-LABEL: @internal-used-in-exit_callbr(171; CHECK-NEXT: entry:172; CHECK-NEXT: [[MYTMP42:%.*]] = load i32, ptr [[ARG1:%.*]], align 4173; CHECK-NEXT: callbr void asm "", ""()174; CHECK-NEXT: to label [[A:%.*]] []175; CHECK: A:176; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[MYTMP42]], 0177; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[CMP1]])178; CHECK-NEXT: to label [[B:%.*]] [label %A.target.return]179; CHECK: B:180; CHECK-NEXT: [[MYTMP41:%.*]] = load i32, ptr [[ARG2:%.*]], align 4181; CHECK-NEXT: callbr void asm "", ""()182; CHECK-NEXT: to label [[C:%.*]] []183; CHECK: C:184; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[MYTMP42]], 0185; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[CMP]])186; CHECK-NEXT: to label [[A]] [label %C.target.D]187; CHECK: D:188; CHECK-NEXT: [[INC:%.*]] = add i32 [[MYTMP41_MOVED:%.*]], 1189; CHECK-NEXT: callbr void asm "", ""()190; CHECK-NEXT: to label [[RETURN:%.*]] []191; CHECK: return:192; CHECK-NEXT: ret i32 0193; CHECK: A.target.return:194; CHECK-NEXT: br label [[LOOP_EXIT_GUARD:%.*]]195; CHECK: C.target.D:196; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]197; CHECK: loop.exit.guard:198; CHECK-NEXT: [[MYTMP41_MOVED]] = phi i32 [ poison, [[A_TARGET_RETURN:%.*]] ], [ [[MYTMP41]], [[C_TARGET_D:%.*]] ]199; CHECK-NEXT: [[GUARD_RETURN:%.*]] = phi i1 [ true, [[A_TARGET_RETURN]] ], [ false, [[C_TARGET_D]] ]200; CHECK-NEXT: br i1 [[GUARD_RETURN]], label [[RETURN]], label [[D:%.*]]201;202entry:203 %mytmp42 = load i32, ptr %arg1, align 4204 callbr void asm "", ""() to label %A []205 206A:207 %cmp1 = icmp slt i32 %mytmp42, 0208 callbr void asm "", "r,!i"(i1 %cmp1) to label %B [label %return]209 210B:211 %mytmp41 = load i32, ptr %arg2, align 4212 callbr void asm "", ""() to label %C []213 214C:215 %cmp = icmp slt i32 %mytmp42, 0216 callbr void asm "", "r,!i"(i1 %cmp) to label %A [label %D]217 218D:219 %inc = add i32 %mytmp41, 1220 callbr void asm "", ""() to label %return []221 222return:223 ret i32 0224}225 226; Loop consists of A, B and C:227; - A is the header228; - A and C are exiting blocks229; - B is an "internal" block that dominates exiting block C230; - D and return are exit blocks.231; Pattern: %return contains a phi node that receives values from232; %entry, %A and %D. This mixes all the special cases in a single phi.233define i32 @mixed-use-in-exit(ptr %arg1, ptr %arg2) local_unnamed_addr align 2 {234; CHECK-LABEL: @mixed-use-in-exit(235; CHECK-NEXT: entry:236; CHECK-NEXT: [[MYTMP42:%.*]] = load i32, ptr [[ARG1:%.*]], align 4237; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[MYTMP42]], 0238; CHECK-NEXT: br i1 [[CMP2]], label [[A:%.*]], label [[RETURN:%.*]]239; CHECK: A:240; CHECK-NEXT: [[MYTMP43:%.*]] = add i32 [[MYTMP42]], 1241; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[MYTMP42]], 0242; CHECK-NEXT: br i1 [[CMP1]], label [[B:%.*]], label [[LOOP_EXIT_GUARD:%.*]]243; CHECK: B:244; CHECK-NEXT: [[MYTMP41:%.*]] = load i32, ptr [[ARG2:%.*]], align 4245; CHECK-NEXT: br label [[C:%.*]]246; CHECK: C:247; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[MYTMP42]], 0248; CHECK-NEXT: br i1 [[CMP]], label [[A]], label [[LOOP_EXIT_GUARD]]249; CHECK: D:250; CHECK-NEXT: br label [[RETURN]]251; CHECK: return:252; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[MYTMP41_MOVED:%.*]], [[D:%.*]] ], [ [[MYTMP42]], [[ENTRY:%.*]] ], [ [[PHI_MOVED:%.*]], [[LOOP_EXIT_GUARD]] ]253; CHECK-NEXT: ret i32 [[PHI]]254; CHECK: loop.exit.guard:255; CHECK-NEXT: [[MYTMP41_MOVED]] = phi i32 [ poison, [[A]] ], [ [[MYTMP41]], [[C]] ]256; CHECK-NEXT: [[PHI_MOVED]] = phi i32 [ [[MYTMP43]], [[A]] ], [ poison, [[C]] ]257; CHECK-NEXT: [[GUARD_RETURN:%.*]] = phi i1 [ true, [[A]] ], [ false, [[C]] ]258; CHECK-NEXT: br i1 [[GUARD_RETURN]], label [[RETURN]], label [[D]]259;260entry:261 %mytmp42 = load i32, ptr %arg1, align 4262 %cmp2 = icmp slt i32 %mytmp42, 0263 br i1 %cmp2, label %A, label %return264 265A:266 %mytmp43 = add i32 %mytmp42, 1267 %cmp1 = icmp slt i32 %mytmp42, 0268 br i1 %cmp1, label %B, label %return269 270B:271 %mytmp41 = load i32, ptr %arg2, align 4272 br label %C273 274C:275 %cmp = icmp slt i32 %mytmp42, 0276 br i1 %cmp, label %A, label %D277 278D:279 br label %return280 281return:282 %phi = phi i32 [ %mytmp41, %D ], [ %mytmp43, %A ], [%mytmp42, %entry]283 ret i32 %phi284}285 286define i32 @mixed-use-in-exit_callbr(ptr %arg1, ptr %arg2) local_unnamed_addr align 2 {287; CHECK-LABEL: @mixed-use-in-exit_callbr(288; CHECK-NEXT: entry:289; CHECK-NEXT: [[MYTMP42:%.*]] = load i32, ptr [[ARG1:%.*]], align 4290; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[MYTMP42]], 0291; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[CMP2]])292; CHECK-NEXT: to label [[A:%.*]] [label %return]293; CHECK: A:294; CHECK-NEXT: [[MYTMP43:%.*]] = add i32 [[MYTMP42]], 1295; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[MYTMP42]], 0296; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[CMP1]])297; CHECK-NEXT: to label [[B:%.*]] [label %A.target.return]298; CHECK: B:299; CHECK-NEXT: [[MYTMP41:%.*]] = load i32, ptr [[ARG2:%.*]], align 4300; CHECK-NEXT: callbr void asm "", ""()301; CHECK-NEXT: to label [[C:%.*]] []302; CHECK: C:303; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[MYTMP42]], 0304; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[CMP]])305; CHECK-NEXT: to label [[A]] [label %C.target.D]306; CHECK: D:307; CHECK-NEXT: callbr void asm "", ""()308; CHECK-NEXT: to label [[RETURN:%.*]] []309; CHECK: return:310; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[MYTMP41_MOVED:%.*]], [[D:%.*]] ], [ [[MYTMP42]], [[ENTRY:%.*]] ], [ [[PHI_MOVED:%.*]], [[LOOP_EXIT_GUARD:%.*]] ]311; CHECK-NEXT: ret i32 [[PHI]]312; CHECK: A.target.return:313; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]314; CHECK: C.target.D:315; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]316; CHECK: loop.exit.guard:317; CHECK-NEXT: [[MYTMP41_MOVED]] = phi i32 [ poison, [[A_TARGET_RETURN:%.*]] ], [ [[MYTMP41]], [[C_TARGET_D:%.*]] ]318; CHECK-NEXT: [[PHI_MOVED]] = phi i32 [ [[MYTMP43]], [[A_TARGET_RETURN]] ], [ poison, [[C_TARGET_D]] ]319; CHECK-NEXT: [[GUARD_RETURN:%.*]] = phi i1 [ true, [[A_TARGET_RETURN]] ], [ false, [[C_TARGET_D]] ]320; CHECK-NEXT: br i1 [[GUARD_RETURN]], label [[RETURN]], label [[D]]321;322entry:323 %mytmp42 = load i32, ptr %arg1, align 4324 %cmp2 = icmp slt i32 %mytmp42, 0325 callbr void asm "", "r,!i"(i1 %cmp2) to label %A [label %return]326 327A:328 %mytmp43 = add i32 %mytmp42, 1329 %cmp1 = icmp slt i32 %mytmp42, 0330 callbr void asm "", "r,!i"(i1 %cmp1) to label %B [label %return]331 332B:333 %mytmp41 = load i32, ptr %arg2, align 4334 callbr void asm "", ""() to label %C []335 336C:337 %cmp = icmp slt i32 %mytmp42, 0338 callbr void asm "", "r,!i"(i1 %cmp) to label %A [label %D]339 340D:341 callbr void asm "", ""() to label %return []342 343return:344 %phi = phi i32 [ %mytmp41, %D ], [ %mytmp43, %A ], [%mytmp42, %entry]345 ret i32 %phi346}347 348; Loop consists of A, B and C:349; - A is the header350; - A and C are exiting blocks351; - B is an "internal" block that dominates exiting block C352; - D and E are exit blocks.353; Pattern: Value (%mytmp41) defined in internal block (B) and used in a354; downstream block not related to the loop (return). The use355; is a phi where the incoming block for %mytmp41 is not related356; to the loop (D).357; This pattern does not involve either the exiting blocks or358; the exit blocks, which catches any such assumptions built359; into the SSA reconstruction phase.360define i32 @phi-via-external-block(ptr %arg1, ptr %arg2) local_unnamed_addr align 2 {361; CHECK-LABEL: @phi-via-external-block(362; CHECK-NEXT: entry:363; CHECK-NEXT: [[MYTMP42:%.*]] = load i32, ptr [[ARG1:%.*]], align 4364; CHECK-NEXT: br label [[A:%.*]]365; CHECK: A:366; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[MYTMP42]], 0367; CHECK-NEXT: br i1 [[CMP1]], label [[B:%.*]], label [[LOOP_EXIT_GUARD:%.*]]368; CHECK: B:369; CHECK-NEXT: [[MYTMP41:%.*]] = load i32, ptr [[ARG2:%.*]], align 4370; CHECK-NEXT: br label [[C:%.*]]371; CHECK: C:372; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[MYTMP42]], 0373; CHECK-NEXT: br i1 [[CMP]], label [[A]], label [[LOOP_EXIT_GUARD]]374; CHECK: D:375; CHECK-NEXT: br label [[RETURN:%.*]]376; CHECK: E:377; CHECK-NEXT: br label [[RETURN]]378; CHECK: return:379; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[MYTMP41_MOVED:%.*]], [[D:%.*]] ], [ [[MYTMP42]], [[E:%.*]] ]380; CHECK-NEXT: ret i32 [[PHI]]381; CHECK: loop.exit.guard:382; CHECK-NEXT: [[MYTMP41_MOVED]] = phi i32 [ poison, [[A]] ], [ [[MYTMP41]], [[C]] ]383; CHECK-NEXT: [[GUARD_E:%.*]] = phi i1 [ true, [[A]] ], [ false, [[C]] ]384; CHECK-NEXT: br i1 [[GUARD_E]], label [[E]], label [[D]]385;386entry:387 %mytmp42 = load i32, ptr %arg1, align 4388 br label %A389 390A:391 %cmp1 = icmp slt i32 %mytmp42, 0392 br i1 %cmp1, label %B, label %E393 394B:395 %mytmp41 = load i32, ptr %arg2, align 4396 br label %C397 398C:399 %cmp = icmp slt i32 %mytmp42, 0400 br i1 %cmp, label %A, label %D401 402D:403 br label %return404 405E:406 br label %return407 408return:409 %phi = phi i32 [ %mytmp41, %D ], [ %mytmp42, %E ]410 ret i32 %phi411}412 413define i32 @phi-via-external-block_callbr(ptr %arg1, ptr %arg2) local_unnamed_addr align 2 {414; CHECK-LABEL: @phi-via-external-block_callbr(415; CHECK-NEXT: entry:416; CHECK-NEXT: [[MYTMP42:%.*]] = load i32, ptr [[ARG1:%.*]], align 4417; CHECK-NEXT: callbr void asm "", ""()418; CHECK-NEXT: to label [[A:%.*]] []419; CHECK: A:420; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[MYTMP42]], 0421; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[CMP1]])422; CHECK-NEXT: to label [[B:%.*]] [label %A.target.E]423; CHECK: B:424; CHECK-NEXT: [[MYTMP41:%.*]] = load i32, ptr [[ARG2:%.*]], align 4425; CHECK-NEXT: callbr void asm "", ""()426; CHECK-NEXT: to label [[C:%.*]] []427; CHECK: C:428; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[MYTMP42]], 0429; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[CMP]])430; CHECK-NEXT: to label [[A]] [label %C.target.D]431; CHECK: D:432; CHECK-NEXT: callbr void asm "", ""()433; CHECK-NEXT: to label [[RETURN:%.*]] []434; CHECK: E:435; CHECK-NEXT: callbr void asm "", ""()436; CHECK-NEXT: to label [[RETURN]] []437; CHECK: return:438; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[MYTMP41_MOVED:%.*]], [[D:%.*]] ], [ [[MYTMP42]], [[E:%.*]] ]439; CHECK-NEXT: ret i32 [[PHI]]440; CHECK: A.target.E:441; CHECK-NEXT: br label [[LOOP_EXIT_GUARD:%.*]]442; CHECK: C.target.D:443; CHECK-NEXT: br label [[LOOP_EXIT_GUARD]]444; CHECK: loop.exit.guard:445; CHECK-NEXT: [[MYTMP41_MOVED]] = phi i32 [ poison, [[A_TARGET_E:%.*]] ], [ [[MYTMP41]], [[C_TARGET_D:%.*]] ]446; CHECK-NEXT: [[GUARD_E:%.*]] = phi i1 [ true, [[A_TARGET_E]] ], [ false, [[C_TARGET_D]] ]447; CHECK-NEXT: br i1 [[GUARD_E]], label [[E]], label [[D]]448;449entry:450 %mytmp42 = load i32, ptr %arg1, align 4451 callbr void asm "", ""() to label %A []452 453A:454 %cmp1 = icmp slt i32 %mytmp42, 0455 callbr void asm "", "r,!i"(i1 %cmp1) to label %B [label %E]456 457B:458 %mytmp41 = load i32, ptr %arg2, align 4459 callbr void asm "", ""() to label %C []460 461C:462 %cmp = icmp slt i32 %mytmp42, 0463 callbr void asm "", "r,!i"(i1 %cmp) to label %A [label %D]464 465D:466 callbr void asm "", ""() to label %return []467 468E:469 callbr void asm "", ""() to label %return []470 471return:472 %phi = phi i32 [ %mytmp41, %D ], [ %mytmp42, %E ]473 ret i32 %phi474}475