aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/Scalar/DeadStoreElimination.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-11-30 00:01:19 +0000
committerChris Lattner <sabre@nondot.org>2010-11-30 00:01:19 +0000
commit0f53f592ad8b81bb5e28e0d0e8b9461ddfa3ae01 (patch)
treeebd4a3941422eed11ba0d7236450843660980325 /lib/Transforms/Scalar/DeadStoreElimination.cpp
parent8e0c7b52877983b4838e54e233449912fc1a2325 (diff)
downloadexternal_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/Scalar/DeadStoreElimination.cpp')
-rw-r--r--lib/Transforms/Scalar/DeadStoreElimination.cpp86
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