[llvm-commits] [llvm] r164634 - in /llvm/trunk: lib/Transforms/Scalar/SROA.cpp test/Transforms/SROA/basictest.ll

Nick Lewycky nicholas at mxc.ca
Tue Sep 25 14:15:50 PDT 2012


Author: nicholas
Date: Tue Sep 25 16:15:50 2012
New Revision: 164634

URL: http://llvm.org/viewvc/llvm-project?rev=164634&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/Transforms/Scalar/SROA.cpp
    llvm/trunk/test/Transforms/SROA/basictest.ll

Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=164634&r1=164633&r2=164634&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Tue Sep 25 16:15:50 2012
@@ -3108,6 +3108,12 @@
   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) {

Modified: llvm/trunk/test/Transforms/SROA/basictest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SROA/basictest.ll?rev=164634&r1=164633&r2=164634&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SROA/basictest.ll (original)
+++ llvm/trunk/test/Transforms/SROA/basictest.ll Tue Sep 25 16:15:50 2012
@@ -855,3 +855,25 @@
   %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
+}





More information about the llvm-commits mailing list