diff options
author | Dan Gohman <gohman@apple.com> | 2012-05-10 18:57:38 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2012-05-10 18:57:38 +0000 |
commit | ed7c24e2d9a3841607ce6f6e409129ae7de58761 (patch) | |
tree | ffa1a85f54a7f2a637aed8040dd70d6d0f3d1a4c /llvm/lib/Transforms | |
parent | 671ce47d607b68e6a8ed606c721fcaaea90beb36 (diff) | |
download | bcm5719-llvm-ed7c24e2d9a3841607ce6f6e409129ae7de58761.tar.gz bcm5719-llvm-ed7c24e2d9a3841607ce6f6e409129ae7de58761.zip |
Teach DeadStoreElimination to eliminate exit-block stores with phi addresses.
llvm-svn: 156558
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp index a46e802f4c2..f498cc79349 100644 --- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -731,14 +731,30 @@ bool DSE::handleEndBlock(BasicBlock &BB) { // If we find a store, check to see if it points into a dead stack value. if (hasMemoryWrite(BBI) && isRemovable(BBI)) { // See through pointer-to-pointer bitcasts - Value *Pointer = GetUnderlyingObject(getStoredPointerOperand(BBI)); + SmallVector<Value *, 4> Pointers; + GetUnderlyingObjects(getStoredPointerOperand(BBI), Pointers); // Stores to stack values are valid candidates for removal. - if (DeadStackObjects.count(Pointer)) { + bool AllDead = true; + for (SmallVectorImpl<Value *>::iterator I = Pointers.begin(), + E = Pointers.end(); I != E; ++I) + if (!DeadStackObjects.count(*I)) { + AllDead = false; + break; + } + + if (AllDead) { Instruction *Dead = BBI++; DEBUG(dbgs() << "DSE: Dead Store at End of Block:\n DEAD: " - << *Dead << "\n Object: " << *Pointer << '\n'); + << *Dead << "\n Objects: "; + for (SmallVectorImpl<Value *>::iterator I = Pointers.begin(), + E = Pointers.end(); I != E; ++I) { + dbgs() << **I; + if (llvm::next(I) != E) + dbgs() << ", "; + } + dbgs() << '\n'); // DCE instructions only used to calculate that store. DeleteDeadInstruction(Dead, *MD, &DeadStackObjects); |