Hi!
On Wed, Jan 04, 2023 at 08:15:03PM +0800, Kewen.Lin wrote:
> on 2023/1/4 18:46, Segher Boessenkool wrote:
> >> @@ -25604,7 +25602,9 @@ rs6000_call_aix (rtx value, rtx func_desc, rtx
> >> tlsarg, rtx cookie)
> >>
> >> /* Can we optimize saving the TOC in the prologue or
> >> do we need to do it at every call? */
> >> - if (TARGET_SAVE_TOC_INDIRECT && !cfun->calls_alloca)
> >> + if (TARGET_SAVE_TOC_INDIRECT
> >> + && !cfun->calls_alloca
> >> + && optimize_function_for_speed_p (cfun))
> >> cfun->machine->save_toc_in_prologue = true;
> >
> > Is this correct? If so, it really needs a separate testcase.
>
> Yes, it just moves the condition from:
>
> --- a/gcc/config/rs6000/rs6000.cc
> +++ b/gcc/config/rs6000/rs6000.cc
> @@ -3978,8 +3978,7 @@ rs6000_option_override_internal (bool global_init_p)
> /* If we can shrink-wrap the TOC register save separately, then use
> -msave-toc-indirect unless explicitly disabled. */
> if ((rs6000_isa_flags_explicit & OPTION_MASK_SAVE_TOC_INDIRECT) == 0
> - && flag_shrink_wrap_separate
> - && optimize_function_for_speed_p (cfun))
> + && flag_shrink_wrap_separate)
> rs6000_isa_flags |= OPTION_MASK_SAVE_TOC_INDIRECT;
>
> here.
That "just" reinforces that this really needs a testcase! It is all
action at a distance, none of this is trivial (if it was there would
not be a bug here in the first place, of course).
> I tried to find one test case before, but failed to find one which is not
> fragile
> to test. And I thought the associated test case has demonstrated why the use
> of
> optimize_function_for_{speed,size}_p is too early in function
> rs6000_option_override_internal, so I gave up then. Do you worry about that
> we
> could revert it unexpectedly in future and no sensitive test case is on it?
I worry that it might contradict what some other code does. I also
worry that it just is not a sensible thing to do.
I do not worry that your patch is not an improvement. But the resulting
code more clearly (than the original) is problematic. Where is r2 saved
to the frame if save_toc_in_prologue is false?
Segher