https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125321
Bug ID: 125321
Summary: Inaccessible caller-saved registers are marked as live
Product: gcc
Version: 17.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: hjl.tools at gmail dot com
CC: rdsandiford at googlemail dot com, vmakarov at redhat dot
com
Target Milestone: ---
update_equiv_regs_prescan in ira.cc has
HARD_REG_SET extra_caller_saves = callee_abis.caller_save_regs (*crtl->abi);
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))
df_set_regs_ever_live (regno, true);
which may mark inaccessible caller-saved registers as live. This caused IRA to
generate invalid instructions when call_used_regs includes registers disabled
by ISA selections. Shouldn't it check if a register is accessible first?
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);
}