[llvm] [VPlan] Account for early-exit dispatch blocks when updating LI. (PR #185618)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 10 08:26:00 PDT 2026
================
@@ -119,3 +119,197 @@ loop.latch:
exit:
ret i32 1
}
+
+; Tests that when an early-exit inner loop has multiple exits and all exits
+; leave the outer loop.
+define i32 @multi_early_exit_all_leave_outer_loop(i1 %c) {
+; CHECK-LABEL: Loop info for function 'multi_early_exit_all_leave_outer_loop':
+; CHECK: Loop at depth 1 containing: %outer.header<header>,%outer.latch<latch><exiting>,%vector.ph,%vector.body<exiting>,%vector.body.interim,%middle.block
+; 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 [ 0, %outer.header ], [ %iv.next, %inner.latch ]
+ br i1 %c, label %early.exit.1, label %inner.body
+
+inner.body:
+ %trunc = trunc i64 %iv to i16
+ %cmp = icmp ult i16 %trunc, 0
+ br i1 %cmp, label %early.exit.2, label %inner.latch
+
+inner.latch:
+ %iv.next = add i64 %iv, 1
+ %exit.cond = icmp ult i64 %iv, 1
+ br i1 %exit.cond, label %inner.header, label %outer.latch
+
+outer.latch:
+ br i1 %c, label %early.exit.1, label %outer.header
+
+early.exit.1:
+ ret i32 1
+
+early.exit.2:
+ ret i32 0
+}
+
+; Tests that when an inner loop has two early exits at different loop levels
+; (one staying in the outer loop, one leaving all loops).
+define i32 @multi_early_exit_different_loop_levels(i1 %c) {
+; CHECK-LABEL: Loop info for function 'multi_early_exit_different_loop_levels':
+; CHECK: Loop at depth 1 containing: %outer.header<header>,%early.exit.outer,%outer.latch<latch>,%outer.latch.loopexit,%vector.ph,%vector.body,%vector.body.interim,%middle.block,%vector.early.exit.check<exiting>,%vector.early.exit.0
+; 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 [ 0, %outer.header ], [ %iv.next, %inner.latch ]
+ br i1 %c, label %early.exit.outer, label %inner.body
+
+inner.body:
+ %trunc = trunc i64 %iv to i16
+ %cmp = icmp ult i16 %trunc, 0
----------------
david-arm wrote:
Same comment as in the other test - potentially unstable due to compiler knowing the answer.
https://github.com/llvm/llvm-project/pull/185618
More information about the llvm-commits
mailing list