[llvm] [LAA] Add stencil group merging to reduce runtime pointer checks (PR #187252)

Igor Kirillov via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 28 05:07:34 PDT 2026


================
@@ -3825,3 +3825,75 @@ loop:
 exit:
   ret void
 }
+
+;; Test 29: Reject pointer PHI alternatives from stencil merging.
+;; Non-header pointer PHIs are expanded before runtime checks are created.
+;; An unused alternative may wrap and hide an overlap in the merged range.
+define void @phi_runtime_stride(ptr %a, ptr %out, i64 %s, i1 %choose_bad) {
+; CHECK-LABEL: 'phi_runtime_stride'
+; CHECK-NEXT:    loop:
+; CHECK-NEXT:      Memory dependences are safe with run-time checks
+; CHECK-NEXT:      Dependences:
+; CHECK-NEXT:      Run-time memory checks:
+; CHECK-NEXT:      Check 0:
+; CHECK-NEXT:        Comparing group GRP0:
+; CHECK-NEXT:          %dst = getelementptr i8, ptr %out, i64 %iv
+; CHECK-NEXT:        Against group GRP1:
+; CHECK-NEXT:          %p2 = getelementptr i8, ptr %p0, i64 %neg2
+; CHECK-NEXT:      Check 1:
+; CHECK-NEXT:        Comparing group GRP0:
+; CHECK-NEXT:          %dst = getelementptr i8, ptr %out, i64 %iv
+; CHECK-NEXT:        Against group GRP2:
+; CHECK-NEXT:          %p1 = getelementptr i8, ptr %p0, i64 %neg
+; CHECK-NEXT:      Check 2:
+; CHECK-NEXT:        Comparing group GRP0:
+; CHECK-NEXT:          %dst = getelementptr i8, ptr %out, i64 %iv
+; CHECK-NEXT:        Against group GRP3:
+; CHECK-NEXT:          %p0 = getelementptr i8, ptr %a, i64 %iv
+; CHECK-NEXT:      Grouped accesses:
+; CHECK-NEXT:        Group GRP0:
+; CHECK-NEXT:          (Low: %out High: (64 + %out))
+; CHECK-NEXT:            Member: {%out,+,1}<nw><%loop>
+; CHECK-NEXT:        Group GRP1:
+; CHECK-NEXT:          (Low: ((-2 * %s) + %a) High: (64 + (-2 * %s) + %a))
+; CHECK-NEXT:            Member: {((-2 * %s) + %a),+,1}<nw><%loop>
+; CHECK-NEXT:        Group GRP2:
+; CHECK-NEXT:          (Low: ((-1 * %s) + %a) High: (64 + (-1 * %s) + %a))
+; CHECK-NEXT:            Member: {((-1 * %s) + %a),+,1}<nw><%loop>
+; CHECK-NEXT:        Group GRP3:
+; CHECK-NEXT:          (Low: %a High: (64 + %a))
+; CHECK-NEXT:            Member: {%a,+,1}<nw><%loop>
+; CHECK-EMPTY:
+; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT:      SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT:      Expressions re-written:
+;
+entry:
+  %neg = sub i64 0, %s
+  %neg2 = mul i64 %s, -2
+  br label %loop
+loop:
+  %iv = phi i64 [ 0, %entry ], [ %next, %join ]
+  %p0 = getelementptr i8, ptr %a, i64 %iv
+  %p1 = getelementptr i8, ptr %p0, i64 %neg
+  %p2 = getelementptr i8, ptr %p0, i64 %neg2
+  br i1 %choose_bad, label %bad, label %good
+bad:
----------------
igogo-x86 wrote:

Done

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


More information about the llvm-commits mailing list