brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.2 KiB · ffe8026 Raw
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