[llvm-branch-commits] [llvm] db8a613 - Revert "[VPlan] Refine hasEarlyExit check. (#207791)"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jul 6 13:49:41 PDT 2026
Author: Florian Hahn
Date: 2026-07-06T21:49:37+01:00
New Revision: db8a613f9129a8465a10a239a2bbe4d474ef2d9f
URL: https://github.com/llvm/llvm-project/commit/db8a613f9129a8465a10a239a2bbe4d474ef2d9f
DIFF: https://github.com/llvm/llvm-project/commit/db8a613f9129a8465a10a239a2bbe4d474ef2d9f.diff
LOG: Revert "[VPlan] Refine hasEarlyExit check. (#207791)"
This reverts commit e64a71f09b016edb834eb45e5c172d1337555803.
Added:
Modified:
llvm/lib/Transforms/Vectorize/VPlan.h
llvm/test/Transforms/LoopVectorize/early_exit_with_outer_loop.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index 7d5b5fb7b1461..b2d179d8e6d98 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -5125,24 +5125,15 @@ class VPlan {
/// and deleted once the VPlan is destroyed.
LLVM_ABI_FOR_TEST VPIRBasicBlock *createVPIRBasicBlock(BasicBlock *IRBB);
- /// Returns true if the VPlan is based on a loop with an early exit
+ /// Returns true if the VPlan is based on a loop with an early exit. That is
+ /// the case if the VPlan has either more than one exit block or a single exit
+ /// block with multiple predecessors (one for the exit via the latch and one
+ /// via the other early exit).
bool hasEarlyExit() const {
- unsigned NumExitPredecessors =
- sum_of(map_range(ExitBlocks, [](VPIRBasicBlock *EB) {
- return EB->getNumPredecessors();
- }));
-
- // If the scalar preheader executes unconditionally, there's no branch from
- // middle block to any exit. If there is any edge to an exit block
- // remaining, it must be an early exit.
- VPBasicBlock *ScalarPH = getScalarPreheader();
- if (ScalarPH && ScalarPH->hasPredecessors() &&
- ScalarPH->getSinglePredecessor()->getNumSuccessors() == 1)
- return NumExitPredecessors >= 1;
-
- // Otherwise there must be at least 2 edges to exit blocks (from the middle
- // block and the early exiting edge).
- return NumExitPredecessors > 1;
+ return count_if(ExitBlocks,
+ [](VPIRBasicBlock *EB) { return EB->hasPredecessors(); }) >
+ 1 ||
+ (ExitBlocks.size() == 1 && ExitBlocks[0]->getNumPredecessors() > 1);
}
/// Returns true if the scalar tail may execute after the vector loop, i.e.
diff --git a/llvm/test/Transforms/LoopVectorize/early_exit_with_outer_loop.ll b/llvm/test/Transforms/LoopVectorize/early_exit_with_outer_loop.ll
index 69ef9f3e530ad..d244adcc259c0 100644
--- a/llvm/test/Transforms/LoopVectorize/early_exit_with_outer_loop.ll
+++ b/llvm/test/Transforms/LoopVectorize/early_exit_with_outer_loop.ll
@@ -92,39 +92,6 @@ loop.outer.latch:
br label %loop.outer
}
-; Test LoopInfo is fixed up to remove the early-exit dispatch block from the
-; outer loop, even though the fully vectorized inner loop's countable exit
-; becomes an exit block without predecessors.
-define void @early_exit_dispatch_in_outer_loop(i1 %c) {
-; CHECK-LABEL: Loop info for function 'early_exit_dispatch_in_outer_loop':
-; CHECK: Loop at depth 1 containing: %outer.header<header>,%inner.header<exiting>,%inner.search<exiting>,%inner.latch,%outer.header.loopexit<latch>,%scalar.ph,%vector.ph,%vector.body<exiting>,%vector.body.interim,%middle.block
-; CHECK: Loop at depth 2 containing: %inner.header<header><exiting>,%inner.search<exiting>,%inner.latch<latch><exiting>
-; CHECK: Loop at depth 2 containing: %vector.body<header><exiting>,%vector.body.interim<latch><exiting>
-entry:
- br label %outer.header
-
-outer.header:
- br label %inner.header
-
-inner.header:
- %iv = phi i64 [ %iv.next, %inner.latch ], [ 0, %outer.header ]
- %iv.next = add i64 %iv, 1
- br i1 %c, label %exit, label %inner.search
-
-inner.search:
- %lo = icmp ult i64 %iv, 1
- %hi = icmp ugt i64 %iv, 100
- %early = or i1 %lo, %hi
- br i1 %early, label %inner.latch, label %exit
-
-inner.latch:
- %outer.cond = icmp ugt i64 %iv, 200
- br i1 %outer.cond, label %outer.header, label %inner.header
-
-exit:
- ret void
-}
-
define i32 @early_exit_branch_to_outer_header() {
; CHECK-LABEL: Loop info for function 'early_exit_branch_to_outer_header':
; CHECK-NEXT: Loop at depth 1 containing: %outer.header<header>,%outer.header.loopexit<latch>,%vector.ph,%vector.body,%vector.body.interim<exiting>,%vector.early.exit
More information about the llvm-branch-commits
mailing list