summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2012-09-25 21:50:37 +0000
committerNick Lewycky <nicholas@mxc.ca>2012-09-25 21:50:37 +0000
commita0c16aee0a317602f8ee5cb59d48b10225d44d2c (patch)
treed1f503045820a1761e8339074e114179f96a85ad /llvm/lib/Transforms
parent9f19349846c3e22c146badf14f3ea84c44979956 (diff)
downloadbcm5719-llvm-a0c16aee0a317602f8ee5cb59d48b10225d44d2c.tar.gz
bcm5719-llvm-a0c16aee0a317602f8ee5cb59d48b10225d44d2c.zip
Revert the business end of r164634, and replace it with a different fix. The
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. llvm-svn: 164636
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/SROA.cpp11
1 files changed, 4 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp
index c33ee8fb875..1b3e8f9baf4 100644
--- a/llvm/lib/Transforms/Scalar/SROA.cpp
+++ b/llvm/lib/Transforms/Scalar/SROA.cpp
@@ -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) {
OpenPOWER on IntegriCloud