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.