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

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

https://gcc.gnu.org/g:d63b6d8b494483b0049370ff0dfeee0e1d10e54b

commit r15-2429-gd63b6d8b494483b0049370ff0dfeee0e1d10e54b
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Wed Jul 31 09:23:35 2024 +0100

    recog: Disallow subregs in mode-punned value [PR115881]

    In g:9d20529d94b23275885f380d155fe8671ab5353a, I'd extended
    insn_propagation to handle simple cases of hard-reg mode punning.
    The punned "to" value was created using simplify_subreg rather
    than simplify_gen_subreg, on the basis that hard-coded subregs
    aren't generally useful after RA (where hard-reg propagation is
    expected to happen).

    This PR is about a case where the subreg gets pushed into the
    operands of a plus, but the subreg on one of the operands
    cannot be simplified.  Specifically, we have to generate
    (subreg:SI (reg:DI sp) 0) rather than (reg:SI sp), since all
    references to the stack pointer must be via stack_pointer_rtx.

    However, code in x86 (reasonably) expects no subregs of registers
    to appear after RA, except for special cases like strict_low_part.
    This leads to an awkward situation where we can't ban subregs of sp
    (because of the strict_low_part use), can't allow direct references
    to sp in other modes (because of the stack_pointer_rtx requirement),
    and can't allow rvalue uses of the subreg (because of the "no subregs
    after RA" assumption).  It all seems a bit of a mess...

    I sat on this for a while in the hope that a clean solution might
    become apparent, but in the end, I think we'll just have to check
    manually for nested subregs and punt on them.

    gcc/
            PR rtl-optimization/115881
            * recog.cc: Include rtl-iter.h.
            (insn_propagation::apply_to_rvalue_1): Check that the result
            of simplify_subreg does not include nested subregs.

    gcc/testsuite/
            PR rtl-optimization/115881
            * gcc.c-torture/compile/pr115881.c: New test.

Reply via email to