; 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 }