diff options
author | Owen Anderson <resistor@mac.com> | 2008-01-30 01:24:47 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-01-30 01:24:47 +0000 |
commit | c667e3577682d9a462eeffb11db3fd214cec75ed (patch) | |
tree | 65a680b59095ac64488190bf9d37936b741336f9 /lib | |
parent | 25296a217abc67d41197cde0bd5ac72644ea3473 (diff) | |
download | external_llvm-c667e3577682d9a462eeffb11db3fd214cec75ed.zip external_llvm-c667e3577682d9a462eeffb11db3fd214cec75ed.tar.gz external_llvm-c667e3577682d9a462eeffb11db3fd214cec75ed.tar.bz2 |
Make DSE much more aggressive by performing DCE earlier. Update a testcase to reflect this increased aggressiveness.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46542 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/Scalar/DeadStoreElimination.cpp | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index fc35940..7e2588a 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -152,7 +152,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { possiblyDead.insert(D); if (Instruction* D = dyn_cast<Instruction>(last->getOperand(1))) possiblyDead.insert(D); - + last->eraseFromParent(); NumFastStores++; deletedStore = true; @@ -303,7 +303,7 @@ bool DSE::handleEndBlock(BasicBlock& BB, MD.removeInstruction(M); // DCE instructions only used to calculate that memcpy - if (Instruction* D = dyn_cast<Instruction>(M->getSource())) + if (Instruction* D = dyn_cast<Instruction>(M->getRawSource())) possiblyDead.insert(D); if (Instruction* D = dyn_cast<Instruction>(M->getLength())) possiblyDead.insert(D); @@ -325,11 +325,45 @@ bool DSE::handleEndBlock(BasicBlock& BB, // If we encounter a use of the pointer, it is no longer considered dead if (LoadInst* L = dyn_cast<LoadInst>(BBI)) { + // However, if this load is unused, we can go ahead and remove it, and + // not have to worry about it making our pointer undead! + if (L->getNumUses() == 0) { + MD.removeInstruction(L); + + // DCE instructions only used to calculate that load + if (Instruction* D = dyn_cast<Instruction>(L->getPointerOperand())) + possiblyDead.insert(D); + + BBI++; + L->eraseFromParent(); + NumFastOther++; + MadeChange = true; + possiblyDead.remove(L); + + continue; + } + killPointer = L->getPointerOperand(); } else if (VAArgInst* V = dyn_cast<VAArgInst>(BBI)) { killPointer = V->getOperand(0); } else if (AllocaInst* A = dyn_cast<AllocaInst>(BBI)) { deadPointers.erase(A); + + // Dead alloca's can be DCE'd when we reach them + if (A->getNumUses() == 0) { + MD.removeInstruction(A); + + // DCE instructions only used to calculate that load + if (Instruction* D = dyn_cast<Instruction>(A->getArraySize())) + possiblyDead.insert(D); + + BBI++; + A->eraseFromParent(); + NumFastOther++; + MadeChange = true; + possiblyDead.remove(A); + } + continue; } else if (CallSite::get(BBI).getInstruction() != 0) { // If this call does not access memory, it can't @@ -383,6 +417,25 @@ bool DSE::handleEndBlock(BasicBlock& BB, deadPointers.erase(*I); continue; + } else { + // For any non-memory-affecting non-terminators, DCE them as we reach them + Instruction *CI = BBI; + if (!CI->isTerminator() && CI->getNumUses() == 0) { + + // DCE instructions only used to calculate that load + for (Instruction::op_iterator OI = CI->op_begin(), OE = CI->op_end(); + OI != OE; ++OI) + if (Instruction* D = dyn_cast<Instruction>(OI)) + possiblyDead.insert(D); + + BBI++; + CI->eraseFromParent(); + NumFastOther++; + MadeChange = true; + possiblyDead.remove(CI); + + continue; + } } if (!killPointer) |