[llvm] [VPlan] Invert condition if needed when creating inner regions. (PR #132292)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 26 15:30:56 PDT 2025
================
@@ -386,33 +386,53 @@ std::unique_ptr<VPlan> VPlanTransforms::buildPlainCFG(
/// Checks if \p HeaderVPB is a loop header block in the plain CFG; that is, it
/// has exactly 2 predecessors (preheader and latch), where the block
/// dominates the latch and the preheader dominates the block. If it is a
-/// header block return true, making sure the preheader appears first and
-/// the latch second. Otherwise return false.
-static bool canonicalHeader(VPBlockBase *HeaderVPB,
- const VPDominatorTree &VPDT) {
+/// header block return true and canonicalize the predecessors of the header
+/// (making sure the preheader appears first and the latch second) and the
+/// successors of the latch (making sure the loop exit comes first). Otherwise
+/// return false.
+static bool canonicalHeaderAndLatch(VPBlockBase *HeaderVPB,
+ const VPDominatorTree &VPDT) {
ArrayRef<VPBlockBase *> Preds = HeaderVPB->getPredecessors();
if (Preds.size() != 2)
return false;
auto *PreheaderVPBB = Preds[0];
auto *LatchVPBB = Preds[1];
- if (VPDT.dominates(PreheaderVPBB, HeaderVPB) &&
- VPDT.dominates(HeaderVPB, LatchVPBB))
- return true;
+ if (!VPDT.dominates(PreheaderVPBB, HeaderVPB) ||
+ !VPDT.dominates(HeaderVPB, LatchVPBB)) {
+ std::swap(PreheaderVPBB, LatchVPBB);
- std::swap(PreheaderVPBB, LatchVPBB);
+ if (!VPDT.dominates(PreheaderVPBB, HeaderVPB) ||
+ !VPDT.dominates(HeaderVPB, LatchVPBB)) {
+ return false;
+ } else {
+ // Canonicalize predecessors of header so that preheader is first and
+ // latch second.
+ HeaderVPB->swapPredecessors();
+ for (VPRecipeBase &R : cast<VPBasicBlock>(HeaderVPB)->phis())
+ R.swapOperands();
+ }
+ }
- if (VPDT.dominates(PreheaderVPBB, HeaderVPB) &&
- VPDT.dominates(HeaderVPB, LatchVPBB)) {
- // Canonicalize predecessors of header so that preheader is first and latch
- // second.
- HeaderVPB->swapPredecessors();
- for (VPRecipeBase &R : cast<VPBasicBlock>(HeaderVPB)->phis())
- R.swapOperands();
- return true;
+ // The two successors of conditional branch match the condition, with the
+ // first successor corresponding to true and the second to false. We
+ // canonicalize the successors of the latch when introducing the region, such
+ // that the latch exits the region when its condition is true; invert the
+ // original condition if the original CFG branches to the header on true.
+ if (!LatchVPBB->getSingleSuccessor() &&
----------------
ayalz wrote:
nit: consider reversing (the above conditional branch which is also terminating ;-) to early-return.
https://github.com/llvm/llvm-project/pull/132292
More information about the llvm-commits
mailing list