[llvm] [LoopFusion] Simplifying the legality checks (PR #171889)
Alireza Torabian via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 11 13:50:28 PST 2025
================
@@ -381,86 +378,15 @@ struct FusionCandidate {
return false;
}
};
-
-struct FusionCandidateCompare {
- /// Comparison functor to sort two Control Flow Equivalent fusion candidates
- /// into dominance order.
- /// If LHS dominates RHS and RHS post-dominates LHS, return true;
- /// If RHS dominates LHS and LHS post-dominates RHS, return false;
- /// If both LHS and RHS are not dominating each other then, non-strictly
- /// post dominate check will decide the order of candidates. If RHS
- /// non-strictly post dominates LHS then, return true. If LHS non-strictly
- /// post dominates RHS then, return false. If both are non-strictly post
- /// dominate each other then, level in the post dominator tree will decide
- /// the order of candidates.
- bool operator()(const FusionCandidate &LHS,
- const FusionCandidate &RHS) const {
- const DominatorTree *DT = &(LHS.DT);
-
- BasicBlock *LHSEntryBlock = LHS.getEntryBlock();
- BasicBlock *RHSEntryBlock = RHS.getEntryBlock();
-
- // Do not save PDT to local variable as it is only used in asserts and thus
- // will trigger an unused variable warning if building without asserts.
- assert(DT && LHS.PDT && "Expecting valid dominator tree");
-
- // Do this compare first so if LHS == RHS, function returns false.
- if (DT->dominates(RHSEntryBlock, LHSEntryBlock)) {
- // RHS dominates LHS
- // Verify LHS post-dominates RHS
- assert(LHS.PDT->dominates(LHSEntryBlock, RHSEntryBlock));
- return false;
- }
-
- if (DT->dominates(LHSEntryBlock, RHSEntryBlock)) {
- // Verify RHS Postdominates LHS
- assert(LHS.PDT->dominates(RHSEntryBlock, LHSEntryBlock));
- return true;
- }
-
- // If two FusionCandidates are in the same level of dominator tree,
- // they will not dominate each other, but may still be control flow
- // equivalent. To sort those FusionCandidates, nonStrictlyPostDominate()
- // function is needed.
- bool WrongOrder =
- nonStrictlyPostDominate(LHSEntryBlock, RHSEntryBlock, DT, LHS.PDT);
- bool RightOrder =
- nonStrictlyPostDominate(RHSEntryBlock, LHSEntryBlock, DT, LHS.PDT);
- if (WrongOrder && RightOrder) {
- // If common predecessor of LHS and RHS post dominates both
- // FusionCandidates then, Order of FusionCandidate can be
- // identified by its level in post dominator tree.
- DomTreeNode *LNode = LHS.PDT->getNode(LHSEntryBlock);
- DomTreeNode *RNode = LHS.PDT->getNode(RHSEntryBlock);
- return LNode->getLevel() > RNode->getLevel();
- } else if (WrongOrder)
- return false;
- else if (RightOrder)
- return true;
-
- // If LHS does not non-strict Postdominate RHS and RHS does not non-strict
- // Postdominate LHS then, there is no dominance relationship between the
- // two FusionCandidates. Thus, they should not be in the same set together.
- llvm_unreachable(
- "No dominance relationship between these fusion candidates!");
- }
-};
} // namespace
using LoopVector = SmallVector<Loop *, 4>;
-// Set of Control Flow Equivalent (CFE) Fusion Candidates, sorted in dominance
-// order. Thus, if FC0 comes *before* FC1 in a FusionCandidateSet, then FC0
-// dominates FC1 and FC1 post-dominates FC0.
-// std::set was chosen because we want a sorted data structure with stable
-// iterators. A subsequent patch to loop fusion will enable fusing non-adjacent
-// loops by moving intervening code around. When this intervening code contains
-// loops, those loops will be moved also. The corresponding FusionCandidates
-// will also need to be moved accordingly. As this is done, having stable
-// iterators will simplify the logic. Similarly, having an efficient insert that
-// keeps the FusionCandidateSet sorted will also simplify the implementation.
-using FusionCandidateSet = std::set<FusionCandidate, FusionCandidateCompare>;
-using FusionCandidateCollection = SmallVector<FusionCandidateSet, 4>;
+// List of adjacent Fusion Candidates in order. Thus, if FC0 comes *before* FC1
+// in a FusionCandidateList, then FC0 dominates FC1, FC1 post-dominates FC0,
+// and they are sequential.
----------------
1997alireza wrote:
Same meaning as adjacent. Changed it to adjacent to keep the consistency.
https://github.com/llvm/llvm-project/pull/171889
More information about the llvm-commits
mailing list