llvm/llvm-project

[InstCombine] Missed optimization: fail to fold `(A >> C1) Pred C2` if `shr` is used multiple times

Open

#83,430 建立於 2024年2月29日

在 GitHub 查看
 (8 留言) (0 反應) (1 負責人)C++ (10,782 fork)batch import
good first issuellvm:instcombinemissed-optimization

倉庫指標

Star
 (26,378 star)
PR 合併指標
 (平均合併 1天 2小時) (30 天內合併 1,000 個 PR)

描述

Alive2 proof: https://alive2.llvm.org/ce/z/4JKW9d

Motivating example

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:

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 enables 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 (after O3 pipeline). Unsigned case is derived from z3/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.

貢獻者指南