[llvm] r312920 - [ScalarEvolution] Refactor forgetLoop() to improve performance
Marcello Maggioni via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 11 08:44:20 PDT 2017
Author: mggm
Date: Mon Sep 11 08:44:20 2017
New Revision: 312920
URL: http://llvm.org/viewvc/llvm-project?rev=312920&view=rev
Log:
[ScalarEvolution] Refactor forgetLoop() to improve performance
forgetLoop() has pretty bad performance because it goes over
the same instructions over and over again in particular when
nested loop are involved.
The refactoring changes the function to a not-recursive function
and reusing the allocation for data-structures and the Visited
set.
NFCI
Differential Revision: https://reviews.llvm.org/D37659
Modified:
llvm/trunk/lib/Analysis/ScalarEvolution.cpp
Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=312920&r1=312919&r2=312920&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Mon Sep 11 08:44:20 2017
@@ -6353,7 +6353,7 @@ ScalarEvolution::getBackedgeTakenInfo(co
void ScalarEvolution::forgetLoop(const Loop *L) {
// Drop any stored trip count value.
auto RemoveLoopFromBackedgeMap =
- [L](DenseMap<const Loop *, BackedgeTakenInfo> &Map) {
+ [](DenseMap<const Loop *, BackedgeTakenInfo> &Map, const Loop *L) {
auto BTCPos = Map.find(L);
if (BTCPos != Map.end()) {
BTCPos->second.clear();
@@ -6361,53 +6361,58 @@ void ScalarEvolution::forgetLoop(const L
}
};
- RemoveLoopFromBackedgeMap(BackedgeTakenCounts);
- RemoveLoopFromBackedgeMap(PredicatedBackedgeTakenCounts);
+ SmallVector<const Loop *, 16> LoopWorklist(1, L);
+ SmallVector<Instruction *, 32> Worklist;
+ SmallPtrSet<Instruction *, 16> Visited;
+
+ // Iterate over all the loops and sub-loops to drop SCEV information.
+ while (!LoopWorklist.empty()) {
+ auto *CurrL = LoopWorklist.pop_back_val();
+
+ RemoveLoopFromBackedgeMap(BackedgeTakenCounts, CurrL);
+ RemoveLoopFromBackedgeMap(PredicatedBackedgeTakenCounts, CurrL);
+
+ // Drop information about predicated SCEV rewrites for this loop.
+ for (auto I = PredicatedSCEVRewrites.begin();
+ I != PredicatedSCEVRewrites.end();) {
+ std::pair<const SCEV *, const Loop *> Entry = I->first;
+ if (Entry.second == CurrL)
+ PredicatedSCEVRewrites.erase(I++);
+ else
+ ++I;
+ }
- // Drop information about predicated SCEV rewrites for this loop.
- for (auto I = PredicatedSCEVRewrites.begin();
- I != PredicatedSCEVRewrites.end();) {
- std::pair<const SCEV *, const Loop *> Entry = I->first;
- if (Entry.second == L)
- PredicatedSCEVRewrites.erase(I++);
- else
- ++I;
- }
+ // Drop information about expressions based on loop-header PHIs.
+ PushLoopPHIs(CurrL, Worklist);
- // Drop information about expressions based on loop-header PHIs.
- SmallVector<Instruction *, 16> Worklist;
- PushLoopPHIs(L, Worklist);
-
- SmallPtrSet<Instruction *, 8> Visited;
- while (!Worklist.empty()) {
- Instruction *I = Worklist.pop_back_val();
- if (!Visited.insert(I).second)
- continue;
-
- ValueExprMapType::iterator It =
- ValueExprMap.find_as(static_cast<Value *>(I));
- if (It != ValueExprMap.end()) {
- eraseValueFromMap(It->first);
- forgetMemoizedResults(It->second);
- if (PHINode *PN = dyn_cast<PHINode>(I))
- ConstantEvolutionLoopExitValue.erase(PN);
+ while (!Worklist.empty()) {
+ Instruction *I = Worklist.pop_back_val();
+ if (!Visited.insert(I).second)
+ continue;
+
+ ValueExprMapType::iterator It =
+ ValueExprMap.find_as(static_cast<Value *>(I));
+ if (It != ValueExprMap.end()) {
+ eraseValueFromMap(It->first);
+ forgetMemoizedResults(It->second);
+ if (PHINode *PN = dyn_cast<PHINode>(I))
+ ConstantEvolutionLoopExitValue.erase(PN);
+ }
+
+ PushDefUseChildren(I, Worklist);
}
- PushDefUseChildren(I, Worklist);
- }
+ for (auto I = ExitLimits.begin(); I != ExitLimits.end(); ++I) {
+ auto &Query = I->first;
+ if (Query.L == CurrL)
+ ExitLimits.erase(I);
+ }
- for (auto I = ExitLimits.begin(); I != ExitLimits.end(); ++I) {
- auto &Query = I->first;
- if (Query.L == L)
- ExitLimits.erase(I);
+ LoopPropertiesCache.erase(CurrL);
+ // Forget all contained loops too, to avoid dangling entries in the
+ // ValuesAtScopes map.
+ LoopWorklist.append(CurrL->begin(), CurrL->end());
}
-
- // Forget all contained loops too, to avoid dangling entries in the
- // ValuesAtScopes map.
- for (Loop *I : *L)
- forgetLoop(I);
-
- LoopPropertiesCache.erase(L);
}
void ScalarEvolution::forgetValue(Value *V) {
More information about the llvm-commits
mailing list