"H.J. Lu" <[email protected]> writes:
> Mark accessible caller-saved registers as live to prevent IRA from
> generating invalid instructions when call_used_regs includes registers
> disabled by ISA selections.
>
> PR rtl-optimization/125321
> * ira.cc (update_equiv_regs_prescan): Mark a register as live
> only if it is accessible.

You didn't mention where you saw this, but FWIW, it seems to fix
an ICE in:

/* { dg-options "-O2 -masm=att -mno-mmx -mno-80387 -msse" } */

extern void callee_clobbered () [[gnu::preserve_none]];
extern void callee_preserved () [[gnu::no_caller_saved_registers]];
extern void callee_sysv () [[gnu::sysv_abi]];
extern void callee_ms () [[gnu::ms_abi]];

#define TEST(PREFIX, ATTR) \
  void PREFIX##_clobbered () [[ATTR]] { callee_clobbered (); } \
  void PREFIX##_preserved () [[ATTR]] { callee_preserved (); } \
  void PREFIX##_sysv () [[ATTR]] { callee_sysv (); } \
  void PREFIX##_ms () [[ATTR]] { callee_ms (); }

TEST (clobbered, gnu::preserve_none)
TEST (preserved, gnu::no_caller_saved_registers)
TEST (sysv, gnu::sysv_abi)
TEST (ms, gnu::ms_abi)

/* { dg-final { scan-assembler-not "%st" } } */
/* { dg-final { scan-assembler "%xmm" } } */

with the x86 function_abi patch.  The ICE was from reg-stack.cc,
but I agree that a change there would probably just be papering
over the problem.

> From 314a6328eb9bcdc9bbbd201f79fa8ab0a48c0f5e Mon Sep 17 00:00:00 2001
> From: "H.J. Lu" <[email protected]>
> Date: Fri, 15 May 2026 08:01:56 +0800
> Subject: [PATCH] ira: Mark a register as live only if it is accessible
>
> Mark accessible caller-saved registers as live to prevent IRA from
> generating invalid instructions when call_used_regs includes registers
> disabled by ISA selections.
>
>       PR rtl-optimization/125321
>       * ira.cc (update_equiv_regs_prescan): Mark a register as live
>       only if it is accessible.
>
> Signed-off-by: H.J. Lu <[email protected]>
> ---
>  gcc/ira.cc | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/ira.cc b/gcc/ira.cc
> index 85c7ec419b3..fdb4f66fb2f 100644
> --- a/gcc/ira.cc
> +++ b/gcc/ira.cc
> @@ -3610,9 +3610,11 @@ update_equiv_regs_prescan (void)
>       }
>  
>    HARD_REG_SET extra_caller_saves = callee_abis.caller_save_regs 
> (*crtl->abi);
> +  /* Mark a register as live only if it is accessible.  */
>    if (!hard_reg_set_empty_p (extra_caller_saves))
>      for (unsigned int regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
> -      if (TEST_HARD_REG_BIT (extra_caller_saves, regno))
> +      if (TEST_HARD_REG_BIT (accessible_reg_set, regno)
> +       && TEST_HARD_REG_BIT (extra_caller_saves, regno))
>       df_set_regs_ever_live (regno, true);
>  }

I think it'd be better to change:

  return result;

to:

  return result & accessible_reg_set;

in function_abi_aggregator::caller_save_regs, since other callers might
otherwise have the same issue.

Thanks,
Richard

Reply via email to