[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:25:39 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
----------------
david-arm wrote:

nit: `Tests when an inner loop ...`

https://github.com/llvm/llvm-project/pull/185618


More information about the llvm-commits mailing list