[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