@@ -62,6 +62,45 @@ void PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
6262 }
6363}
6464
65+ void PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
66+ LPMUpdater &>::eraseIf(function_ref<bool (StringRef)> Pred) {
67+ assert (LoopPasses.size () + LoopNestPasses.size () == IsLoopNestPass.size () &&
68+ " Wrong precondition!" );
69+
70+ std::vector<char > IsLoopNestPassVec (
71+ static_cast <size_t >(IsLoopNestPass.size ()));
72+ for (unsigned Idx = 0 , Sz = IsLoopNestPass.size (); Idx != Sz; ++Idx)
73+ IsLoopNestPassVec[Idx] = IsLoopNestPass[Idx];
74+
75+ auto ILP = LoopPasses.begin ();
76+ auto ILNP = LoopNestPasses.begin ();
77+ for (auto I = IsLoopNestPassVec.begin (); I != IsLoopNestPassVec.end ();) {
78+ if (*I) {
79+ if (Pred ((*ILNP)->name ())) {
80+ I = IsLoopNestPassVec.erase (I);
81+ ILNP = LoopNestPasses.erase (ILNP);
82+ continue ;
83+ }
84+ ++ILNP;
85+ } else {
86+ if (Pred ((*ILP)->name ())) {
87+ I = IsLoopNestPassVec.erase (I);
88+ ILP = LoopPasses.erase (ILP);
89+ continue ;
90+ }
91+ ++ILP;
92+ }
93+ ++I;
94+ }
95+
96+ IsLoopNestPass.clear ();
97+ for (const auto I : IsLoopNestPassVec)
98+ IsLoopNestPass.push_back (I);
99+
100+ assert (LoopPasses.size () + LoopNestPasses.size () == IsLoopNestPass.size () &&
101+ " Wrong postcondition!" );
102+ }
103+
65104// Run both loop passes and loop-nest passes on top-level loop \p L.
66105PreservedAnalyses
67106LoopPassManager::runWithLoopNestPasses (Loop &L, LoopAnalysisManager &AM,
@@ -359,6 +398,17 @@ PreservedAnalyses FunctionToLoopPassAdaptor::run(Function &F,
359398 return PA;
360399}
361400
401+ void FunctionToLoopPassAdaptor::eraseIf (function_ref<bool (StringRef)> Pred) {
402+ StringRef PassName = Pass->name ();
403+ if (PassName.contains (" PassManager" ) || PassName.ends_with (" PassAdaptor" )) {
404+ Pass->eraseIf (Pred);
405+ if (Pass->isEmpty ())
406+ Pass.reset ();
407+ } else if (Pred (PassName)) {
408+ Pass.reset ();
409+ }
410+ }
411+
362412PrintLoopPass::PrintLoopPass () : OS(dbgs()) {}
363413PrintLoopPass::PrintLoopPass (raw_ostream &OS, const std::string &Banner)
364414 : OS(OS), Banner(Banner) {}
0 commit comments