diff options
author | Chris Lattner <sabre@nondot.org> | 2005-01-29 06:42:34 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-01-29 06:42:34 +0000 |
commit | ee379a16ee0c2045122c76ca6c80b794b42c75fd (patch) | |
tree | 9c937d2ad9ab9150a74cdbeb9a1c3381ac495d95 /lib/Analysis/LoadValueNumbering.cpp | |
parent | 4f16bd7a745f99e118eb05b007d5675ada49a377 (diff) |
Properly handle volatile.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19912 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/LoadValueNumbering.cpp')
-rw-r--r-- | lib/Analysis/LoadValueNumbering.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/Analysis/LoadValueNumbering.cpp b/lib/Analysis/LoadValueNumbering.cpp index 5e91be2a84..b33eb4a7f7 100644 --- a/lib/Analysis/LoadValueNumbering.cpp +++ b/lib/Analysis/LoadValueNumbering.cpp @@ -299,12 +299,7 @@ void LoadVN::getEqualNumberNodes(Value *V, bool LoadInvalidatedInBBBefore = false; for (BasicBlock::iterator I = LI; I != LoadBB->begin(); ) { --I; - // If this instruction is a candidate load before LI, we know there are no - // invalidating instructions between it and LI, so they have the same value - // number. - if (isa<LoadInst>(I) && cast<LoadInst>(I)->getOperand(0) == LoadPtr) { - RetVals.push_back(I); - } else if (I == LoadPtr) { + if (I == LoadPtr) { // If we run into an allocation of the value being loaded, then the // contents are not initialized. if (isa<AllocationInst>(I)) @@ -314,14 +309,21 @@ void LoadVN::getEqualNumberNodes(Value *V, // loaded value cannot occur before this block. LoadInvalidatedInBBBefore = true; break; + } else if (LoadInst *LI = dyn_cast<LoadInst>(I)) { + // If this instruction is a candidate load before LI, we know there are no + // invalidating instructions between it and LI, so they have the same + // value number. + if (LI->getOperand(0) == LoadPtr && !LI->isVolatile()) + RetVals.push_back(I); } - + if (AA.getModRefInfo(I, LoadPtr, LoadSize) & AliasAnalysis::Mod) { // If the invalidating instruction is a store, and its in our candidate // set, then we can do store-load forwarding: the load has the same value // # as the stored value. - if (isa<StoreInst>(I) && I->getOperand(1) == LoadPtr) - RetVals.push_back(I->getOperand(0)); + if (StoreInst *SI = dyn_cast<StoreInst>(I)) + if (SI->getOperand(1) == LoadPtr) + RetVals.push_back(I->getOperand(0)); LoadInvalidatedInBBBefore = true; break; |