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


        
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to