aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ScalarEvolution.cpp
diff options
context:
space:
mode:
authorFlorian Hahn <flo@fhahn.com>2023-02-27 20:38:39 +0100
committerFlorian Hahn <flo@fhahn.com>2023-02-27 20:38:39 +0100
commit2f3c748c45ff7f9022ffa88d5a06a856a1b15ace (patch)
tree9c6c762dd4a50109aad8b64a02d7c29ae24be319 /llvm/lib/Analysis/ScalarEvolution.cpp
parent31d6a572579a5d1d9ae14a1a9d4ffbdb1b098e49 (diff)
downloadllvm-2f3c748c45ff7f9022ffa88d5a06a856a1b15ace.zip
llvm-2f3c748c45ff7f9022ffa88d5a06a856a1b15ace.tar.gz
llvm-2f3c748c45ff7f9022ffa88d5a06a856a1b15ace.tar.bz2
[SCEV] Hoist common cleanup code to function. (NFC)
This allows for easier updating of common code in follow-on patches. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D144847
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolution.cpp')
-rw-r--r--llvm/lib/Analysis/ScalarEvolution.cpp49
1 files changed, 21 insertions, 28 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index a820879..f997b19 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -8415,6 +8415,25 @@ void ScalarEvolution::forgetAllLoops() {
FoldCache.clear();
FoldCacheUser.clear();
}
+void ScalarEvolution::visitAndClearUsers(
+ SmallVectorImpl<Instruction *> &Worklist,
+ SmallPtrSetImpl<Instruction *> &Visited,
+ SmallVectorImpl<const SCEV *> &ToForget) {
+ while (!Worklist.empty()) {
+ Instruction *I = Worklist.pop_back_val();
+
+ ValueExprMapType::iterator It =
+ ValueExprMap.find_as(static_cast<Value *>(I));
+ if (It != ValueExprMap.end()) {
+ eraseValueFromMap(It->first);
+ ToForget.push_back(It->second);
+ if (PHINode *PN = dyn_cast<PHINode>(I))
+ ConstantEvolutionLoopExitValue.erase(PN);
+ }
+
+ PushDefUseChildren(I, Worklist, Visited);
+ }
+}
void ScalarEvolution::forgetLoop(const Loop *L) {
SmallVector<const Loop *, 16> LoopWorklist(1, L);
@@ -8448,21 +8467,7 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
// Drop information about expressions based on loop-header PHIs.
PushLoopPHIs(CurrL, Worklist, Visited);
-
- while (!Worklist.empty()) {
- Instruction *I = Worklist.pop_back_val();
-
- ValueExprMapType::iterator It =
- ValueExprMap.find_as(static_cast<Value *>(I));
- if (It != ValueExprMap.end()) {
- eraseValueFromMap(It->first);
- ToForget.push_back(It->second);
- if (PHINode *PN = dyn_cast<PHINode>(I))
- ConstantEvolutionLoopExitValue.erase(PN);
- }
-
- PushDefUseChildren(I, Worklist, Visited);
- }
+ visitAndClearUsers(Worklist, Visited, ToForget);
LoopPropertiesCache.erase(CurrL);
// Forget all contained loops too, to avoid dangling entries in the
@@ -8486,20 +8491,8 @@ void ScalarEvolution::forgetValue(Value *V) {
SmallVector<const SCEV *, 8> ToForget;
Worklist.push_back(I);
Visited.insert(I);
+ visitAndClearUsers(Worklist, Visited, ToForget);
- while (!Worklist.empty()) {
- I = Worklist.pop_back_val();
- ValueExprMapType::iterator It =
- ValueExprMap.find_as(static_cast<Value *>(I));
- if (It != ValueExprMap.end()) {
- eraseValueFromMap(It->first);
- ToForget.push_back(It->second);
- if (PHINode *PN = dyn_cast<PHINode>(I))
- ConstantEvolutionLoopExitValue.erase(PN);
- }
-
- PushDefUseChildren(I, Worklist, Visited);
- }
forgetMemoizedResults(ToForget);
}