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

--- Comment #7 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-14 branch has been updated by Alex Coplan
<acop...@gcc.gnu.org>:

https://gcc.gnu.org/g:434483ac32a08d1f3608c26fe2da302f0e09d6a2

commit r14-10853-g434483ac32a08d1f3608c26fe2da302f0e09d6a2
Author: Alex Coplan <alex.cop...@arm.com>
Date:   Wed Oct 30 13:46:12 2024 +0000

    aarch64: Assume alias conflict if common address reg changes [PR116783]

    As the PR shows, pair fusion was tricking memory_modified_in_insn_p into
    returning false when a common base register (in this case, x1) was
    modified between the mem and the store insn.  This lead to wrong code as
    the accesses really did alias.

    To avoid this sort of problem, this patch avoids invoking RTL alias
    analysis altogether (and assume an alias conflict) if the two insns to
    be compared share a common address register R, and the insns see different
    definitions of R (i.e. it was modified in between).

    This is a backport (but not a straight cherry pick) of
    r15-4518-gc0e54ce1999ccf2241f74c5188b11b92e5aedc1f.

    gcc/ChangeLog:

            PR rtl-optimization/116783
            * config/aarch64/aarch64-ldp-fusion.cc
            (def_walker::cand_addr_uses): New.
            (def_walker::def_walker): Add parameter for candidate address
            uses.
            (def_walker::alias_conflict_p): Declare.
            (def_walker::addr_reg_conflict_p): New.
            (def_walker::conflict_p): New.
            (store_walker::store_walker): Add parameter for candidate
            address uses and pass to base ctor.
            (store_walker::conflict_p): Rename to ...
            (store_walker::alias_conflict_p): ... this.
            (load_walker::load_walker): Add parameter for candidate
            address uses and pass to base ctor.
            (load_walker::conflict_p): Rename to ...
            (load_walker::alias_conflict_p): ... this.
            (ldp_bb_info::try_fuse_pair): Collect address register
            uses for candidate insns and pass down to alias walkers.

    gcc/testsuite/ChangeLog:

            PR rtl-optimization/116783
            * g++.dg/torture/pr116783.C: New test.
  • [Bug rtl-optimization/116783] [... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to