aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2012-09-25 21:15:50 +0000
committerNick Lewycky <nicholas@mxc.ca>2012-09-25 21:15:50 +0000
commitc3f10e43fc4b1084bc109ff740d9ba4b6eaced0a (patch)
tree992ee824143c08c0e61cefc1a5a4dbe7be0cb880
parentba48ceb1a3802e20e781ef04ea2573ffae2ac414 (diff)
Don't try to promote the same alloca twice. Fixes PR13916!
Chandler, it's not obvious that it's okay that this alloca gets into the list twice to begin with. Please review and see whether this is the fix you really want, but I wanted to get a fix checked in quickly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164634 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/SROA.cpp6
-rw-r--r--test/Transforms/SROA/basictest.ll22
2 files changed, 28 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp
index b3e63ae355..c33ee8fb87 100644
--- a/lib/Transforms/Scalar/SROA.cpp
+++ b/lib/Transforms/Scalar/SROA.cpp
@@ -3108,6 +3108,12 @@ bool SROA::promoteAllocas(Function &F) {
if (PromotableAllocas.empty())
return false;
+ // Ensure that the list is unique.
+ std::sort(PromotableAllocas.begin(), PromotableAllocas.end());
+ PromotableAllocas.erase(std::unique(PromotableAllocas.begin(),
+ PromotableAllocas.end()),
+ PromotableAllocas.end());
+
NumPromoted += PromotableAllocas.size();
if (DT && !ForceSSAUpdater) {
diff --git a/test/Transforms/SROA/basictest.ll b/test/Transforms/SROA/basictest.ll
index a61de05f45..359a56a00d 100644
--- a/test/Transforms/SROA/basictest.ll
+++ b/test/Transforms/SROA/basictest.ll
@@ -855,3 +855,25 @@ entry:
%result = or i8 %load, %load2
ret i8 %result
}
+
+%test22.struct = type { i8 }
+
+define void @test22() {
+; CHECK: @test22
+; CHECK-NOT: alloca
+; CHECK: ret void
+; PR13916
+entry:
+ %A = alloca %test22.struct
+ br i1 undef, label %if.then, label %if.end
+
+if.then: ; preds = %entry
+ %tmp = bitcast %test22.struct* %A to i8*
+ %tmp1 = bitcast %test22.struct* %A to i8*
+ call void @llvm.memcpy.p0i8.p0i8.i32(i8* %tmp, i8* %tmp1, i32 1, i32 1, i1 false)
+ unreachable
+
+if.end: ; preds = %entry
+ %tmp2 = load %test22.struct* %A
+ ret void
+}