On Thu, May 28, 2020 at 4:37 PM Jiufu Guo <guoji...@linux.ibm.com> wrote:
>
> Richard Biener <richard.guent...@gmail.com> writes:
>
> > On Thu, May 28, 2020 at 10:52 AM guojiufu <guoji...@linux.ibm.com> wrote:
> >>
> >> From: Jiufu Guo <guoji...@linux.ibm.com>
> >>
> >> Currently GIMPLE complete unroller(cunroll) is checking
> >> flag_unroll_loops and flag_peel_loops to see if allow size growth.
> >> Beside affects curnoll, flag_unroll_loops also controls RTL unroler.
> >> To have more freedom to control cunroll and RTL unroller, this patch
> >> introduces flag_cunroll_grow_size.  With this patch, we can control
> >> cunroll and RTL unroller indepently.
> >>
> >> Bootstrap/regtest pass on powerpc64le. OK for trunk? And backport to
> >> GCC10 after week?
> >>
> >>
> >> +funroll-completely-grow-size
> >> +Var(flag_cunroll_grow_size) Init(2)
> >> +; Control cunroll to allow size growth during complete unrolling
> >> +
> >
> > So this really adds a new compiler option which would need
> > documenting.
> I once add 'Undocumented' (avoid shown in --help), and do not add
> 'Common' (avoid --help=common).  What I want to do is avoid expose this
> to user.
> While this is still an option as you said.
>
> >
> > I fear we'll get into bikeshed territory here as well...  I originally 
> > thought
> > we can use
> >
> > Variable
> > int flag_cunroll_grow_size;
>
> Thanks, this code is definetly a variable instead an option. I would try
> this way.
> >
> > but now realize that does not work well with LTO without adjusting
> > the awk scripts to generate option saving/restoring.  For your patch
> > you'd need to add 'Optimization' to get the flag streamed properly,
> > you should also verify the target adjustment done in the backend
> > is reflected in LTO mode.
>
> At here, internal option is relative simple 'Optimization' could help.
> When trying 'Variable', I will verify it in LTO mode.

It won't work without adjusting the awk scripts.  So go with

funroll-completely-grow-size
Undocumented Optimization Var(flag_cunroll_grow_size)
EnabledBy(funroll-loops || fpeel-loops)
; ...

and enable it at O3+.  AUTODETECT_VALUE doesn't make sense for
an option not supposed to be set by users?


> >
> >>  ; Nonzero means that loop optimizer may assume that the induction 
> >> variables
> >>
> >> +  /* Allow cunroll to grow size accordingly.  */
> >> +  if (flag_cunroll_grow_size == AUTODETECT_VALUE)
> >> +    flag_cunroll_grow_size = flag_unroll_loops || flag_peel_loops;
> >> +
> >
> > Any reason to not use EnabledBy(funroll-loops || fpeel-loops)?
>
> With tests and checking the generated code(e.g. options.c), I find that
> this setting has some unexpected behavior:
> For example, "-funroll-loops -fno-peel-loops" turns off the flag.
> "||" would indicate the flag will be _on/off_ by f[no]-unroll-loop or
> f[no]-peel-loops.
>
> >
> >>    /* web and rename-registers help when run after loop unrolling.  */
> >>    if (flag_web == AUTODETECT_VALUE)
> >>      flag_web = flag_unroll_loops;
>
> >> -  unsigned int val = tree_unroll_loops_completely (flag_unroll_loops
> >> -                                                  || flag_peel_loops
> >> +  unsigned int val = tree_unroll_loops_completely (flag_cunroll_grow_size
> >>                                                    || optimize >= 3, true);
> >
> > Given we check optimize >= 3 here please enable the flag by default
> > at O3+ via opts.c:default_options_table and also elide the optimize >= 3
> > check.  That way -fno-unroll-completely-grow-size would have the desired 
> > effect.
> >
> Actually in code flag_peel_loops is enabled at O3+, so, "|| optimize >=
> 3" could be removed.  Like you said, this helps to set negative form
> even at -O3.

You are right.

> > Now back to the option name ... if we expose the option we should apply
> > some forward looking.  Currently cunroll cannot be disabled or enabled
> > with a flag and the desired new flag simply tunes one knob on it.  How
> > about adding
> >
> > -fcomplete-unroll-loops[=may-grow]
> -fcomplete-unroll-loops[=may-grow|inner|outer]
> >
> > to be able to further extend this later (there's the knob to only unroll
> > non-outermost loops and the knob whether to unroll loops where
> > intermediate exits are not statically predicted - incompletely controlled
> > by -fpeel-loops).  There's unfortunately no existing examples that allows
> > multiple flags like -fcomlete-unroll-loops=may-grow,outer other than
> > the sanitizers which have manual option parsing.
> >
> > So if there's no good suggestion from option folks maybe go with
> >
> > -fcomplete-unroll-loops-may-grow
> >
> > (ick).  And on a second thought -fcomplete-unroll-loops[=...] should
> > be -funroll-loops[={complete,may-grow,all}] to cover all unrolling
> > bases?
> >
> > I really hate to explode the number of options users have to
> > consider optimizing their code ...
> >
> > So if we can defer all this thinking and make a non-option flag
> > variable work that would be best IMHO.
> Yes, a few things are need trade-off when designing a user options.
>
>
> Jiufu
> >
> > Richard.
> >
> >>    if (peeled_loops)
> >>      {
> >> --
> >> 2.17.1
> >>

Reply via email to