@@ -354,29 +354,7 @@ class DataFlowSolver {
354
354
355
355
// / Erase any analysis state associated with the given lattice anchor.
356
356
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);
380
358
381
359
// / Erase all analysis states.
382
360
void eraseAllStates () {
@@ -560,6 +538,36 @@ class AnalysisState {
560
538
friend class DataFlowSolver ;
561
539
};
562
540
541
+ // ===----------------------------------------------------------------------===//
542
+ // DataFlowSolver definition
543
+ // ===----------------------------------------------------------------------===//
544
+ // This is 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
+
563
571
// ===----------------------------------------------------------------------===//
564
572
// DataFlowAnalysis
565
573
// ===----------------------------------------------------------------------===//
0 commit comments