; RUN: opt < %s -instcombine -mem2reg -S | grep {%A = alloca} | |
; RUN: opt < %s -instcombine -mem2reg -S | \ | |
; RUN: not grep {%B = alloca} | |
; END. | |
; Ensure that instcombine doesn't sink the loads in entry/cond_true into | |
; cond_next. Doing so prevents mem2reg from promoting the B alloca. | |
define i32 @test2(i32 %C) { | |
entry: | |
%A = alloca i32 | |
%B = alloca i32 | |
%tmp = call i32 (...)* @bar( i32* %A ) ; <i32> [#uses=0] | |
%T = load i32* %A ; <i32> [#uses=1] | |
%tmp2 = icmp eq i32 %C, 0 ; <i1> [#uses=1] | |
br i1 %tmp2, label %cond_next, label %cond_true | |
cond_true: ; preds = %entry | |
store i32 123, i32* %B | |
call i32 @test2( i32 123 ) ; <i32>:0 [#uses=0] | |
%T1 = load i32* %B ; <i32> [#uses=1] | |
br label %cond_next | |
cond_next: ; preds = %cond_true, %entry | |
%tmp1.0 = phi i32 [ %T1, %cond_true ], [ %T, %entry ] ; <i32> [#uses=1] | |
%tmp7 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp8 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp9 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp10 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp11 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp12 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp13 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp14 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp15 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp16 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp17 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp18 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp19 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
%tmp20 = call i32 (...)* @baq( ) ; <i32> [#uses=0] | |
ret i32 %tmp1.0 | |
} | |
declare i32 @bar(...) | |
declare i32 @baq(...) |