diff options
author | Dan Gohman <gohman@apple.com> | 2010-11-12 02:19:17 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-11-12 02:19:17 +0000 |
commit | d4b7fff2e8b0f28922ae030e578262ef3e707e2b (patch) | |
tree | af7d72d5e84b957359611cde9d57f7b6bf879a35 /llvm/lib/Transforms | |
parent | 620c38f030a43fc76077529f48b805dfab8105e9 (diff) | |
download | bcm5719-llvm-d4b7fff2e8b0f28922ae030e578262ef3e707e2b.tar.gz bcm5719-llvm-d4b7fff2e8b0f28922ae030e578262ef3e707e2b.zip |
Enhance DSE to handle the case where a free call makes more than
one store dead. This is especially noticeable in
SingleSource/Benchmarks/Shootout/objinst.
llvm-svn: 118875
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp index d81d302ebaf..1ea0b15e4c9 100644 --- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -59,6 +59,7 @@ namespace { bool runOnBasicBlock(BasicBlock &BB); bool handleFreeWithNonTrivialDependency(const CallInst *F, + Instruction *Inst, MemDepResult Dep); bool handleEndBlock(BasicBlock &BB); bool RemoveUndeadPointers(Value *Ptr, uint64_t killPointerSize, @@ -212,7 +213,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { // Handle frees whose dependencies are non-trivial. if (const CallInst *F = isFreeCall(Inst)) { - MadeChange |= handleFreeWithNonTrivialDependency(F, InstDep); + MadeChange |= handleFreeWithNonTrivialDependency(F, Inst, InstDep); continue; } @@ -298,23 +299,34 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { /// handleFreeWithNonTrivialDependency - Handle frees of entire structures whose /// dependency is a store to a field of that structure. bool DSE::handleFreeWithNonTrivialDependency(const CallInst *F, + Instruction *Inst, MemDepResult Dep) { AliasAnalysis &AA = getAnalysis<AliasAnalysis>(); + MemoryDependenceAnalysis &MD = getAnalysis<MemoryDependenceAnalysis>(); - Instruction *Dependency = Dep.getInst(); - if (!Dependency || !doesClobberMemory(Dependency) || !isElidable(Dependency)) - return false; + do { + Instruction *Dependency = Dep.getInst(); + if (!Dependency || !doesClobberMemory(Dependency) || !isElidable(Dependency)) + return false; - Value *DepPointer = getPointerOperand(Dependency)->getUnderlyingObject(); + Value *DepPointer = getPointerOperand(Dependency)->getUnderlyingObject(); - // Check for aliasing. - if (AA.alias(F->getArgOperand(0), 1, DepPointer, 1) != - AliasAnalysis::MustAlias) - return false; + // Check for aliasing. + if (AA.alias(F->getArgOperand(0), 1, DepPointer, 1) != + AliasAnalysis::MustAlias) + return false; - // DCE instructions only used to calculate that store - DeleteDeadInstruction(Dependency); - ++NumFastStores; + // DCE instructions only used to calculate that store + DeleteDeadInstruction(Dependency); + ++NumFastStores; + + // Inst's old Dependency is now deleted. Compute the next dependency, + // which may also be dead, as in + // s[0] = 0; + // s[1] = 0; // This has just been deleted. + // free(s); + Dep = MD.getDependency(Inst); + } while (!Dep.isNonLocal()); return true; } |