diff --git a/mlir/include/mlir/Analysis/DataFlowFramework.h b/mlir/include/mlir/Analysis/DataFlowFramework.h index 49862927caff2..e364570c8b531 100644 --- a/mlir/include/mlir/Analysis/DataFlowFramework.h +++ b/mlir/include/mlir/Analysis/DataFlowFramework.h @@ -354,29 +354,7 @@ class DataFlowSolver { /// Erase any analysis state associated with the given lattice anchor. template - void eraseState(AnchorT anchor) { - LatticeAnchor latticeAnchor(anchor); - - // Update equivalentAnchorMap. - for (auto &&[TypeId, eqClass] : equivalentAnchorMap) { - if (!eqClass.contains(latticeAnchor)) { - continue; - } - llvm::EquivalenceClasses::member_iterator leaderIt = - eqClass.findLeader(latticeAnchor); - - // Update analysis states with new leader if needed. - if (*leaderIt == latticeAnchor && ++leaderIt != eqClass.member_end()) { - analysisStates[*leaderIt][TypeId] = - std::move(analysisStates[latticeAnchor][TypeId]); - } - - eqClass.erase(latticeAnchor); - } - - // Update analysis states. - analysisStates.erase(latticeAnchor); - } + void eraseState(AnchorT anchor); /// Erase all analysis states. void eraseAllStates() { @@ -560,6 +538,36 @@ class AnalysisState { friend class DataFlowSolver; }; +//===----------------------------------------------------------------------===// +// DataFlowSolver definition +//===----------------------------------------------------------------------===// +// This method is defined outside `DataFlowSolver` and after `AnalysisState` +// to prevent issues around `AnalysisState` being used before it is defined. +template +void DataFlowSolver::eraseState(AnchorT anchor) { + LatticeAnchor latticeAnchor(anchor); + + // Update equivalentAnchorMap. + for (auto &&[TypeId, eqClass] : equivalentAnchorMap) { + if (!eqClass.contains(latticeAnchor)) { + continue; + } + llvm::EquivalenceClasses::member_iterator leaderIt = + eqClass.findLeader(latticeAnchor); + + // Update analysis states with new leader if needed. + if (*leaderIt == latticeAnchor && ++leaderIt != eqClass.member_end()) { + analysisStates[*leaderIt][TypeId] = + std::move(analysisStates[latticeAnchor][TypeId]); + } + + eqClass.erase(latticeAnchor); + } + + // Update analysis states. + analysisStates.erase(latticeAnchor); +} + //===----------------------------------------------------------------------===// // DataFlowAnalysis //===----------------------------------------------------------------------===//