AW: new ira optimization - adding a loop to ira
stefan@franke.ms
stefan@franke.ms
Fri Sep 13 10:44:00 GMT 2019
> -----Ursprüngliche Nachricht-----
> Von: Richard Sandiford <richard.sandiford@arm.com>
> Gesendet: Freitag, 13. September 2019 12:16
> An: stefan@franke.ms
> Cc: gcc-help@gcc.gnu.org
> Betreff: Re: new ira optimization - adding a loop to ira
>
> <stefan@franke.ms> writes:
> > I'm working on a new optimization to get rid of spilled tmp variables
(e.g.
> > introduced by pre) to use the source mem ref instead of a stack slot.
> >
> > To do this, I added a loop into ira.c:ira()
> >
> > init_prune_stack_vars ();
> > do
> > {
> > #ifndef IRA_NO_OBSTACK
> > gcc_obstack_init (&ira_obstack);
> > #endif
> > bitmap_obstack_initialize (&ira_bitmap_obstack);
> >
> > ...
> >
> > ira_color ();
> >
> > }
> > while (flag_prune_stack_vars && prune_stack_vars ());
> >
> > To get it work, the prune_stack_vars function resets a couple of data.
> > This is mostly working - but on some source files, it fails due to
> > invalid reg_equivs.
> > Since this also happens, if the optimizer does nothing and just loops
once.
> >
> > Currently I'm calling this, before looping again
> >
> > regstat_free_n_sets_and_refs ();
> > regstat_free_ri ();
> > loop_optimizer_finalize ();
> > free_dominance_info (CDI_DOMINATORS);
> >
> > Any hint, what I'm missing to reset?
>
> I can't see anything obviously missing. What kind of failure do you see?
E.g.
> do you get an internal compiler error or does the compiler generate
> incorrect code?
>
> Do you see the failure on an in-tree test case? FWIW, I just tried
looping like
> this locally and didn't see any failures for the tests I tried. But I was
obviously
> testing without the new optimisation, and so each loop iteration should
just
> repeat what the previous one did.
>
> Not related to the failure, but: do you do anything with the obstacks when
> looping again? Including the initialisations in the loop as above would
> introduce a memory leak if you don't do anything to free the contents.
> It'd probably be better to initialise outside the loop unless you're
really
> confident that the no data is carried across iterations.
>
> Thanks,
> Richard
Thanks für the ira_obstack hint - I will take care of this, once the loop
mode is working - maybe I can start looping later or I'll free the memory.
In reload: push_reload(...) this raises an error:
gcc_assert (regno < FIRST_PSEUDO_REGISTER
|| reg_renumber[regno] >= 0
|| reg_equiv_constant (regno) == NULL_RTX);
I already know that it's reg_equiv_constant and that this reg_equiv_constant
is also set in the unpatched code.
So I am looking why these additional reloads occur. There are additional
reloads if I enable the loop, interestingly for uid like 2, 3, 4 ...
Thanks,
Stefan
More information about the Gcc-help
mailing list