https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85072
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- Doing a more "correct" patch like below shows that nearly all possible "starts" are covered: (gdb) p bitmap_count_bits(starts) $2 = 500039 (gdb) p max_regno - lra_constraint_new_regno_start $4 = 505207 so preserving semantics that way doesn't end up helping memory use :/ Index: gcc/lra-assigns.c =================================================================== --- gcc/lra-assigns.c (revision 258678) +++ gcc/lra-assigns.c (working copy) @@ -429,12 +429,25 @@ init_live_reload_and_inheritance_pseudos for (p = 0; p < lra_live_max_point; p++) bitmap_initialize (&live_reload_and_inheritance_pseudos[p], &live_reload_and_inheritance_pseudos_bitmap_obstack); + bitmap starts = BITMAP_ALLOC (NULL); + 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 (starts, r->start); for (i = lra_constraint_new_regno_start; i < max_regno; i++) { for (r = lra_reg_info[i].live_ranges; r != NULL; r = r->next) - for (p = r->start; p <= r->finish; p++) - bitmap_set_bit (&live_reload_and_inheritance_pseudos[p], i); + { + bitmap_iterator bi; + unsigned p; + EXECUTE_IF_SET_IN_BITMAP (starts, r->start, p, bi) + { + if (p > (unsigned)r->finish) + break; + bitmap_set_bit (&live_reload_and_inheritance_pseudos[p], i); + } + } } + BITMAP_FREE (starts); } /* Finalize data about living reload pseudos at any given program