diff options
author | Chris Lattner <sabre@nondot.org> | 2010-11-30 00:01:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-11-30 00:01:19 +0000 |
commit | 0f53f592ad8b81bb5e28e0d0e8b9461ddfa3ae01 (patch) | |
tree | ebd4a3941422eed11ba0d7236450843660980325 /lib/Transforms | |
parent | 8e0c7b52877983b4838e54e233449912fc1a2325 (diff) | |
download | external_llvm-0f53f592ad8b81bb5e28e0d0e8b9461ddfa3ae01.zip external_llvm-0f53f592ad8b81bb5e28e0d0e8b9461ddfa3ae01.tar.gz external_llvm-0f53f592ad8b81bb5e28e0d0e8b9461ddfa3ae01.tar.bz2 |
two changes to DSE that shouldn't affect anything:
1. Don't bother trying to optimize:
lifetime.end(ptr)
store(ptr)
as it is undefined, and therefore shouldn't exist.
2. Move the 'storing a loaded pointer' xform up, simplifying
the may-aliased store code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120359 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/DeadStoreElimination.cpp | 86 |
1 files changed, 28 insertions, 58 deletions
diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index 4540ccc..e1d89cb 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -204,10 +204,10 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { // If we find a store or a free, get its memory dependence. if (!doesClobberMemory(Inst) && !isFreeCall(Inst)) continue; - + MemDepResult InstDep = MD.getDependency(Inst); - // Ignore non-local stores. + // Ignore non-local store liveness. // FIXME: cross-block DSE would be fun. :) if (InstDep.isNonLocal()) continue; @@ -216,7 +216,30 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { MadeChange |= handleFreeWithNonTrivialDependency(F, Inst, InstDep); continue; } - + + // If we're storing the same value back to a pointer that we just + // loaded from, then the store can be removed. + if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) { + if (LoadInst *DepLoad = dyn_cast<LoadInst>(InstDep.getInst())) { + if (SI->getPointerOperand() == DepLoad->getPointerOperand() && + SI->getOperand(0) == DepLoad) { + // DeleteDeadInstruction can delete the current instruction. Save BBI + // in case we need it. + WeakVH NextInst(BBI); + + DeleteDeadInstruction(SI); + + if (NextInst == 0) // Next instruction deleted. + BBI = BB.begin(); + else if (BBI != BB.begin()) // Revisit this instruction if possible. + --BBI; + ++NumFastStores; + MadeChange = true; + continue; + } + } + } + if (!InstDep.isDef()) { // If this is a may-aliased store that is clobbering the store value, we // can keep searching past it for another must-aliased pointer that stores @@ -234,20 +257,13 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { InstDep = MD.getPointerDependencyFrom(Loc, false, InstDep.getInst(), &BB); } - - // If not a definite must-alias store dependency, ignore it. If this is a - // load from the same pointer, we don't want to transform load+store into - // a noop. - if (!InstDep.isDef() || !isa<StoreInst>(InstDep.getInst())) - continue; } // If this is a store-store dependence, then the previous store is dead so // long as this store is at least as big as it. - if (doesClobberMemory(InstDep.getInst())) { + if (InstDep.isDef() && doesClobberMemory(InstDep.getInst())) { Instruction *DepStore = InstDep.getInst(); - if (isStoreAtLeastAsWideAs(Inst, DepStore, TD) && - isElidable(DepStore)) { + if (isStoreAtLeastAsWideAs(Inst, DepStore, TD) && isElidable(DepStore)) { // Delete the store and now-dead instructions that feed it. DeleteDeadInstruction(DepStore); ++NumFastStores; @@ -261,52 +277,6 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { continue; } } - - if (!isElidable(Inst)) - continue; - - // If we're storing the same value back to a pointer that we just - // loaded from, then the store can be removed. - if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) { - if (LoadInst *DepLoad = dyn_cast<LoadInst>(InstDep.getInst())) { - if (SI->getPointerOperand() == DepLoad->getPointerOperand() && - SI->getOperand(0) == DepLoad) { - // DeleteDeadInstruction can delete the current instruction. Save BBI - // in case we need it. - WeakVH NextInst(BBI); - - DeleteDeadInstruction(SI); - - if (NextInst == 0) // Next instruction deleted. - BBI = BB.begin(); - else if (BBI != BB.begin()) // Revisit this instruction if possible. - --BBI; - ++NumFastStores; - MadeChange = true; - continue; - } - } - } - - // If this is a lifetime end marker, we can throw away the store. - if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(InstDep.getInst())) { - if (II->getIntrinsicID() == Intrinsic::lifetime_end) { - // Delete the store and now-dead instructions that feed it. - // DeleteDeadInstruction can delete the current instruction. Save BBI - // in case we need it. - WeakVH NextInst(BBI); - - DeleteDeadInstruction(Inst); - - if (NextInst == 0) // Next instruction deleted. - BBI = BB.begin(); - else if (BBI != BB.begin()) // Revisit this instruction if possible. - --BBI; - ++NumFastStores; - MadeChange = true; - continue; - } - } } // If this block ends in a return, unwind, or unreachable, all allocas are |