diff options
author | Chris Lattner <sabre@nondot.org> | 2010-11-30 19:48:15 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-11-30 19:48:15 +0000 |
commit | 83d675940309b2df3ab16efd50f7e90ce4ead8e7 (patch) | |
tree | 56dbea9a0486d26cb64b998d474f95a7a35ed22b /lib/Transforms | |
parent | e3c611085ecb4bc1f30f445e6b1eb736cf29fee1 (diff) | |
download | external_llvm-83d675940309b2df3ab16efd50f7e90ce4ead8e7.zip external_llvm-83d675940309b2df3ab16efd50f7e90ce4ead8e7.tar.gz external_llvm-83d675940309b2df3ab16efd50f7e90ce4ead8e7.tar.bz2 |
various cleanups and code simplification
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120454 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/DeadStoreElimination.cpp | 150 |
1 files changed, 63 insertions, 87 deletions
diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index fb51333..5d55aa4 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -400,104 +400,88 @@ bool DSE::handleEndBlock(BasicBlock &BB) { bool MadeChange = false; // Pointers alloca'd in this function are dead in the end block - SmallPtrSet<Value*, 64> deadPointers; + SmallPtrSet<Value*, 64> DeadPointers; // Find all of the alloca'd pointers in the entry block. BasicBlock *Entry = BB.getParent()->begin(); for (BasicBlock::iterator I = Entry->begin(), E = Entry->end(); I != E; ++I) if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) - deadPointers.insert(AI); + DeadPointers.insert(AI); // Treat byval arguments the same, stores to them are dead at the end of the // function. for (Function::arg_iterator AI = BB.getParent()->arg_begin(), AE = BB.getParent()->arg_end(); AI != AE; ++AI) if (AI->hasByValAttr()) - deadPointers.insert(AI); + DeadPointers.insert(AI); // Scan the basic block backwards for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){ --BBI; - // If we find a store whose pointer is dead. - if (hasMemoryWrite(BBI)) { - if (isRemovable(BBI)) { - // See through pointer-to-pointer bitcasts - Value *pointerOperand = getPointerOperand(BBI)->getUnderlyingObject(); - - // Alloca'd pointers or byval arguments (which are functionally like - // alloca's) are valid candidates for removal. - if (deadPointers.count(pointerOperand)) { - // DCE instructions only used to calculate that store. - Instruction *Dead = BBI; - ++BBI; - DeleteDeadInstruction(Dead, &deadPointers); - ++NumFastStores; - MadeChange = true; - continue; - } - } - - // Because a memcpy or memmove is also a load, we can't skip it if we - // didn't remove it. - if (!isa<MemTransferInst>(BBI)) + // 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 = getPointerOperand(BBI)->getUnderlyingObject(); + + // Alloca'd pointers or byval arguments (which are functionally like + // alloca's) are valid candidates for removal. + if (DeadPointers.count(Pointer)) { + // DCE instructions only used to calculate that store. + Instruction *Dead = BBI++; + DeleteDeadInstruction(Dead, &DeadPointers); + ++NumFastStores; + MadeChange = true; continue; + } + } + + // Remove any dead non-memory-mutating instructions. + if (isInstructionTriviallyDead(BBI)) { + Instruction *Inst = BBI++; + DeleteDeadInstruction(Inst, &DeadPointers); + ++NumFastOther; + MadeChange = true; + continue; + } + + if (AllocaInst *A = dyn_cast<AllocaInst>(BBI)) { + DeadPointers.erase(A); + continue; } - Value *killPointer = 0; - uint64_t killPointerSize = AliasAnalysis::UnknownSize; + + Value *KillPointer = 0; + uint64_t KillPointerSize = AliasAnalysis::UnknownSize; // 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 and not volatile, we can go ahead and - // remove it, and not have to worry about it making our pointer undead! - if (L->use_empty() && !L->isVolatile()) { - ++BBI; - DeleteDeadInstruction(L, &deadPointers); - ++NumFastOther; - MadeChange = true; - continue; - } - - killPointer = L->getPointerOperand(); + KillPointer = L->getPointerOperand(); } else if (VAArgInst *V = dyn_cast<VAArgInst>(BBI)) { - killPointer = V->getOperand(0); - } else if (isa<MemTransferInst>(BBI) && - isa<ConstantInt>(cast<MemTransferInst>(BBI)->getLength())) { - killPointer = cast<MemTransferInst>(BBI)->getSource(); - killPointerSize = cast<ConstantInt>( - cast<MemTransferInst>(BBI)->getLength())->getZExtValue(); - } else if (AllocaInst *A = dyn_cast<AllocaInst>(BBI)) { - deadPointers.erase(A); - - // Dead alloca's can be DCE'd when we reach them - if (A->use_empty()) { - ++BBI; - DeleteDeadInstruction(A, &deadPointers); - ++NumFastOther; - MadeChange = true; - } - - continue; + KillPointer = V->getOperand(0); + } else if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(BBI)) { + KillPointer = cast<MemTransferInst>(BBI)->getSource(); + if (ConstantInt *Len = dyn_cast<ConstantInt>(MTI->getLength())) + KillPointerSize = Len->getZExtValue(); } else if (CallSite CS = cast<Value>(BBI)) { - // If this call does not access memory, it can't - // be undeadifying any of our pointers. + // If this call does not access memory, it can't be loading any of our + // pointers. if (AA->doesNotAccessMemory(CS)) continue; - unsigned modRef = 0; - unsigned other = 0; + unsigned NumModRef = 0; + unsigned NumOther = 0; // Remove any pointers made undead by the call from the dead set std::vector<Value*> dead; - for (SmallPtrSet<Value*, 64>::iterator I = deadPointers.begin(), - E = deadPointers.end(); I != E; ++I) { + for (SmallPtrSet<Value*, 64>::iterator I = DeadPointers.begin(), + E = DeadPointers.end(); I != E; ++I) { // HACK: if we detect that our AA is imprecise, it's not // worth it to scan the rest of the deadPointers set. Just // assume that the AA will return ModRef for everything, and // go ahead and bail. - if (modRef >= 16 && other == 0) { - deadPointers.clear(); + if (NumModRef >= 16 && NumOther == 0) { + DeadPointers.clear(); return MadeChange; } @@ -506,9 +490,9 @@ bool DSE::handleEndBlock(BasicBlock &BB) { AA->getModRefInfo(CS, *I, getPointerSize(*I, *AA)); if (A == AliasAnalysis::ModRef) - ++modRef; + ++NumModRef; else - ++other; + ++NumOther; if (A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref) dead.push_back(*I); @@ -516,27 +500,19 @@ bool DSE::handleEndBlock(BasicBlock &BB) { for (std::vector<Value*>::iterator I = dead.begin(), E = dead.end(); I != E; ++I) - deadPointers.erase(*I); + DeadPointers.erase(*I); continue; - } else if (isInstructionTriviallyDead(BBI)) { - // For any non-memory-affecting non-terminators, DCE them as we reach them - Instruction *Inst = BBI; - ++BBI; - DeleteDeadInstruction(Inst, &deadPointers); - ++NumFastOther; - MadeChange = true; + } else { + // Not a loading instruction. continue; } - - if (!killPointer) - continue; - killPointer = killPointer->getUnderlyingObject(); + KillPointer = KillPointer->getUnderlyingObject(); // Deal with undead pointers - MadeChange |= RemoveUndeadPointers(killPointer, killPointerSize, BBI, - deadPointers); + MadeChange |= RemoveUndeadPointers(KillPointer, KillPointerSize, BBI, + DeadPointers); } return MadeChange; @@ -546,11 +522,11 @@ bool DSE::handleEndBlock(BasicBlock &BB) { /// undead when scanning for dead stores to alloca's. bool DSE::RemoveUndeadPointers(Value *killPointer, uint64_t killPointerSize, BasicBlock::iterator &BBI, - SmallPtrSet<Value*, 64> &deadPointers) { + SmallPtrSet<Value*, 64> &DeadPointers) { // If the kill pointer can be easily reduced to an alloca, // don't bother doing extraneous AA queries. - if (deadPointers.count(killPointer)) { - deadPointers.erase(killPointer); + if (DeadPointers.count(killPointer)) { + DeadPointers.erase(killPointer); return false; } @@ -562,8 +538,8 @@ bool DSE::RemoveUndeadPointers(Value *killPointer, uint64_t killPointerSize, SmallVector<Value*, 16> undead; - for (SmallPtrSet<Value*, 64>::iterator I = deadPointers.begin(), - E = deadPointers.end(); I != E; ++I) { + for (SmallPtrSet<Value*, 64>::iterator I = DeadPointers.begin(), + E = DeadPointers.end(); I != E; ++I) { // See if this pointer could alias it AliasAnalysis::AliasResult A = AA->alias(*I, getPointerSize(*I, *AA), killPointer, killPointerSize); @@ -574,7 +550,7 @@ bool DSE::RemoveUndeadPointers(Value *killPointer, uint64_t killPointerSize, // Remove it! ++BBI; - DeleteDeadInstruction(S, &deadPointers); + DeleteDeadInstruction(S, &DeadPointers); ++NumFastStores; MadeChange = true; @@ -587,7 +563,7 @@ bool DSE::RemoveUndeadPointers(Value *killPointer, uint64_t killPointerSize, for (SmallVector<Value*, 16>::iterator I = undead.begin(), E = undead.end(); I != E; ++I) - deadPointers.erase(*I); + DeadPointers.erase(*I); return MadeChange; } |