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

--- Comment #19 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:708ee71808ea61758e73d0e36274b4194b28576a

commit r15-3213-g708ee71808ea61758e73d0e36274b4194b28576a
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Tue Aug 27 09:48:28 2024 +0100

    Handle arithmetic on eliminated address indices [PR116413]

    This patch fixes gcc.c-torture/compile/opout.c for m68k with LRA
    enabled.  The test has:

    ...
    z (a, b)
    {
      return (int) &a + (int) &b + (int) x + (int) z;
    }

    so it adds the address of two incoming arguments.  This ends up
    being treated as an LEA in which the "index" is the incoming
    argument pointer, which the LEA multiplies by 2.  The incoming
    argument pointer is then eliminated, leading to:

    (plus:SI (plus:SI (ashift:SI (plus:SI (reg/f:SI 24 %argptr)
                    (const_int -4 [0xfffffffffffffffc]))
                (const_int 1 [0x1]))
            (reg/f:SI 41 [ _6 ]))
        (const_int 20 [0x14]))

    In the address_info scheme, the innermost plus has to be treated
    as the index "term", since that's the thing that's subject to
    index_reg_class.

    gcc/
            PR middle-end/116413
            * rtl.h (address_info): Update commentary.
            * rtlanal.cc (valid_base_or_index_term_p): New function, split
            out from...
            (get_base_term, get_index_term): ...here.  Handle elimination
PLUSes.

Reply via email to