diff options
author | Dan Gohman <gohman@apple.com> | 2010-07-29 00:17:55 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-07-29 00:17:55 +0000 |
commit | c6743207e20904008d2de016adfa6b0a9355c0e7 (patch) | |
tree | 8f727d234ed249b9d463ddf3c4658401a81dd93a /include/llvm/Analysis/ScalarEvolutionExpressions.h | |
parent | e2fb451dbb50d9b1b4254f5acc7c98b1a8ebd3cf (diff) |
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.h | 21 |
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; } |