On 11/6/24 4:47 AM, Alexey Merzlyakov wrote:
This patch adds optimization of the following patterns:

   (zero_extend:M (subreg:N (not:O==M (X:Q==M)))) ->
   (xor:M (zero_extend:M (subreg:N (X:M)), mask))
     ... where the mask is GET_MODE_MASK (N).

For the cases when X:M doesn't have any non-zero bits outside of mode N,
(zero_extend:M (subreg:N (X:M)) could be simplified to just (X:M)
and whole optimization will be:

   (zero_extend:M (subreg:N (not:M (X:M)))) ->
   (xor:M (X:M, mask))

Patch targets to handle code patterns like:
   not   a0,a0
   andi  a0,a0,0xff
to be optimized to:
   xori  a0,a0,255

Change was locally tested for x86_64 and AArch64 (as most common)
and for RV-64 and MIPS-32 targets (as having an effect from this optimization):
no regressions for all cases.

gcc/ChangeLog:

        * simplify-rtx.cc (simplify_context::simplify_unary_operation_1):
        Simplify ZERO_EXTEND (SUBREG (NOT X)) to XOR (X, GET_MODE_MASK(SUBREG))
        when X doesn't have any non-zero bits outside of SUBREG mode.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/pr112398.c: New test.

Signed-off-by: Alexey Merzlyakov<alexey.merzlya...@samsung.com>
Thanks.   I just pushed this to the trunk.

Jeff

Reply via email to