@@ -354,29 +354,7 @@ class DataFlowSolver {
354354
355355 // / Erase any analysis state associated with the given lattice anchor.
356356 template <typename AnchorT>
357- void eraseState (AnchorT anchor) {
358- LatticeAnchor latticeAnchor (anchor);
359-
360- // Update equivalentAnchorMap.
361- for (auto &&[TypeId, eqClass] : equivalentAnchorMap) {
362- if (!eqClass.contains (latticeAnchor)) {
363- continue ;
364- }
365- llvm::EquivalenceClasses<LatticeAnchor>::member_iterator leaderIt =
366- eqClass.findLeader (latticeAnchor);
367-
368- // Update analysis states with new leader if needed.
369- if (*leaderIt == latticeAnchor && ++leaderIt != eqClass.member_end ()) {
370- analysisStates[*leaderIt][TypeId] =
371- std::move (analysisStates[latticeAnchor][TypeId]);
372- }
373-
374- eqClass.erase (latticeAnchor);
375- }
376-
377- // Update analysis states.
378- analysisStates.erase (latticeAnchor);
379- }
357+ void eraseState (AnchorT anchor);
380358
381359 // / Erase all analysis states.
382360 void eraseAllStates () {
@@ -560,6 +538,36 @@ class AnalysisState {
560538 friend class DataFlowSolver ;
561539};
562540
541+ // ===----------------------------------------------------------------------===//
542+ // DataFlowSolver definition
543+ // ===----------------------------------------------------------------------===//
544+ // This method is defined outside `DataFlowSolver` and after `AnalysisState`
545+ // to prevent issues around `AnalysisState` being used before it is defined.
546+ template <typename AnchorT>
547+ void DataFlowSolver::eraseState (AnchorT anchor) {
548+ LatticeAnchor latticeAnchor (anchor);
549+
550+ // Update equivalentAnchorMap.
551+ for (auto &&[TypeId, eqClass] : equivalentAnchorMap) {
552+ if (!eqClass.contains (latticeAnchor)) {
553+ continue ;
554+ }
555+ llvm::EquivalenceClasses<LatticeAnchor>::member_iterator leaderIt =
556+ eqClass.findLeader (latticeAnchor);
557+
558+ // Update analysis states with new leader if needed.
559+ if (*leaderIt == latticeAnchor && ++leaderIt != eqClass.member_end ()) {
560+ analysisStates[*leaderIt][TypeId] =
561+ std::move (analysisStates[latticeAnchor][TypeId]);
562+ }
563+
564+ eqClass.erase (latticeAnchor);
565+ }
566+
567+ // Update analysis states.
568+ analysisStates.erase (latticeAnchor);
569+ }
570+
563571// ===----------------------------------------------------------------------===//
564572// DataFlowAnalysis
565573// ===----------------------------------------------------------------------===//
0 commit comments