diff options
author | Owen Anderson <resistor@mac.com> | 2008-02-04 04:53:00 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-02-04 04:53:00 +0000 |
commit | c69ace3a64aee6f97bd82f0d811b89f49a3b38ce (patch) | |
tree | 095915c2994e648544f97a7e5ececcbb697d54d0 | |
parent | 6f7a52d300617fd2aca4cd48e328cfe7904be006 (diff) | |
download | external_llvm-c69ace3a64aee6f97bd82f0d811b89f49a3b38ce.zip external_llvm-c69ace3a64aee6f97bd82f0d811b89f49a3b38ce.tar.gz external_llvm-c69ace3a64aee6f97bd82f0d811b89f49a3b38ce.tar.bz2 |
Be more precise when eliminating pointers bue to memcpy's. This allows more
stores to be deleted in some cases.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46694 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/DeadStoreElimination.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index 179dab3..f9d1205 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -52,7 +52,7 @@ namespace { Instruction* dependency, SetVector<Instruction*>& possiblyDead); bool handleEndBlock(BasicBlock& BB, SetVector<Instruction*>& possiblyDead); - bool RemoveUndeadPointers(Value* pointer, + bool RemoveUndeadPointers(Value* pointer, uint64_t killPointerSize, BasicBlock::iterator& BBI, SmallPtrSet<Value*, 64>& deadPointers, SetVector<Instruction*>& possiblyDead); @@ -322,6 +322,7 @@ bool DSE::handleEndBlock(BasicBlock& BB, } Value* killPointer = 0; + uint64_t killPointerSize = ~0UL; // If we encounter a use of the pointer, it is no longer considered dead if (LoadInst* L = dyn_cast<LoadInst>(BBI)) { @@ -346,6 +347,11 @@ bool DSE::handleEndBlock(BasicBlock& BB, killPointer = L->getPointerOperand(); } else if (VAArgInst* V = dyn_cast<VAArgInst>(BBI)) { killPointer = V->getOperand(0); + } else if (isa<MemCpyInst>(BBI) && + isa<ConstantInt>(cast<MemCpyInst>(BBI)->getLength())) { + killPointer = cast<MemCpyInst>(BBI)->getSource(); + killPointerSize = cast<ConstantInt>( + cast<MemCpyInst>(BBI)->getLength())->getZExtValue(); } else if (AllocaInst* A = dyn_cast<AllocaInst>(BBI)) { deadPointers.erase(A); @@ -444,7 +450,7 @@ bool DSE::handleEndBlock(BasicBlock& BB, TranslatePointerBitCasts(killPointer); // Deal with undead pointers - MadeChange |= RemoveUndeadPointers(killPointer, BBI, + MadeChange |= RemoveUndeadPointers(killPointer, killPointerSize, BBI, deadPointers, possiblyDead); } @@ -453,7 +459,7 @@ bool DSE::handleEndBlock(BasicBlock& BB, /// RemoveUndeadPointers - check for uses of a pointer that make it /// undead when scanning for dead stores to alloca's. -bool DSE::RemoveUndeadPointers(Value* killPointer, +bool DSE::RemoveUndeadPointers(Value* killPointer, uint64_t killPointerSize, BasicBlock::iterator& BBI, SmallPtrSet<Value*, 64>& deadPointers, SetVector<Instruction*>& possiblyDead) { @@ -491,7 +497,7 @@ bool DSE::RemoveUndeadPointers(Value* killPointer, // See if this pointer could alias it AliasAnalysis::AliasResult A = AA.alias(*I, pointerSize, - killPointer, ~0U); + killPointer, killPointerSize); // If it must-alias and a store, we can delete it if (isa<StoreInst>(BBI) && A == AliasAnalysis::MustAlias) { |