[llvm] [LV] Avoid bailing on SCEVUnknown in uniformity-rew (PR #160144)

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 29 12:34:54 PDT 2025


================
@@ -528,14 +528,6 @@ class SCEVAddRecForUniformityRewriter
     return SCEVRewriteVisitor<SCEVAddRecForUniformityRewriter>::visit(S);
   }
 
-  const SCEV *visitUnknown(const SCEVUnknown *S) {
----------------
fhahn wrote:

The load itself would be a SCEVUnknown, which may be the only non-uniform part of the expression we are checking.

Something like below. With the change, I think `%gep.1` will be `(%load / 2) + %src.1` for all lanes and hence treated as uniform, but we could load 0 in iteration 0, 2 in iteration 1, and so on?

```
define void @foo(i32 %x, i64 %y, ptr %src.1, i32 %z, ptr %src.a, ptr noalias %dst, ptr noalias %B2) {
entry:
  br label %loop

loop:
  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
  %gep.B = getelementptr i32, ptr %B2, i64 %iv
  %load  = load i64, ptr %gep.B
  %d = udiv i64 %load, 2
  %gep.1 = getelementptr i32, ptr %src.1, i64 %d
  %5 = load i32, ptr %gep.1, align 4
  %gep.2 = getelementptr i32, ptr %dst, i64 %iv
  store i32 %5, ptr %gep.2
  %iv.next = add i64 %iv, 1
  %ec = icmp eq i64 %iv, %y
  br i1 %ec, label %exit, label %loop

exit:
  ret void
}
```

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


More information about the llvm-commits mailing list