-
Notifications
You must be signed in to change notification settings - Fork 12.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[InstCombine] Missed optimization : fold X > C2 ? X + C1 : C2 + C1
to max(X, C2) + C1
#82414
Comments
Does this produce better optimizations in the surrounding context? I'm not sure this transform is worthwhile. |
No, just as this example shows. I don't insist on it since it doesn't bring better codegen.. |
Detected a similar but more complex pattern just now: https://alive2.llvm.org/ce/z/pTzsqM |
On RISCV, it will allow to use the smax instruction even for the original simplified example instead of the more complex code. |
It depends on the materialization cost for the immediates. |
Detect better optimization in the surrounding context, mainly when the select is used multiple times. |
I believe rust-lang/rust#123845 is another motivating case for this. That one is smin with multi-use condition and one-use add. |
I'd like to work on this. |
…C2) BOp C1` (llvm#116888) Fixes llvm#82414. General Proof: https://alive2.llvm.org/ce/z/ERjNs4 Proof for Tests: https://alive2.llvm.org/ce/z/K-934G This PR transforms `select` instructions of the form `select (Cmp X C1) (BOp X C2) C3` to `BOp (min/max X C1) C2` iff `C3 == BOp C1 C2`. This helps in eliminating a noop loop in rust-lang/rust#123845 but does not improve optimizations.
Alive2 proof: https://alive2.llvm.org/ce/z/ERjNs4
Motivating example
can be folded to:
LLVM does well when
C1
orC2
is not constant, but when both are constants, LLVM missed it. Though this example doesn't show better codegen, I think it's a better canonicalization.Real-world motivation
This snippet of IR is derived from protobuf/generated_message_tctable_lite.cc after O3 pipeline (original IR is from llvm-opt-benchmark).
Original IR is too big to attach here, email me to get it please.
Let me know if you can confirm that it's an optimization opportunity, thanks.
The text was updated successfully, but these errors were encountered: