[PATCH] D141180: [X86] Only match BMI (BLSR, BLSI, BLSMSK) if the add/sub op is single use
Noah Goldstein via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 6 21:37:15 PST 2023
goldstein.w.n added inline comments.
================
Comment at: llvm/lib/Target/X86/X86InstrInfo.td:1272
+// An 'ineg' node with a single use.
+def ineg_su : PatFrag<(ops node:$v), (ineg node:$v), [{
----------------
craig.topper wrote:
> Maybe we should have
>
> ```
> `class binop_oneuse<SDPatternOperator operator>
> : PatFrag<(ops node:$A, node:$B),
> (operator node:$A, node:$B), [{
> return N->hasOneUse();
> }]>;`
>
> def add_su : binop_oneuse<add>;
> def and_su : binop_oneuse<and>;
> def srl_su : binop_oneuse<srl>;
>
> class unop_oneuse<SDPatternOperator operator>
> : PatFrag<(ops node:$A),
> (operator node:$A), [{
> return N->hasOneUse();
> }]>;
>
> def ineg_su : unop_oneuse<ineg>;
> def trunc_su : unop_oneuse<trunc>;
> ```
> Maybe we should have
>
> ```
> `class binop_oneuse<SDPatternOperator operator>
> : PatFrag<(ops node:$A, node:$B),
> (operator node:$A, node:$B), [{
> return N->hasOneUse();
> }]>;`
>
> def add_su : binop_oneuse<add>;
> def and_su : binop_oneuse<and>;
> def srl_su : binop_oneuse<srl>;
>
> class unop_oneuse<SDPatternOperator operator>
> : PatFrag<(ops node:$A),
> (operator node:$A), [{
> return N->hasOneUse();
> }]>;
>
> def ineg_su : unop_oneuse<ineg>;
> def trunc_su : unop_oneuse<trunc>;
> ```
Makes sense, will do for V2.
Any thoughts on:
"""
Note, this may cause more mov instructions to be emitted sometimes
because BMI instructions only have 1 src and write-only to dst. A
better approach may be to only avoid BMI for (and/xor X, (add/sub
0/-1, X)) if this is the last use of X but NOT the last use of
(add/sub 0/-1, X).
"""
?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D141180/new/
https://reviews.llvm.org/D141180
More information about the llvm-commits
mailing list