aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
+}