[llvm-commits] [llvm] r39789 - /llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp
Owen Anderson
resistor at mac.com
Thu Jul 12 11:08:51 PDT 2007
Author: resistor
Date: Thu Jul 12 13:08:51 2007
New Revision: 39789
URL: http://llvm.org/viewvc/llvm-project?rev=39789&view=rev
Log:
Make the condition-checking for free with non-trivial dependencies more correct.
Modified:
llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp?rev=39789&r1=39788&r2=39789&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/FastDSE.cpp Thu Jul 12 13:08:51 2007
@@ -46,9 +46,8 @@
}
bool runOnBasicBlock(BasicBlock &BB);
- bool handleFreeWithNonTrivialDependency(FreeInst* F, StoreInst* dependency,
+ bool handleFreeWithNonTrivialDependency(FreeInst* F, Instruction* dependency,
SetVector<Instruction*>& possiblyDead);
- bool handleEndBlock(BasicBlock& BB, SetVector<Instruction*>& possiblyDead);
void DeleteDeadInstructionChains(Instruction *I,
SetVector<Instruction*> &DeadInsts);
@@ -91,6 +90,7 @@
assert(pointer && "Not a free or a store?");
StoreInst*& last = lastStore[pointer];
+ bool deletedStore = false;
// ... to a pointer that has been stored to before...
if (last) {
@@ -107,13 +107,17 @@
last->eraseFromParent();
NumFastStores++;
+ deletedStore = true;
MadeChange = true;
-
- // If this is a free, check for a non-trivial dependency
- } else if (FreeInst* F = dyn_cast<FreeInst>(BBI))
- MadeChange |= handleFreeWithNonTrivialDependency(F, last, possiblyDead);
+ }
}
+ // Handle frees whose dependencies are non-trivial
+ if (FreeInst* F = dyn_cast<FreeInst>(BBI))
+ if (!deletedStore)
+ MadeChange |= handleFreeWithNonTrivialDependency(F, MD.getDependency(F),
+ possiblyDead);
+
// Update our most-recent-store map
if (StoreInst* S = dyn_cast<StoreInst>(BBI))
last = S;
@@ -134,12 +138,20 @@
/// handleFreeWithNonTrivialDependency - Handle frees of entire structures whose
/// dependency is a store to a field of that structure
-bool FDSE::handleFreeWithNonTrivialDependency(FreeInst* F, StoreInst* dependency,
+bool FDSE::handleFreeWithNonTrivialDependency(FreeInst* F, Instruction* dep,
SetVector<Instruction*>& possiblyDead) {
TargetData &TD = getAnalysis<TargetData>();
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
+ if (dep == MemoryDependenceAnalysis::None ||
+ dep == MemoryDependenceAnalysis::NonLocal)
+ return false;
+
+ StoreInst* dependency = dyn_cast<StoreInst>(dep);
+ if (!dependency)
+ return false;
+
Value* depPointer = dependency->getPointerOperand();
unsigned depPointerSize = TD.getTypeSize(dependency->getOperand(0)->getType());
More information about the llvm-commits
mailing list