diff --git a/llvm/include/llvm/ExecutionEngine/Orc/WaitingOnGraph.h b/llvm/include/llvm/ExecutionEngine/Orc/WaitingOnGraph.h index 9f14c8b2efd5f..a7ba79164c471 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/WaitingOnGraph.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/WaitingOnGraph.h @@ -155,22 +155,20 @@ template class WaitingOnGraph { } template void remove(Pred &&Remove) { + std::vector HashesToErase; for (auto &[Hash, SNs] : CanonicalSNs) { - bool Found = false; - for (size_t I = 0; I != SNs.size(); ++I) { + for (size_t I = 0; I != SNs.size();) { if (Remove(SNs[I])) { std::swap(SNs[I], SNs.back()); SNs.pop_back(); - Found = true; - break; - } - } - if (Found) { - if (SNs.empty()) - CanonicalSNs.erase(Hash); - break; + } else + ++I; } + if (SNs.empty()) + HashesToErase.push_back(Hash); } + for (auto Hash : HashesToErase) + CanonicalSNs.erase(Hash); } private: @@ -396,9 +394,14 @@ template class WaitingOnGraph { ++I; } + CoalesceToPendingSNs.remove([&](SuperNode *SN) { + for (auto &E : FailedSNs) + if (E.get() == SN) + return true; + return false; + }); + for (auto &SN : FailedSNs) { - CoalesceToPendingSNs.remove( - [&](SuperNode *SNC) { return SNC == SN.get(); }); for (auto &[Container, Elems] : SN->Defs) { assert(ElemToPendingSN.count(Container)); auto &CElems = ElemToPendingSN[Container];