Issue 83430
Summary [InstCombine] Missed optimization: fail to fold `(A >> C1) Pred C2` if `shr` is used multiple times
Labels new issue
Assignees
Reporter XChy
    Alive2 proof: https://alive2.llvm.org/ce/z/4JKW9d

### Motivating example 

```llvm
define i1 @src(i32 %a){
entry:
  %div = ashr exact i32 %a, 3
  call void @use(i32 %div)
  %cmp = icmp slt i32 %div, 15
 ret i1 %cmp
}
```
can be folded to:
```llvm
define i1 @tgt(i32 %a) {
  %div = ashr exact i32 %a, 3
  call void @use(i32 %div)
  %cmp = icmp slt i32 %a, 120
  ret i1 %cmp
}
```
This enable more optimizations for the other user of `shr` as I observe in benchmark.
Unsigned case is in alive2 proof.

### Real-world motivation
Signed case is derived from [z3/src/sat/smt/pb_solver.cpp](https://github.com/Z3Prover/z3/blob/master/src/sat/smt/pb_solver.cpp) (after O3 pipeline).
Unsigned case is derived from [z3/src/tactic/core/collect_occs.cpp](https://github.com/Z3Prover/z3/blob/master/src/tactic/core/collect_occs.cpp) (after O3 pipeline).
The example above is a reduced version. If you're interested in the original suboptimal IR and optimal IR, email me please.

**Let me know if you can confirm that it's an optimization opportunity, thanks.**
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to