https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87763

--- Comment #63 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Richard Sandiford <rsand...@gcc.gnu.org>:

https://gcc.gnu.org/g:465c7c89e92a6d6d582173e505cb16dcb9873034

commit r10-6283-g465c7c89e92a6d6d582173e505cb16dcb9873034
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Sun Jan 26 13:01:48 2020 +0000

    simplify-rtx: Extend (truncate (*extract ...)) fold [PR87763]

    In the gcc.target/aarch64/lsl_asr_sbfiz.c part of this PR, we have:

    Failed to match this instruction:
    (set (reg:SI 95)
        (ashift:SI (subreg:SI (sign_extract:DI (subreg:DI (reg:SI 97) 0)
                    (const_int 3 [0x3])
                    (const_int 0 [0])) 0)
            (const_int 19 [0x13])))

    If we perform the natural simplification to:

    (set (reg:SI 95)
        (ashift:SI (sign_extract:SI (reg:SI 97)
                    (const_int 3 [0x3])
                    (const_int 0 [0])) 0)
            (const_int 19 [0x13])))

    then the pattern matches.  And it turns out that we do have a
    simplification like that already, but it would only kick in for
    extractions from a reg, not a subreg.  E.g.:

    (set (reg:SI 95)
        (ashift:SI (subreg:SI (sign_extract:DI (reg:DI X)
                    (const_int 3 [0x3])
                    (const_int 0 [0])) 0)
            (const_int 19 [0x13])))

    would simplify to:

    (set (reg:SI 95)
        (ashift:SI (sign_extract:SI (subreg:SI (reg:DI X) 0)
                    (const_int 3 [0x3])
                    (const_int 0 [0])) 0)
            (const_int 19 [0x13])))

    IMO the subreg case is even more obviously a simplification
    than the bare reg case, since the net effect is to remove
    either one or two subregs, rather than simply change the
    position of a subreg/truncation.

    However, doing that regressed gcc.dg/tree-ssa/pr64910-2.c
    for -m32 on x86_64-linux-gnu, because we could then simplify
    a :HI zero_extract to a :QI one.  The associated *testqi_ext_3
    pattern did already seem to want to handle QImode extractions:

      "ix86_match_ccmode (insn, CCNOmode)
       && ((TARGET_64BIT && GET_MODE (operands[2]) == DImode)
           || GET_MODE (operands[2]) == SImode
           || GET_MODE (operands[2]) == HImode
           || GET_MODE (operands[2]) == QImode)

    but I'm not sure how often the QI case would trigger in practice,
    since the zero_extract mode was restricted to HI and above.  I checked
    the other x86 patterns and couldn't see any other instances of this.

    2020-01-28  Richard Sandiford  <richard.sandif...@arm.com>

    gcc/
        PR rtl-optimization/87763
        * simplify-rtx.c (simplify_truncation): Extend sign/zero_extract
        simplification to handle subregs as well as bare regs.
        * config/i386/i386.md (*testqi_ext_3): Match QI extracts too.

Reply via email to