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);
 }
  • [Bug rtl-optimization/125321] N... hjl.tools at gmail dot com via Gcc-bugs

Reply via email to