@@ -4434,6 +4434,7 @@ static void PushDefUseChildren(Instruction *I,
4434
4434
void ScalarEvolution::forgetSymbolicName(Instruction *PN, const SCEV *SymName) {
4435
4435
SmallVector<Instruction *, 16> Worklist;
4436
4436
SmallPtrSet<Instruction *, 8> Visited;
4437
+ SmallVector<const SCEV *, 8> ToForget;
4437
4438
Visited.insert(PN);
4438
4439
Worklist.push_back(PN);
4439
4440
while (!Worklist.empty()) {
@@ -4459,12 +4460,13 @@ void ScalarEvolution::forgetSymbolicName(Instruction *PN, const SCEV *SymName) {
4459
4460
!isa<SCEVUnknown>(Old) ||
4460
4461
(I != PN && Old == SymName)) {
4461
4462
eraseValueFromMap(It->first);
4462
- forgetMemoizedResults (Old);
4463
+ ToForget.push_back (Old);
4463
4464
}
4464
4465
}
4465
4466
4466
4467
PushDefUseChildren(I, Worklist, Visited);
4467
4468
}
4469
+ forgetMemoizedResults(ToForget);
4468
4470
}
4469
4471
4470
4472
namespace {
@@ -7450,6 +7452,7 @@ ScalarEvolution::getBackedgeTakenInfo(const Loop *L) {
7450
7452
if (Result.hasAnyInfo()) {
7451
7453
SmallVector<Instruction *, 16> Worklist;
7452
7454
SmallPtrSet<Instruction *, 8> Discovered;
7455
+ SmallVector<const SCEV *, 8> ToForget;
7453
7456
PushLoopPHIs(L, Worklist, Discovered);
7454
7457
while (!Worklist.empty()) {
7455
7458
Instruction *I = Worklist.pop_back_val();
@@ -7467,7 +7470,7 @@ ScalarEvolution::getBackedgeTakenInfo(const Loop *L) {
7467
7470
// own when it gets to that point.
7468
7471
if (!isa<PHINode>(I) || !isa<SCEVUnknown>(Old)) {
7469
7472
eraseValueFromMap(It->first);
7470
- forgetMemoizedResults (Old);
7473
+ ToForget.push_back (Old);
7471
7474
}
7472
7475
if (PHINode *PN = dyn_cast<PHINode>(I))
7473
7476
ConstantEvolutionLoopExitValue.erase(PN);
@@ -7499,6 +7502,7 @@ ScalarEvolution::getBackedgeTakenInfo(const Loop *L) {
7499
7502
Worklist.push_back(I);
7500
7503
}
7501
7504
}
7505
+ forgetMemoizedResults(ToForget);
7502
7506
}
7503
7507
7504
7508
// Re-lookup the insert position, since the call to
@@ -7535,6 +7539,7 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
7535
7539
SmallVector<const Loop *, 16> LoopWorklist(1, L);
7536
7540
SmallVector<Instruction *, 32> Worklist;
7537
7541
SmallPtrSet<Instruction *, 16> Visited;
7542
+ SmallVector<const SCEV *, 16> ToForget;
7538
7543
7539
7544
// Iterate over all the loops and sub-loops to drop SCEV information.
7540
7545
while (!LoopWorklist.empty()) {
@@ -7556,8 +7561,8 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
7556
7561
7557
7562
auto LoopUsersItr = LoopUsers.find(CurrL);
7558
7563
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() );
7561
7566
LoopUsers.erase(LoopUsersItr);
7562
7567
}
7563
7568
@@ -7571,7 +7576,7 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
7571
7576
ValueExprMap.find_as(static_cast<Value *>(I));
7572
7577
if (It != ValueExprMap.end()) {
7573
7578
eraseValueFromMap(It->first);
7574
- forgetMemoizedResults (It->second);
7579
+ ToForget.push_back (It->second);
7575
7580
if (PHINode *PN = dyn_cast<PHINode>(I))
7576
7581
ConstantEvolutionLoopExitValue.erase(PN);
7577
7582
}
@@ -7584,6 +7589,7 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
7584
7589
// ValuesAtScopes map.
7585
7590
LoopWorklist.append(CurrL->begin(), CurrL->end());
7586
7591
}
7592
+ forgetMemoizedResults(ToForget);
7587
7593
}
7588
7594
7589
7595
void ScalarEvolution::forgetTopmostLoop(const Loop *L) {
@@ -7599,6 +7605,7 @@ void ScalarEvolution::forgetValue(Value *V) {
7599
7605
// Drop information about expressions based on loop-header PHIs.
7600
7606
SmallVector<Instruction *, 16> Worklist;
7601
7607
SmallPtrSet<Instruction *, 8> Visited;
7608
+ SmallVector<const SCEV *, 8> ToForget;
7602
7609
Worklist.push_back(I);
7603
7610
Visited.insert(I);
7604
7611
@@ -7608,13 +7615,14 @@ void ScalarEvolution::forgetValue(Value *V) {
7608
7615
ValueExprMap.find_as(static_cast<Value *>(I));
7609
7616
if (It != ValueExprMap.end()) {
7610
7617
eraseValueFromMap(It->first);
7611
- forgetMemoizedResults (It->second);
7618
+ ToForget.push_back (It->second);
7612
7619
if (PHINode *PN = dyn_cast<PHINode>(I))
7613
7620
ConstantEvolutionLoopExitValue.erase(PN);
7614
7621
}
7615
7622
7616
7623
PushDefUseChildren(I, Worklist, Visited);
7617
7624
}
7625
+ forgetMemoizedResults(ToForget);
7618
7626
}
7619
7627
7620
7628
void ScalarEvolution::forgetLoopDispositions(const Loop *L) {
0 commit comments