diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp index 3b0cb383380..e1f02868568 100644 --- a/lib/Transforms/Scalar/SROA.cpp +++ b/lib/Transforms/Scalar/SROA.cpp @@ -901,6 +901,10 @@ private: // If the result of the constant fold will be the pointer, recurse // through the select as if we had RAUW'ed it. enqueueUsers(SI, Offset); + else + // Otherwise the operand to the select is dead, and we can replace it + // with undef. + P.DeadOperands.push_back(U); return; } diff --git a/test/Transforms/SROA/phi-and-select.ll b/test/Transforms/SROA/phi-and-select.ll index f7c479f856a..ad0c55748dd 100644 --- a/test/Transforms/SROA/phi-and-select.ll +++ b/test/Transforms/SROA/phi-and-select.ll @@ -130,31 +130,35 @@ entry: ; CHECK: ret i32 1 } -declare void @f(i32*) +declare void @f(i32*, i32*) define i32 @test6(i32* %b) { ; CHECK: @test6 entry: %a = alloca [2 x i32] -; The alloca remains because it is used in a dead select. -; CHECK: alloca + %c = alloca i32 +; CHECK-NOT: alloca %a1 = getelementptr [2 x i32]* %a, i64 0, i32 1 store i32 1, i32* %a1 %select = select i1 true, i32* %a1, i32* %b %select2 = select i1 false, i32* %a1, i32* %b -; CHECK-NOT: select i1 true -; We don't aggressively DCE this select. -; CHECK: select i1 false + %select3 = select i1 false, i32* %c, i32* %b +; CHECK: %[[select2:.*]] = select i1 false, i32* undef, i32* %b +; CHECK: %[[select3:.*]] = select i1 false, i32* undef, i32* %b ; Note, this would potentially escape the alloca pointer except for the ; constant folding of the select. - call void @f(i32* %select2) + call void @f(i32* %select2, i32* %select3) +; CHECK: call void @f(i32* %[[select2]], i32* %[[select3]]) + %result = load i32* %select ; CHECK-NOT: load + %dead = load i32* %c + ret i32 %result ; CHECK: ret i32 1 }