https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85072

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
So I did a stupid search for live_reload_and_inheritance_pseudos in
lra-assigns.c
and found a single use here:

static int
find_hard_regno_for_1 (int regno, int *cost, int try_only_hard_regno,
                       bool first_p, HARD_REG_SET regno_set)
{
...
  for (r = lra_reg_info[regno].live_ranges; r != NULL; r = r->next)
    {
      EXECUTE_IF_SET_IN_BITMAP (&live_hard_reg_pseudos[r->start], 0, k, bi)
        if (rclass_intersect_p[regno_allocno_class_array[k]])
          sparseset_set_bit (live_range_hard_reg_pseudos, k);
      EXECUTE_IF_SET_IN_BITMAP (&live_reload_and_inheritance_pseudos[r->start],
^^^^^
                                0, k, bi)
        if (lra_reg_info[k].preferred_hard_regno1 >= 0
            && live_pseudos_reg_renumber[k] < 0
            && rclass_intersect_p[regno_allocno_class_array[k]])
          sparseset_set_bit (conflict_reload_and_inheritance_pseudos, k);

where we only ever look at live_reload_and_inheritance_pseudos at index
r->start.
Which means the init loop could be optimized based on that use?  Like
(bogus of course) to

  for (i = lra_constraint_new_regno_start; i < max_regno; i++)
    {
      for (r = lra_reg_info[i].live_ranges; r != NULL; r = r->next)
        bitmap_set_bit (&live_reload_and_inheritance_pseudos[r->start], i);
    }

that very optimistic "fix" brings down memory use significantly (heh,
not unexpectedly for a broken patch).  Still now assign_by_spills
takes up a lot of time.

Anyway, improving the live_reload_and_inheritance_pseudos data structure
should be possible I think.

Reply via email to