diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp index b3e63ae355d..c33ee8fb875 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 a61de05f450..359a56a00d5 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 +}