[llvm] [DA] Add initial support for monotonicity check (PR #162280)
Ryotaro Kasuga via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 14 11:23:58 PDT 2025
================
@@ -3479,10 +3732,19 @@ bool DependenceInfo::tryDelinearize(Instruction *Src, Instruction *Dst,
// resize Pair to contain as many pairs of subscripts as the delinearization
// has found, and then initialize the pairs following the delinearization.
Pair.resize(Size);
+ SCEVMonotonicityChecker MonChecker(SE);
+ const Loop *OutermostLoop = SrcLoop ? SrcLoop->getOutermostLoop() : nullptr;
for (int I = 0; I < Size; ++I) {
Pair[I].Src = SrcSubscripts[I];
Pair[I].Dst = DstSubscripts[I];
unifySubscriptType(&Pair[I]);
+
+ if (EnableMonotonicityCheck) {
+ if (MonChecker.checkMonotonicity(Pair[I].Src, OutermostLoop).isUnknown())
+ return false;
+ if (MonChecker.checkMonotonicity(Pair[I].Dst, OutermostLoop).isUnknown())
+ return false;
+ }
----------------
kasuga-fj wrote:
Consider the following case ([godbolt](https://godbolt.org/z/Mro9bMrKW)):
```llvm
; char A[][32];
; for (i = 0; i < 1ll << 62; i++)
; for (j = 0; j < 32; j++)
; if (i < (1ll << 57))
; A[i][j] = 0;
define void @outer_loop_may_wrap(ptr %a) {
entry:
br label %loop.i.header
loop.i.header:
%i = phi i64 [ 0, %entry ], [ %i.inc, %loop.i.latch ]
br label %loop.j.header
loop.j.header:
%j = phi i64 [ 0, %loop.i.header ], [ %j.inc, %loop.j.latch ]
%cond = icmp slt i64 %i, 144115188075855872 ; 2^57
br i1 %cond, label %if.then, label %loop.j.latch
if.then:
%gep = getelementptr inbounds [32 x i8], ptr %a, i64 %i, i64 %j
store i8 0, ptr %gep
br label %loop.j.latch
loop.j.latch:
%j.inc = add nuw nsw i64 %j, 1
%ec.j = icmp eq i64 %j.inc, 32
br i1 %ec.j, label %loop.i.latch, label %loop.j.header
loop.i.latch:
%i.inc = add nuw nsw i64 %i, 1
%ec.i = icmp eq i64 %i.inc, 4611686018427387904 ; 2^62
br i1 %ec.i, label %exit, label %loop.i.header
exit:
ret void
}
```
The subscripts `{0,+,1}<nuw><nsw><%loop.i.header>` and `{0,+,1}<nuw><nsw><%loop.j.header>` are monotonic, but the original offset `{{0,+,32}<%loop.i.header>,+,1}<nw><%loop.j.header>` is not.
https://github.com/llvm/llvm-project/pull/162280
More information about the llvm-commits
mailing list