"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