summaryrefslogtreecommitdiff
path: root/include/llvm/Analysis/ScalarEvolutionExpressions.h
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-07-29 00:17:55 +0000
committerDan Gohman <gohman@apple.com>2010-07-29 00:17:55 +0000
commitc6743207e20904008d2de016adfa6b0a9355c0e7 (patch)
tree8f727d234ed249b9d463ddf3c4658401a81dd93a /include/llvm/Analysis/ScalarEvolutionExpressions.h
parente2fb451dbb50d9b1b4254f5acc7c98b1a8ebd3cf (diff)
downloadllvm-c6743207e20904008d2de016adfa6b0a9355c0e7.tar.gz
llvm-c6743207e20904008d2de016adfa6b0a9355c0e7.tar.bz2
llvm-c6743207e20904008d2de016adfa6b0a9355c0e7.tar.xz
Factor out some of the code for updating old SCEVUnknown values, and
extend it to handle the case where multiple RAUWs affect a single SCEVUnknown. Add a ScalarEvolution unittest to test for this situation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109705 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Analysis/ScalarEvolutionExpressions.h')
-rw-r--r--include/llvm/Analysis/ScalarEvolutionExpressions.h21
1 files changed, 18 insertions, 3 deletions
diff --git a/include/llvm/Analysis/ScalarEvolutionExpressions.h b/include/llvm/Analysis/ScalarEvolutionExpressions.h
index ec4ac071da..03f147e23e 100644
--- a/include/llvm/Analysis/ScalarEvolutionExpressions.h
+++ b/include/llvm/Analysis/ScalarEvolutionExpressions.h
@@ -524,11 +524,26 @@ namespace llvm {
friend class ScalarEvolution;
friend class ScalarEvolution::SCEVCallbackVH;
- // This should be an AssertingVH, however SCEVUnknowns are allocated in a
- // BumpPtrAllocator so their destructors are never called.
+ /// V - The Value represented by this SCEVUnknown.
+ /// This should be an AssertingVH, however SCEVUnknowns are allocated in a
+ /// BumpPtrAllocator so their destructors are never called.
Value *V;
+
+ /// UpdateList - When values are RAUW'd with new values, and the new
+ /// values already have their own SCEVUnknowns, they can end up with
+ /// muliple SCEVUnknowns. This pointer links them all together so that
+ /// they can all be updated when another RAUW happens.
+ SCEVUnknown *UpdateList;
+
+ /// getUpdateListBack - Return the last SCEVUnknown in te UpdateList.
+ SCEVUnknown *getUpdateListBack() {
+ SCEVUnknown *P = this;
+ while (SCEVUnknown *Q = P->UpdateList) P = Q;
+ return P;
+ }
+
SCEVUnknown(const FoldingSetNodeIDRef ID, Value *v) :
- SCEV(ID, scUnknown), V(v) {}
+ SCEV(ID, scUnknown), V(v), UpdateList(0) {}
public:
Value *getValue() const { return V; }