[llvm] [LV] Use SCEV loop-uniformity for outer-loop branch legality (PR #199632)

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 30 04:09:31 PDT 2026


================
@@ -122,6 +122,67 @@ for.end19:
   ret void
 }
 
+; Case 3: Three-level loop nest with a triangular innermost loop.
+;
+;   #pragma clang loop vectorize(enable) vectorize_width(8)
+;   for (size_t i = 0; i < M; ++i)
+;     for (size_t j = 0; j < N; ++j)
+;       for (size_t k = 0; k < j; ++k)
+;         a[i * N * N + j * N + k] = b[i * N * N + j * N + k];
+;
+; The innermost loop latch condition depends on the middle loop IV, but is
+; uniform with respect to the vectorized outer loop.
+
+; CHECK-LABEL: uniform_triangular_inner_loop
+; CHECK: LV: We can vectorize this outer loop!
+
+define void @uniform_triangular_inner_loop(ptr nocapture %a, ptr nocapture readonly %b, i64 %M, i64 %N) {
+entry:
+  %cmp.m = icmp eq i64 %M, 0
+  br i1 %cmp.m, label %exit, label %outer.ph
+
+outer.ph:
+  %cmp.n = icmp eq i64 %N, 0
+  br label %outer.body
+
+outer.body:
+  %i = phi i64 [ 0, %outer.ph ], [ %i.next, %outer.inc ]
+  br i1 %cmp.n, label %outer.inc, label %middle.body
+
+middle.body:
+  %j = phi i64 [ 0, %outer.body ], [ %j.next, %middle.inc ]
+  %cmp.k = icmp eq i64 %j, 0
+  br i1 %cmp.k, label %middle.inc, label %inner.body
+
+inner.body:
+  %k = phi i64 [ 0, %middle.body ], [ %k.next, %inner.body ]
+  %mul.n.n = mul nuw i64 %N, %N
+  %mul.i = mul nuw i64 %i, %mul.n.n
+  %mul.j = mul nuw i64 %j, %N
+  %add.j = add nuw i64 %mul.i, %mul.j
+  %idx = add nuw i64 %add.j, %k
+  %arrayidx.b = getelementptr inbounds i32, ptr %b, i64 %idx
+  %0 = load i32, ptr %arrayidx.b, align 4
+  %arrayidx.a = getelementptr inbounds i32, ptr %a, i64 %idx
+  store i32 %0, ptr %arrayidx.a, align 4
+  %k.next = add nuw i64 %k, 1
+  %exitcond.k = icmp eq i64 %k.next, %j
+  br i1 %exitcond.k, label %middle.inc, label %inner.body
+
+middle.inc:
+  %j.next = add nuw i64 %j, 1
+  %exitcond.j = icmp eq i64 %j.next, %N
+  br i1 %exitcond.j, label %outer.inc, label %middle.body
+
+outer.inc:
----------------
fhahn wrote:

```suggestion
outer.latch:
```

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


More information about the llvm-commits mailing list