[llvm] [SCEV] Fold (C1 * A /u C2) -> A /u (C2 /u C1), if C2 > C1. (PR #157656)
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 16 04:51:39 PDT 2025
zmodem wrote:
A reduced test case:
```
$ cat /tmp/reduce.ll
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define fastcc i64 @foo(i64 %0) {
%2 = shl i64 %0, 1
%3 = lshr exact i64 %2, 4
%4 = and i64 %3, 1152921504606846974
br label %5
5: ; preds = %5, %1
%6 = phi i64 [ 0, %1 ], [ %8, %5 ]
%7 = phi i64 [ 0, %1 ], [ %9, %5 ]
%8 = add i64 %6, 2
%9 = add i64 %7, 2
%10 = icmp eq i64 %9, %4
br i1 %10, label %.loopexit14, label %5
.loopexit14: ; preds = %5
ret i64 %8
}
```
After this change, loop-reduce will remove the `and`:
```
$ build/bin/opt.bad -S -loop-reduce -o - /tmp/reduce.ll
; ModuleID = '/tmp/reduce.ll'
source_filename = "/tmp/reduce.ll"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define fastcc i64 @foo(i64 %0) {
%2 = shl i64 %0, 1
%3 = lshr exact i64 %2, 4
br label %4
4: ; preds = %4, %1
%5 = phi i64 [ 0, %1 ], [ %6, %4 ]
%6 = add i64 %5, 2
%7 = icmp eq i64 %3, %6
br i1 %7, label %.loopexit14, label %4
.loopexit14: ; preds = %4
ret i64 %6
}
```
which is not valid (consider for example `%0 = 8`).
https://github.com/llvm/llvm-project/pull/157656
More information about the llvm-commits
mailing list