Skip to content

Commit dbab339

Browse files
committed
[SCEV][NFC] Apply mass forgetMemoizedResults queries where possible
When forgetting multiple SCEVs, rather than doing this one by one, we can instead use mass updates. We plan to make them more efficient than they are now, potentially improving compile time. Differential Revision: https://reviews.llvm.org/D111602 Reviewed By: reames
1 parent a6096b7 commit dbab339

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4434,6 +4434,7 @@ static void PushDefUseChildren(Instruction *I,
44344434
void ScalarEvolution::forgetSymbolicName(Instruction *PN, const SCEV *SymName) {
44354435
SmallVector<Instruction *, 16> Worklist;
44364436
SmallPtrSet<Instruction *, 8> Visited;
4437+
SmallVector<const SCEV *, 8> ToForget;
44374438
Visited.insert(PN);
44384439
Worklist.push_back(PN);
44394440
while (!Worklist.empty()) {
@@ -4459,12 +4460,13 @@ void ScalarEvolution::forgetSymbolicName(Instruction *PN, const SCEV *SymName) {
44594460
!isa<SCEVUnknown>(Old) ||
44604461
(I != PN && Old == SymName)) {
44614462
eraseValueFromMap(It->first);
4462-
forgetMemoizedResults(Old);
4463+
ToForget.push_back(Old);
44634464
}
44644465
}
44654466

44664467
PushDefUseChildren(I, Worklist, Visited);
44674468
}
4469+
forgetMemoizedResults(ToForget);
44684470
}
44694471

44704472
namespace {
@@ -7450,6 +7452,7 @@ ScalarEvolution::getBackedgeTakenInfo(const Loop *L) {
74507452
if (Result.hasAnyInfo()) {
74517453
SmallVector<Instruction *, 16> Worklist;
74527454
SmallPtrSet<Instruction *, 8> Discovered;
7455+
SmallVector<const SCEV *, 8> ToForget;
74537456
PushLoopPHIs(L, Worklist, Discovered);
74547457
while (!Worklist.empty()) {
74557458
Instruction *I = Worklist.pop_back_val();
@@ -7467,7 +7470,7 @@ ScalarEvolution::getBackedgeTakenInfo(const Loop *L) {
74677470
// own when it gets to that point.
74687471
if (!isa<PHINode>(I) || !isa<SCEVUnknown>(Old)) {
74697472
eraseValueFromMap(It->first);
7470-
forgetMemoizedResults(Old);
7473+
ToForget.push_back(Old);
74717474
}
74727475
if (PHINode *PN = dyn_cast<PHINode>(I))
74737476
ConstantEvolutionLoopExitValue.erase(PN);
@@ -7499,6 +7502,7 @@ ScalarEvolution::getBackedgeTakenInfo(const Loop *L) {
74997502
Worklist.push_back(I);
75007503
}
75017504
}
7505+
forgetMemoizedResults(ToForget);
75027506
}
75037507

75047508
// Re-lookup the insert position, since the call to
@@ -7535,6 +7539,7 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
75357539
SmallVector<const Loop *, 16> LoopWorklist(1, L);
75367540
SmallVector<Instruction *, 32> Worklist;
75377541
SmallPtrSet<Instruction *, 16> Visited;
7542+
SmallVector<const SCEV *, 16> ToForget;
75387543

75397544
// Iterate over all the loops and sub-loops to drop SCEV information.
75407545
while (!LoopWorklist.empty()) {
@@ -7556,8 +7561,8 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
75567561

75577562
auto LoopUsersItr = LoopUsers.find(CurrL);
75587563
if (LoopUsersItr != LoopUsers.end()) {
7559-
for (auto *S : LoopUsersItr->second)
7560-
forgetMemoizedResults(S);
7564+
ToForget.insert(ToForget.end(), LoopUsersItr->second.begin(),
7565+
LoopUsersItr->second.end());
75617566
LoopUsers.erase(LoopUsersItr);
75627567
}
75637568

@@ -7571,7 +7576,7 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
75717576
ValueExprMap.find_as(static_cast<Value *>(I));
75727577
if (It != ValueExprMap.end()) {
75737578
eraseValueFromMap(It->first);
7574-
forgetMemoizedResults(It->second);
7579+
ToForget.push_back(It->second);
75757580
if (PHINode *PN = dyn_cast<PHINode>(I))
75767581
ConstantEvolutionLoopExitValue.erase(PN);
75777582
}
@@ -7584,6 +7589,7 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
75847589
// ValuesAtScopes map.
75857590
LoopWorklist.append(CurrL->begin(), CurrL->end());
75867591
}
7592+
forgetMemoizedResults(ToForget);
75877593
}
75887594

75897595
void ScalarEvolution::forgetTopmostLoop(const Loop *L) {
@@ -7599,6 +7605,7 @@ void ScalarEvolution::forgetValue(Value *V) {
75997605
// Drop information about expressions based on loop-header PHIs.
76007606
SmallVector<Instruction *, 16> Worklist;
76017607
SmallPtrSet<Instruction *, 8> Visited;
7608+
SmallVector<const SCEV *, 8> ToForget;
76027609
Worklist.push_back(I);
76037610
Visited.insert(I);
76047611

@@ -7608,13 +7615,14 @@ void ScalarEvolution::forgetValue(Value *V) {
76087615
ValueExprMap.find_as(static_cast<Value *>(I));
76097616
if (It != ValueExprMap.end()) {
76107617
eraseValueFromMap(It->first);
7611-
forgetMemoizedResults(It->second);
7618+
ToForget.push_back(It->second);
76127619
if (PHINode *PN = dyn_cast<PHINode>(I))
76137620
ConstantEvolutionLoopExitValue.erase(PN);
76147621
}
76157622

76167623
PushDefUseChildren(I, Worklist, Visited);
76177624
}
7625+
forgetMemoizedResults(ToForget);
76187626
}
76197627

76207628
void ScalarEvolution::forgetLoopDispositions(const Loop *L) {

0 commit comments

Comments
 (0)