/* Index (in ira_class_hard_regs; for given register class and hard
register (in general case a hard register can belong to several
- register classes;. The index is negative for hard registers
+ register classes). The index is negative for hard registers
unavailable for the allocation. */
short x_ira_class_hard_reg_index[N_REG_CLASSES][FIRST_PSEUDO_REGISTER];
return n;
}
+/* Return true if we have a pseudo assigned to hard frame pointer. */
+bool
+lra_fp_pseudo_p (void)
+{
+ HARD_REG_SET set;
+
+ if (frame_pointer_needed)
+ /* At this stage it means we have no pseudos assigned to FP: */
+ return false;
+ CLEAR_HARD_REG_SET (set);
+ add_to_hard_reg_set (&set, Pmode, HARD_FRAME_POINTER_REGNUM);
+ for (int i = FIRST_PSEUDO_REGISTER; i < max_reg_num (); i++)
+ if (lra_reg_info[i].nrefs != 0 && reg_renumber[i] >= 0
+ && overlaps_hard_reg_set_p (set, PSEUDO_REGNO_MODE (i),
+ reg_renumber[i]))
+ return true;
+ return false;
+}
+
/* Entry function to do final elimination if FINAL_P or to update
elimination register offsets (FIRST_P if we are doing it the first
time). */
bool, bool, poly_int64, bool);
extern void eliminate_regs_in_insn (rtx_insn *insn, bool, bool, poly_int64);
extern int lra_update_fp2sp_elimination (int *spilled_pseudos);
+extern bool lra_fp_pseudo_p (void);
extern void lra_eliminate (bool, bool);
extern poly_int64 lra_update_sp_offset (rtx, poly_int64);
bool
lra_need_for_spills_p (void)
{
- int i; max_regno = max_reg_num ();
+ int i;
+ max_regno = max_reg_num ();
for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
if (lra_reg_info[i].nrefs != 0 && lra_get_regno_hard_regno (i) < 0
&& ! ira_former_scratch_p (i))
rematerialize them first. */
if (lra_remat ())
{
- /* We need full live info -- see the comment above. */
- lra_create_live_ranges (true, true);
+ /* We need full live info -- see the comment above. We also might
+ need live info if we have a pseudo assigned to hard frame pointer
+ reg and will need FP for usual purposes. */
+ lra_create_live_ranges (lra_reg_spill_p || lra_fp_pseudo_p (),
+ true);
live_p = true;
if (! lra_need_for_spills_p ())
{