Issue 143636
Summary Missed optimization: fold ceil(x/16) == 0 to x == 0
Labels new issue
Assignees
Reporter Cancelll
    ```llvm
define i1 @src(i32 %arg0) {
  %1 = add i32 %arg0, 1
  %2 = lshr i32 %1, 4
  %3 = and i32 %1, 15
  %4 = icmp ne i32 %3, 0
  %5 = zext i1 %4 to i32
  %6 = add nuw nsw i32 %2, %5
  %7 = icmp eq i32 %6, 0
  ret i1 %7
}

define i1 @tgt(i32 %arg0) {
  %5 = icmp eq i32 %arg0, -1
  ret i1 %5
}
```
(x >> 4) + ((x & 0xF) ≠ 0) is equivalent to ceil(x/16).
ceil(x/16) equals to 0 only when x is 0.

Alive2: https://alive2.llvm.org/ce/z/E85DRW
godbolt: https://godbolt.org/z/Y5frz97Mh

The pattern is found in projects including wasmi, coreutils, ruff. An example:
https://github.com/dtcxzyw/llvm-opt-benchmark/blob/013f9638352b38eb8f26daddafeeb0d87fc6510b/bench/coreutils-rs/optimized/50z74lntrf1cjp27.ll#L1210-L1216
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to