Don't try to promote the same alloca twice. Fixes PR13916!
authorNick Lewycky <nicholas@mxc.ca>
Tue, 25 Sep 2012 21:15:50 +0000 (21:15 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Tue, 25 Sep 2012 21:15:50 +0000 (21:15 +0000)
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

lib/Transforms/Scalar/SROA.cpp
test/Transforms/SROA/basictest.ll

index b3e63ae355d7d755b0202e4b48d72d9b2d7a58ab..c33ee8fb8756025cb94fb8ca6b09004bf5557876 100644 (file)
@@ -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) {
index a61de05f45018f7682bb36c13fa25664ae981c04..359a56a00d56b89693bd9c51ac4fd709c1de7028 100644 (file)
@@ -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
+}