aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/LoadValueNumbering.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-05-23 21:13:24 +0000
committerChris Lattner <sabre@nondot.org>2004-05-23 21:13:24 +0000
commit0f312d6998aac8620e6596fd41e472bb76aee6a1 (patch)
tree7546e6ed6ed6767d290c739ec61d2cf6ee375791 /lib/Analysis/LoadValueNumbering.cpp
parentab8c565768ff7485f40cbb65e2914f9046e743d4 (diff)
Implement the interfaces to update value numbering information. Add an
assert. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13679 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/LoadValueNumbering.cpp')
-rw-r--r--lib/Analysis/LoadValueNumbering.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/lib/Analysis/LoadValueNumbering.cpp b/lib/Analysis/LoadValueNumbering.cpp
index 97a57562bd..32d574a55b 100644
--- a/lib/Analysis/LoadValueNumbering.cpp
+++ b/lib/Analysis/LoadValueNumbering.cpp
@@ -56,6 +56,24 @@ namespace {
virtual void getEqualNumberNodes(Value *V1,
std::vector<Value*> &RetVals) const;
+ /// deleteValue - This method should be called whenever an LLVM Value is
+ /// deleted from the program, for example when an instruction is found to be
+ /// redundant and is eliminated.
+ ///
+ virtual void deleteValue(Value *V) {
+ getAnalysis<AliasAnalysis>().deleteValue(V);
+ }
+
+ /// copyValue - This method should be used whenever a preexisting value in
+ /// the program is copied or cloned, introducing a new value. Note that
+ /// analysis implementations should tolerate clients that use this method to
+ /// introduce the same value multiple times: if the analysis already knows
+ /// about a value, it should ignore the request.
+ ///
+ virtual void copyValue(Value *From, Value *To) {
+ getAnalysis<AliasAnalysis>().copyValue(From, To);
+ }
+
/// getCallEqualNumberNodes - Given a call instruction, find other calls
/// that have the same value number.
void getCallEqualNumberNodes(CallInst *CI,
@@ -103,7 +121,7 @@ static bool isPathTransparentTo(BasicBlock *CurBlock, BasicBlock *Dom,
TransparentBlocks.insert(TBI, std::make_pair(CurBlock, false));
return false;
}
- TransparentBlocks.insert(TBI, std::make_pair(CurBlock, true));
+ TransparentBlocks.insert(TBI, std::make_pair(CurBlock, true));
} else if (!TBI->second)
// This block is known non-transparent, so that path can't be either.
return false;
@@ -505,8 +523,12 @@ void LoadVN::getEqualNumberNodes(Value *V,
BasicBlock::iterator BBI = I->first->end();
while (1) {
+ assert(BBI != I->first->begin() &&
+ "There is a store in this block of the pointer, but the store"
+ " doesn't mod the address being stored to?? Must be a bug in"
+ " the alias analysis implementation!");
--BBI;
- if (AA.getModRefInfo(BBI, LoadPtr, LoadSize)& AliasAnalysis::Mod){
+ if (AA.getModRefInfo(BBI, LoadPtr, LoadSize) & AliasAnalysis::Mod) {
// If the invalidating instruction is one of the candidates,
// then it provides the value the load loads.
if (StoreInst *SI = dyn_cast<StoreInst>(BBI))