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

--- Comment #4 from Vladimir Makarov <vmakarov at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #3)
> 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

The patch looks ok to me.  Thank you, Richard.  You can commit it into the
trunk.

Reply via email to