Revert the business end of r164634, and replace it with a different fix. The
authorNick Lewycky <nicholas@mxc.ca>
Tue, 25 Sep 2012 21:50:37 +0000 (21:50 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Tue, 25 Sep 2012 21:50:37 +0000 (21:50 +0000)
reason we were getting two of the same alloca is because of a memmove/memcpy
which had the same alloca in both the src and dest. Now we detect that case
directly. This has the same testcase as before, but fixes a clang test
CodeGenObjC/exceptions.m which runs clang -O2.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164636 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/SROA.cpp

index c33ee8fb8756025cb94fb8ca6b09004bf5557876..1b3e8f9baf4b42ff2416cb2185a72811966c3636 100644 (file)
@@ -2228,7 +2228,10 @@ private:
     // alloca that should be re-examined after rewriting this instruction.
     if (AllocaInst *AI
           = dyn_cast<AllocaInst>(OtherPtr->stripInBoundsOffsets()))
-      Pass.Worklist.insert(AI);
+      // Don't revisit the alloca if both sides of the memory transfer are
+      // referring to the same alloca.
+      if (AI != &NewAI)
+        Pass.Worklist.insert(AI);
 
     if (EmitMemCpy) {
       Value *OurPtr
@@ -3108,12 +3111,6 @@ 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) {