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

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

https://gcc.gnu.org/g:8643edbb888b4325d81393cebc5bacf9cb22d202

commit r12-10985-g8643edbb888b4325d81393cebc5bacf9cb22d202
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Tue Mar 11 15:51:54 2025 +0000

    aarch64: Fix caller saves of VNx2QI [PR116238]

    The testcase contains a VNx2QImode pseudo that is live across a call
    and that cannot be allocated a call-preserved register.  LRA quite
    reasonably tried to save it before the call and restore it afterwards.
    Unfortunately, the target told it to do that in SImode, even though
    punning between SImode and VNx2QImode is disallowed by both
    TARGET_CAN_CHANGE_MODE_CLASS and TARGET_MODES_TIEABLE_P.

    The natural class to use for SImode is GENERAL_REGS, so this led
    to an unsalvageable situation in which we had:

      (set (subreg:VNx2QI (reg:SI A) 0) (reg:VNx2QI B))

    where A needed GENERAL_REGS and B needed FP_REGS.  We therefore ended
    up in a reload loop.

    The hooks above should ensure that this situation can never occur
    for incoming subregs.  It only happened here because the target
    explicitly forced it.

    The decision to use SImode for modes smaller than 4 bytes dates
    back to the beginning of the port, before 16-bit floating-point
    modes existed.  I'm not sure whether promoting to SImode really
    makes sense for any FPR, but that's a separate performance/QoI
    discussion.  For now, this patch just disallows using SImode
    when it is wrong for correctness reasons, since that should be
    safer to backport.

    gcc/
            PR testsuite/116238
            * config/aarch64/aarch64.cc (aarch64_hard_regno_caller_save_mode):
            Only return SImode if we can convert to and from it.

    gcc/testsuite/
            PR testsuite/116238
            * gcc.target/aarch64/sve/pr116238.c: New test.

    (cherry picked from commit ec9d6d45191f639482344362d048294e74587ca3)
  • [Bug rtl-optimization/116238] [... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to