| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -print-mustexecute -disable-output 2>&1 | FileCheck %s --check-prefix=ME |
| ; RUN: opt < %s -print-must-be-executed-contexts -disable-output 2>&1 | FileCheck %s --check-prefix=MBEC |
| ; RUN: opt < %s -passes=print-must-be-executed-contexts -disable-output 2>&1 | FileCheck %s --check-prefix=MBEC |
| ; |
| ; void simple_conditional(int c) { |
| ; A(); |
| ; B(); |
| ; if (c) { |
| ; C(); |
| ; D(); |
| ; } |
| ; E(); |
| ; F(); |
| ; G(); |
| ; } |
| ; |
| ; Best result: |
| ; Start Instruction | Visit Set |
| ; A | A, B, E, F |
| ; B | A, B, E, F |
| ; C | A, B, C, D, E, F |
| ; D | A, B, C, D, E, F |
| ; E | A, B, E, F |
| ; F | A, B, E, F |
| ; G | A, B, E, F, G |
| ; |
| ; |
| ; There are no loops so print-mustexec will not do anything. |
| ; ME-NOT: mustexec |
| ; |
| define void @simple_conditional(i32 %arg) { |
| bb: |
| call void @A() |
| ; MBEC: -- Explore context of: call void @A() |
| ; MBEC-NEXT: [F: simple_conditional] call void @A() |
| ; MBEC-NEXT: [F: simple_conditional] call void @B() |
| ; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 |
| ; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 |
| ; MBEC-NEXT: [F: simple_conditional] call void @E() |
| ; MBEC-NEXT: [F: simple_conditional] call void @F() |
| ; MBEC-NOT: call |
| |
| call void @B() |
| ; MBEC: -- Explore context of: call void @B() |
| ; MBEC-NEXT: [F: simple_conditional] call void @B() |
| ; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 |
| ; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 |
| ; MBEC-NEXT: [F: simple_conditional] call void @E() |
| ; MBEC-NEXT: [F: simple_conditional] call void @F() |
| ; MBEC-NEXT: [F: simple_conditional] call void @A() |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: %tmp |
| |
| %tmp = icmp eq i32 %arg, 0 |
| br i1 %tmp, label %bb2, label %bb1 |
| |
| bb1: ; preds = %bb |
| call void @C() |
| ; MBEC: -- Explore context of: call void @C() |
| ; MBEC-NEXT: [F: simple_conditional] call void @C() |
| ; MBEC-NEXT: [F: simple_conditional] call void @D() |
| ; MBEC-NEXT: [F: simple_conditional] br label %bb2 |
| ; MBEC-NEXT: [F: simple_conditional] call void @E() |
| ; MBEC-NEXT: [F: simple_conditional] call void @F() |
| ; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 |
| ; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 |
| ; MBEC-NEXT: [F: simple_conditional] call void @B() |
| ; MBEC-NEXT: [F: simple_conditional] call void @A() |
| ; MBEC-NOT: call |
| |
| call void @D() |
| ; MBEC: -- Explore context of: call void @D() |
| ; MBEC-NEXT: [F: simple_conditional] call void @D() |
| ; MBEC-NEXT: [F: simple_conditional] br label %bb2 |
| ; MBEC-NEXT: [F: simple_conditional] call void @E() |
| ; MBEC-NEXT: [F: simple_conditional] call void @F() |
| ; MBEC-NEXT: [F: simple_conditional] call void @C() |
| ; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 |
| ; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 |
| ; MBEC-NEXT: [F: simple_conditional] call void @B() |
| ; MBEC-NEXT: [F: simple_conditional] call void @A() |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: br |
| |
| br label %bb2 |
| |
| bb2: ; preds = %bb, %bb1 |
| call void @E() |
| ; MBEC: -- Explore context of: call void @E() |
| ; MBEC-NEXT: [F: simple_conditional] call void @E() |
| ; MBEC-NEXT: [F: simple_conditional] call void @F() |
| ; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 |
| ; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 |
| ; MBEC-NEXT: [F: simple_conditional] call void @B() |
| ; MBEC-NEXT: [F: simple_conditional] call void @A() |
| ; MBEC-NOT: call |
| |
| call void @F() ; might not return! |
| ; MBEC: -- Explore context of: call void @F() |
| ; MBEC-NEXT: [F: simple_conditional] call void @F() |
| ; MBEC-NEXT: [F: simple_conditional] call void @E() |
| ; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 |
| ; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 |
| ; MBEC-NEXT: [F: simple_conditional] call void @B() |
| ; MBEC-NEXT: [F: simple_conditional] call void @A() |
| ; MBEC-NOT: call |
| |
| call void @G() |
| ; MBEC: -- Explore context of: call void @G() |
| ; MBEC-NEXT: [F: simple_conditional] call void @G() |
| ; MBEC-NEXT: [F: simple_conditional] ret void |
| ; MBEC-NEXT: [F: simple_conditional] call void @F() |
| ; MBEC-NEXT: [F: simple_conditional] call void @E() |
| ; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 |
| ; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 |
| ; MBEC-NEXT: [F: simple_conditional] call void @B() |
| ; MBEC-NEXT: [F: simple_conditional] call void @A() |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: ret |
| |
| ret void |
| } |
| |
| |
| ; void complex_loops_and_control(int c, int d) { |
| ; A(); |
| ; while (1) { |
| ; B(); |
| ; if (++c == d) |
| ; C(); |
| ; if (++c == d) |
| ; continue; |
| ; D(); |
| ; if (++c == d) |
| ; break; |
| ; do { |
| ; if (++c == d) |
| ; continue; |
| ; E(); |
| ; } while (++c == d); |
| ; F(); |
| ; } |
| ; G(); |
| ; } |
| ; |
| ; Best result: |
| ; Start Instruction | Visit Set |
| ; A | A, B |
| ; B | A, B |
| ; C | A, B, C |
| ; D | A, B, D |
| ; E | A, B, D, E, F |
| ; F | A, B, D, F |
| ; G | A, B, D, G |
| ; |
| ; |
| ; ME: define void @complex_loops_and_control |
| define void @complex_loops_and_control(i32 %arg, i32 %arg1) { |
| bb: |
| call void @A() |
| ; ME: call void @A() |
| ; ME-NOT: mustexec |
| ; ME-NEXT: br |
| ; MBEC: -- Explore context of: call void @A() |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @A() |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @B() |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: br |
| br label %bb2 |
| |
| bb2: ; preds = %.backedge, %bb |
| %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] |
| call void @B() |
| ; ME: call void @B() ; (mustexec in: bb2) |
| ; MBEC: -- Explore context of: call void @B() |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @B() |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @A() |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: %tmp |
| %tmp = add nsw i32 %.0, 1 |
| %tmp3 = icmp eq i32 %tmp, %arg1 |
| br i1 %tmp3, label %bb4, label %bb5 |
| |
| bb4: ; preds = %bb2 |
| call void @C() |
| ; ME: call void @C() |
| ; ME-NOT: mustexec |
| ; ME-NEXT: br |
| ; MBEC: -- Explore context of: call void @C() |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @C() |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb5 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @B() |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @A() |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: br |
| br label %bb5 |
| |
| bb5: ; preds = %bb4, %bb2 |
| %tmp6 = add nsw i32 %.0, 2 |
| %tmp7 = icmp eq i32 %tmp6, %arg1 |
| br i1 %tmp7, label %bb8, label %bb9 |
| |
| bb8: ; preds = %bb5 |
| br label %.backedge |
| |
| .backedge: ; preds = %bb8, %bb22 |
| %.0.be = phi i32 [ %tmp6, %bb8 ], [ %.lcssa, %bb22 ] |
| br label %bb2 |
| |
| bb9: ; preds = %bb5 |
| call void @D() |
| ; ME: call void @D() |
| ; ME-NOT: mustexec |
| ; ME-NEXT: %tmp10 |
| ; MBEC: -- Explore context of: call void @D() |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @D() |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp10 = add nsw i32 %.0, 3 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp11 = icmp eq i32 %tmp10, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp11, label %bb12, label %bb13 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @B() |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @A() |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: %tmp10 |
| %tmp10 = add nsw i32 %.0, 3 |
| %tmp11 = icmp eq i32 %tmp10, %arg1 |
| br i1 %tmp11, label %bb12, label %bb13 |
| |
| bb12: ; preds = %bb9 |
| br label %bb23 |
| |
| bb13: ; preds = %bb9 |
| br label %bb14 |
| |
| bb14: ; preds = %bb19, %bb13 |
| %.1 = phi i32 [ %tmp10, %bb13 ], [ %tmp20, %bb19 ] |
| %tmp15 = add nsw i32 %.1, 1 |
| %tmp16 = icmp eq i32 %tmp15, %arg1 |
| br i1 %tmp16, label %bb17, label %bb18 |
| |
| bb17: ; preds = %bb14 |
| br label %bb19 |
| |
| bb18: ; preds = %bb14 |
| call void @E() |
| ; ME: call void @E() |
| ; ME-NOT: mustexec |
| ; ME-NEXT: br |
| ; FIXME: Missing F |
| ; MBEC: -- Explore context of: call void @E() |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @E() |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb19 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp20 = add nsw i32 %.1, 2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp21 = icmp eq i32 %tmp20, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp21, label %bb14, label %bb22 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp16, label %bb17, label %bb18 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp16 = icmp eq i32 %tmp15, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp15 = add nsw i32 %.1, 1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.1 = phi i32 [ %tmp10, %bb13 ], [ %tmp20, %bb19 ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb14 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp11, label %bb12, label %bb13 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp11 = icmp eq i32 %tmp10, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp10 = add nsw i32 %.0, 3 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @D() |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @B() |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @A() |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: br |
| br label %bb19 |
| |
| bb19: ; preds = %bb18, %bb17 |
| %tmp20 = add nsw i32 %.1, 2 |
| %tmp21 = icmp eq i32 %tmp20, %arg1 |
| br i1 %tmp21, label %bb14, label %bb22 |
| |
| bb22: ; preds = %bb19 |
| %.lcssa = phi i32 [ %tmp20, %bb19 ] |
| call void @F() |
| ; ME: call void @F() |
| ; ME-NOT: mustexec |
| ; ME-NEXT: br |
| ; MBEC: -- Explore context of: call void @F() |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @F() |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.lcssa = phi i32 [ %tmp20, %bb19 ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp21, label %bb14, label %bb22 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp21 = icmp eq i32 %tmp20, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp20 = add nsw i32 %.1, 2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp16, label %bb17, label %bb18 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp16 = icmp eq i32 %tmp15, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp15 = add nsw i32 %.1, 1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.1 = phi i32 [ %tmp10, %bb13 ], [ %tmp20, %bb19 ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb14 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp11, label %bb12, label %bb13 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp11 = icmp eq i32 %tmp10, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp10 = add nsw i32 %.0, 3 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @D() |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @B() |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @A() |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: br |
| br label %.backedge |
| |
| bb23: ; preds = %bb12 |
| call void @G() |
| ; ME: call void @G() |
| ; ME-NOT: mustexec |
| ; ME-NEXT: ret |
| ; MBEC: -- Explore context of: call void @G() |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @G() |
| ; MBEC-NEXT: [F: complex_loops_and_control] ret void |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb23 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp11, label %bb12, label %bb13 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp11 = icmp eq i32 %tmp10, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp10 = add nsw i32 %.0, 3 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @D() |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @B() |
| ; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] |
| ; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 |
| ; MBEC-NEXT: [F: complex_loops_and_control] call void @A() |
| ; MBEC-NOT: call |
| ; MBEC: -- Explore context of: ret |
| ret void |
| } |
| |
| declare void @A() nounwind willreturn |
| |
| declare void @B() nounwind willreturn |
| |
| declare void @C() nounwind willreturn |
| |
| declare void @D() nounwind willreturn |
| |
| declare void @E() nounwind willreturn |
| |
| declare void @F() nounwind |
| |
| declare void @G() nounwind willreturn |
| |
| declare i32 @g(i32*) nounwind willreturn |
| |
| declare void @h(i32*) nounwind willreturn |
| |
| define i32 @nonnull_exec_ctx_1(i32* %a, i32 %b) { |
| ; MBEC: -- Explore context of: %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: -- Explore context of: br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 |
| en: |
| %tmp3 = icmp eq i32 %b, 0 |
| br i1 %tmp3, label %ex, label %hd |
| |
| ex: |
| %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ret i32 %tmp5 |
| |
| hd: |
| %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| tail call void @h(i32* %a) |
| %tmp8 = add nuw i32 %tmp7, 1 |
| %tmp9 = icmp eq i32 %tmp8, %b |
| br i1 %tmp9, label %ex, label %hd |
| } |
| |
| define i32 @nonnull_exec_ctx_2(i32* %a, i32 %b) nounwind willreturn { |
| ; MBEC: -- Explore context of: %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 |
| ; MBEC-NEXT: -- Explore context of: br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 |
| ; MBEC-NEXT: -- Explore context of: br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(i32* %a) |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd |
| ; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 |
| en: |
| %tmp3 = icmp eq i32 %b, 0 |
| br i1 %tmp3, label %ex, label %hd |
| |
| ex: |
| %tmp5 = tail call i32 @g(i32* nonnull %a) |
| ret i32 %tmp5 |
| |
| hd: |
| %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] |
| tail call void @h(i32* %a) |
| %tmp8 = add nuw i32 %tmp7, 1 |
| %tmp9 = icmp eq i32 %tmp8, %b |
| br i1 %tmp9, label %ex, label %hd |
| } |