diff --git a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp --- a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp @@ -112,7 +112,7 @@ "partial unswitching analysis"), cl::init(100), cl::Hidden); static cl::opt FreezeLoopUnswitchCond( - "freeze-loop-unswitch-cond", cl::init(false), cl::Hidden, + "freeze-loop-unswitch-cond", cl::init(true), cl::Hidden, cl::desc("If enabled, the freeze instruction will be added to condition " "of loop unswitch to prevent miscompilation.")); diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/ARM/nontrivial-unswitch-cost.ll b/llvm/test/Transforms/SimpleLoopUnswitch/ARM/nontrivial-unswitch-cost.ll --- a/llvm/test/Transforms/SimpleLoopUnswitch/ARM/nontrivial-unswitch-cost.ll +++ b/llvm/test/Transforms/SimpleLoopUnswitch/ARM/nontrivial-unswitch-cost.ll @@ -55,7 +55,8 @@ define void @test_unswitch(i1* %ptr, i1 %cond) { ; CHECK-LABEL: @test_unswitch( ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] +; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]] +; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] ; CHECK: entry.split.us: ; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]] ; CHECK: loop_begin.us: @@ -153,7 +154,8 @@ define void @test_unswitch_non_dup_code(i1* %ptr, i1 %cond) { ; CHECK-LABEL: @test_unswitch_non_dup_code( ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] +; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]] +; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] ; CHECK: entry.split.us: ; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]] ; CHECK: loop_begin.us: @@ -275,7 +277,8 @@ define void @test_unswitch_non_dup_code_in_cfg(i1* %ptr, i1 %cond) { ; CHECK-LABEL: @test_unswitch_non_dup_code_in_cfg( ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] +; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]] +; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] ; CHECK: entry.split.us: ; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]] ; CHECK: loop_begin.us: @@ -503,7 +506,8 @@ define void @test_unswitch_large_exit(i1* %ptr, i1 %cond) { ; CHECK-LABEL: @test_unswitch_large_exit( ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] +; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]] +; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] ; CHECK: entry.split.us: ; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]] ; CHECK: loop_begin.us: @@ -567,7 +571,8 @@ define void @test_unswitch_dedicated_exiting(i1* %ptr, i1 %cond) { ; CHECK-LABEL: @test_unswitch_dedicated_exiting( ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] +; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]] +; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] ; CHECK: entry.split.us: ; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]] ; CHECK: loop_begin.us: diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/guards.ll b/llvm/test/Transforms/SimpleLoopUnswitch/guards.ll --- a/llvm/test/Transforms/SimpleLoopUnswitch/guards.ll +++ b/llvm/test/Transforms/SimpleLoopUnswitch/guards.ll @@ -81,7 +81,8 @@ define void @test_conditional_guards(i1 %cond, i32 %N) { ; CHECK-LABEL: @test_conditional_guards( ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 [[COND:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] +; CHECK-NEXT: [[FROZEN:%.+]] = freeze i1 [[COND:%.*]] +; CHECK-NEXT: br i1 [[FROZEN]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] ; CHECK: entry.split.us: ; CHECK-NEXT: br label [[LOOP_US:%.*]] ; CHECK: loop.us: diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/implicit-null-checks.ll b/llvm/test/Transforms/SimpleLoopUnswitch/implicit-null-checks.ll --- a/llvm/test/Transforms/SimpleLoopUnswitch/implicit-null-checks.ll +++ b/llvm/test/Transforms/SimpleLoopUnswitch/implicit-null-checks.ll @@ -13,8 +13,8 @@ ; CHECK-LABEL: @test_should_drop_make_implicit( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[NULL_CHECK:%.*]] = icmp eq i32* [[P2:%.*]], null -; CHECK-NOT: !make.implicit -; CHECK-NEXT: br i1 [[NULL_CHECK]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] +; CHECK-NEXT: [[NULL_CHECK_FR:%.*]] = freeze i1 [[NULL_CHECK]] +; CHECK-NEXT: br i1 [[NULL_CHECK_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] ; CHECK: entry.split.us: ; CHECK-NEXT: br label [[LOOP_US:%.*]] ; CHECK: loop.us: @@ -210,8 +210,8 @@ ; CHECK-LABEL: @test_should_drop_make_implicit_exiting_call( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[NULL_CHECK:%.*]] = icmp eq i32* [[P2:%.*]], null -; CHECK-NOT: !make.implicit -; CHECK-NEXT: br i1 [[NULL_CHECK]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] +; CHECK-NEXT: [[NULL_CHECK_FR:%.*]] = freeze i1 [[NULL_CHECK]] +; CHECK-NEXT: br i1 [[NULL_CHECK_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]] ; CHECK: entry.split.us: ; CHECK-NEXT: br label [[LOOP_US:%.*]] ; CHECK: loop.us: diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch-cost.ll b/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch-cost.ll --- a/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch-cost.ll +++ b/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch-cost.ll @@ -56,7 +56,8 @@ entry: br label %loop_begin ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %entry.split.us, label %entry.split +; CHECK-NEXT: [[FROZEN:%.+]] = freeze i1 %cond +; CHECK-NEXT: br i1 [[FROZEN]], label %entry.split.us, label %entry.split loop_begin: call void @x() @@ -126,7 +127,8 @@ entry: br label %loop_begin ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %entry.split.us, label %entry.split +; CHECK-NEXT: [[FROZEN:%.+]] = freeze i1 %cond +; CHECK-NEXT: br i1 [[FROZEN]], label %entry.split.us, label %entry.split loop_begin: call void @x() @@ -207,7 +209,8 @@ entry: br label %loop_begin ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %entry.split.us, label %entry.split +; CHECK-NEXT: [[FROZEN:%.+]] = freeze i1 %cond +; CHECK-NEXT: br i1 [[FROZEN]], label %entry.split.us, label %entry.split loop_begin: call void @x() @@ -363,7 +366,8 @@ entry: br label %loop_begin ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %entry.split.us, label %entry.split +; CHECK-NEXT: [[FROZEN:%.+]] = freeze i1 %cond +; CHECK-NEXT: br i1 [[FROZEN]], label %entry.split.us, label %entry.split loop_begin: call void @x() @@ -440,7 +444,8 @@ entry: br label %loop_begin ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %entry.split.us, label %entry.split +; CHECK-NEXT: [[FROZEN:%.+]] = freeze i1 %cond +; CHECK-NEXT: br i1 [[FROZEN]], label %entry.split.us, label %entry.split loop_begin: call void @x() diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch.ll b/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch.ll --- a/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch.ll +++ b/llvm/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch.ll @@ -813,7 +813,8 @@ ; CHECK-NEXT: %[[A_INNER_PHI:.*]] = phi i32 [ %[[A]], %loop_begin ], [ %[[A2:.*]], %inner_inner_loop_exit ] ; CHECK-NEXT: %[[COND:.*]] = load i1, i1* %cond.ptr ; CHECK-NEXT: %[[B:.*]] = load i32, i32* %b.ptr -; CHECK-NEXT: br i1 %[[COND]], label %inner_loop_begin.split.us, label %inner_loop_begin.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %[[COND]] +; CHECK-NEXT: br i1 %[[FROZEN]], label %inner_loop_begin.split.us, label %inner_loop_begin.split inner_inner_loop_begin: %v1 = load i1, i1* %ptr @@ -966,7 +967,8 @@ ; CHECK-NEXT: %[[A_INNER_PHI:.*]] = phi i32 [ %[[A]], %loop_begin ], [ %[[A2:.*]], %inner_inner_loop_exit ] ; CHECK-NEXT: %[[COND:.*]] = load i1, i1* %cond.ptr ; CHECK-NEXT: %[[B:.*]] = load i32, i32* %b.ptr -; CHECK-NEXT: br i1 %[[COND]], label %inner_loop_begin.split.us, label %inner_loop_begin.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %[[COND]] +; CHECK-NEXT: br i1 %[[FROZEN]], label %inner_loop_begin.split.us, label %inner_loop_begin.split inner_inner_loop_begin: %v1 = load i1, i1* %ptr @@ -1119,7 +1121,8 @@ ; CHECK-NEXT: %[[A_INNER_PHI:.*]] = phi i32 [ %[[A]], %loop_begin ], [ %[[A2:.*]], %inner_inner_loop_exit ] ; CHECK-NEXT: %[[COND:.*]] = load i1, i1* %cond.ptr ; CHECK-NEXT: %[[B:.*]] = load i32, i32* %b.ptr -; CHECK-NEXT: br i1 %[[COND]], label %inner_loop_begin.split.us, label %inner_loop_begin.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %[[COND]] +; CHECK-NEXT: br i1 %[[FROZEN]], label %inner_loop_begin.split.us, label %inner_loop_begin.split inner_inner_loop_begin: %v1 = load i1, i1* %ptr @@ -1239,7 +1242,8 @@ ; CHECK-NEXT: %[[A_INNER_PHI:.*]] = phi i32 [ %[[A]], %loop_begin ], [ %[[A2:.*]], %inner_inner_loop_exit ] ; CHECK-NEXT: %[[COND:.*]] = load i1, i1* %cond.ptr ; CHECK-NEXT: %[[B:.*]] = load i32, i32* %b.ptr -; CHECK-NEXT: br i1 %[[COND]], label %inner_loop_begin.split.us, label %inner_loop_begin.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %[[COND]] +; CHECK-NEXT: br i1 %[[FROZEN]], label %inner_loop_begin.split.us, label %inner_loop_begin.split inner_inner_loop_begin: %v1 = load i1, i1* %ptr @@ -1481,7 +1485,8 @@ entry: br label %loop_begin ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %entry.split.us, label %entry.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %cond +; CHECK-NEXT: br i1 %[[FROZEN]], label %entry.split.us, label %entry.split loop_begin: %a = load i32, i32* %a.ptr @@ -1561,7 +1566,8 @@ entry: br label %loop_begin ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %entry.split.us, label %entry.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %cond +; CHECK-NEXT: br i1 %[[FROZEN]], label %entry.split.us, label %entry.split loop_begin: %a = load i32, i32* %a.ptr @@ -1660,7 +1666,8 @@ br label %inner_loop_begin ; CHECK: inner_loop_ph: ; CHECK-NEXT: %[[COND:.*]] = load i1, i1* %cond.ptr -; CHECK-NEXT: br i1 %[[COND]], label %inner_loop_ph.split.us, label %inner_loop_ph.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %[[COND]] +; CHECK-NEXT: br i1 %[[FROZEN]], label %inner_loop_ph.split.us, label %inner_loop_ph.split inner_loop_begin: call void @sink1(i32 %b) @@ -1754,7 +1761,8 @@ br label %inner_loop_begin ; CHECK: inner_loop_ph: ; CHECK-NEXT: %[[COND:.*]] = load i1, i1* %cond.ptr -; CHECK-NEXT: br i1 %[[COND]], label %inner_loop_ph.split.us, label %inner_loop_ph.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %[[COND]] +; CHECK-NEXT: br i1 %[[FROZEN]], label %inner_loop_ph.split.us, label %inner_loop_ph.split inner_loop_begin: call void @sink1(i32 %b) @@ -1852,7 +1860,8 @@ br label %inner_inner_loop_begin ; CHECK: inner_inner_loop_ph: ; CHECK-NEXT: %[[COND:.*]] = load i1, i1* %cond.ptr -; CHECK-NEXT: br i1 %[[COND]], label %inner_inner_loop_ph.split.us, label %inner_inner_loop_ph.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %[[COND]] +; CHECK-NEXT: br i1 %[[FROZEN]], label %inner_inner_loop_ph.split.us, label %inner_inner_loop_ph.split inner_inner_loop_begin: call void @sink1(i32 %b) @@ -1960,7 +1969,8 @@ br label %inner_inner_loop_begin ; CHECK: inner_inner_loop_ph: ; CHECK-NEXT: %[[COND:.*]] = load i1, i1* %cond.ptr -; CHECK-NEXT: br i1 %[[COND]], label %inner_inner_loop_ph.split.us, label %inner_inner_loop_ph.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %[[COND]] +; CHECK-NEXT: br i1 %[[FROZEN]], label %inner_inner_loop_ph.split.us, label %inner_inner_loop_ph.split inner_inner_loop_begin: call void @sink1(i32 %b) @@ -2047,7 +2057,8 @@ entry: br label %loop_begin ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %entry.split.us, label %entry.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %cond +; CHECK-NEXT: br i1 %[[FROZEN]], label %entry.split.us, label %entry.split loop_begin: %a = load i32, i32* %a.ptr @@ -2171,7 +2182,8 @@ entry: br label %loop_begin ; CHECK-NEXT: entry: -; CHECK-NEXT: br i1 %cond, label %entry.split.us, label %entry.split +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %cond +; CHECK-NEXT: br i1 %[[FROZEN]], label %entry.split.us, label %entry.split loop_begin: %a = load i32, i32* %a.ptr @@ -2425,7 +2437,8 @@ br label %bb3 ; CHECK-NOT: br i1 %a ; -; CHECK: br i1 %a, label %[[BB_SPLIT_US:.*]], label %[[BB_SPLIT:.*]] +; CHECK: %[[FROZEN:.+]] = freeze i1 %a +; CHECK-NEXT: br i1 %[[FROZEN]], label %[[BB_SPLIT_US:.*]], label %[[BB_SPLIT:.*]] ; ; CHECK-NOT: br i1 %a ; CHECK-NOT: br i1 %b @@ -2552,7 +2565,8 @@ entry: br label %outer.header ; CHECK: entry: -; CHECK-NEXT: br i1 %arg, +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %arg +; CHECK-NEXT: br i1 %[[FROZEN]], ; ; Just verify that we unswitched the correct bits. We should call `@f` twice in ; one unswitch and `@f` and then `@g` in the other. @@ -3049,7 +3063,8 @@ entry: br label %header ; CHECK-NEXT: entry: -; CHECK-NEXT: switch i32 %arg, label %[[ENTRY_SPLIT_C:.*]] [ +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i32 %arg +; CHECK-NEXT: switch i32 %[[FROZEN]], label %[[ENTRY_SPLIT_C:.*]] [ ; CHECK-NEXT: i32 0, label %[[ENTRY_SPLIT_A:.*]] ; CHECK-NEXT: i32 1, label %[[ENTRY_SPLIT_A]] ; CHECK-NEXT: i32 2, label %[[ENTRY_SPLIT_B:.*]] @@ -3232,7 +3247,8 @@ entry: br label %header ; CHECK-NEXT: entry: -; CHECK-NEXT: switch i32 %arg, label %[[ENTRY_SPLIT_EXIT:.*]] [ +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i32 %arg +; CHECK-NEXT: switch i32 %[[FROZEN]], label %[[ENTRY_SPLIT_EXIT:.*]] [ ; CHECK-NEXT: i32 -1, label %[[ENTRY_SPLIT_EXIT]] ; CHECK-NEXT: i32 0, label %[[ENTRY_SPLIT_A:.*]] ; CHECK-NEXT: i32 1, label %[[ENTRY_SPLIT_B:.*]] @@ -3411,7 +3427,8 @@ br label %c.header ; CHECK: b.header: ; CHECK-NEXT: %v1 = call i1 @cond() -; CHECK-NEXT: br i1 %v1, label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]] +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %v1 +; CHECK-NEXT: br i1 %[[FROZEN]], label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]] ; ; CHECK: [[B_HEADER_SPLIT_US]]: ; CHECK-NEXT: br label %[[C_HEADER_US:.*]] @@ -3486,7 +3503,8 @@ ; CHECK: b.header: ; CHECK-NEXT: %x.b = load i32, i32* %ptr ; CHECK-NEXT: %v1 = call i1 @cond() -; CHECK-NEXT: br i1 %v1, label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]] +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %v1 +; CHECK-NEXT: br i1 %[[FROZEN]], label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]] ; ; CHECK: [[B_HEADER_SPLIT_US]]: ; CHECK-NEXT: br label %[[C_HEADER_US:.*]] @@ -3574,7 +3592,8 @@ ; CHECK: b.header: ; CHECK-NEXT: %x.b = load i32, i32* %ptr ; CHECK-NEXT: %v1 = call i1 @cond() -; CHECK-NEXT: br i1 %v1, label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]] +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %v1 +; CHECK-NEXT: br i1 %[[FROZEN]], label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]] ; ; CHECK: [[B_HEADER_SPLIT_US]]: ; CHECK-NEXT: br label %[[C_HEADER_US:.*]] @@ -3654,7 +3673,8 @@ ; CHECK: b.header: ; CHECK-NEXT: %x.b = load i32, i32* %ptr ; CHECK-NEXT: %v1 = call i1 @cond() -; CHECK-NEXT: br i1 %v1, label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]] +; CHECK-NEXT: %[[FROZEN:.+]] = freeze i1 %v1 +; CHECK-NEXT: br i1 %[[FROZEN]], label %[[B_HEADER_SPLIT_US:.*]], label %[[B_HEADER_SPLIT:.*]] ; ; CHECK: [[B_HEADER_SPLIT_US]]: ; CHECK-NEXT: br label %[[C_HEADER_US:.*]] @@ -3752,7 +3772,8 @@ br label %d.header ; CHECK: c.header: ; CHECK-NEXT: %v1 = call i1 @cond() -; CHECK-NEXT: br i1 %v1, label %[[C_HEADER_SPLIT_US:.*]], label %[[C_HEADER_SPLIT:.*]] +; CHECK-NEXT: [[FROZEN:%.+]] = freeze i1 %v1 +; CHECK-NEXT: br i1 [[FROZEN]], label %[[C_HEADER_SPLIT_US:.*]], label %[[C_HEADER_SPLIT:.*]] ; ; CHECK: [[C_HEADER_SPLIT_US]]: ; CHECK-NEXT: br label %[[D_HEADER_US:.*]] @@ -3865,7 +3886,8 @@ ; CHECK: c.header: ; CHECK-NEXT: %x.c = load i32, i32* %ptr ; CHECK-NEXT: %v1 = call i1 @cond() -; CHECK-NEXT: br i1 %v1, label %[[C_HEADER_SPLIT_US:.*]], label %[[C_HEADER_SPLIT:.*]] +; CHECK-NEXT: [[FROZEN:%.+]] = freeze i1 %v1 +; CHECK-NEXT: br i1 [[FROZEN]], label %[[C_HEADER_SPLIT_US:.*]], label %[[C_HEADER_SPLIT:.*]] ; ; CHECK: [[C_HEADER_SPLIT_US]]: ; CHECK-NEXT: br label %[[D_HEADER_US:.*]] @@ -3947,7 +3969,8 @@ ; CHECK: b.header: ; CHECK-NEXT: %x.b = load i32, i32* %ptr ; CHECK-NEXT: %v1 = call i32 @cond.i32() -; CHECK-NEXT: switch i32 %v1, label %[[B_HEADER_SPLIT:.*]] [ +; CHECK-NEXT: [[FROZEN:%.+]] = freeze i32 %v1 +; CHECK-NEXT: switch i32 [[FROZEN]], label %[[B_HEADER_SPLIT:.*]] [ ; CHECK-NEXT: i32 1, label %[[B_HEADER_SPLIT_US:.*]] ; CHECK-NEXT: i32 2, label %[[B_HEADER_SPLIT_US]] ; CHECK-NEXT: i32 3, label %[[B_HEADER_SPLIT_US]]