[PATCH] target: fix default value checking of x_str_align_functions in aarch64.c

Hu, Jiangping hujiangping@cn.fujitsu.com
Tue Jul 21 11:06:11 GMT 2020


> Sorry for the slow response on this.  Like you say, it seems to be a pretty
> pervasive problem.  In fact I couldn't see anywhere that actually treated -
> falign-foo=0 as anything other than -falign-foo=1.
> 
> Technically using an alignment of one for zero is within what the
> documentation allows, but not in a useful way.  The documentation also isn't
> clear about whether:
> 
>   -falign-loops=0:8
> 
> (“align to whatever you think is best, but don't skip more than 8 bytes”) is
> supposed to be valid.  The implication is that it's OK, but in practice it doesn't
> work.
> 
Thanks, Richard!

> If there isn't anywhere that handles zero in the way that the documentation
> implies (i.e. with -falign-loops=0 being equivalent to -falign-loops) then maybe
> we should instead change the documentation to match the actual behaviour.
>
Yes, I confirmed in source level that there is no target that handles zero in the way that the documentation implies.
But, I think just adjusting the documentation to reflect the implementation behavior will cause -falign-functions=0 and -falign-functions=1 to have the same meaning which is a bit confusing from the user's perspective.

In fact, I have issued a pr to Bugzilla, and got a comment from Richard Biener. We are considering whether to reject 0, which means both the source and the documentation should be modified a bit.
I found that function parse_and_check_align_values in gcc/opts.c maybe the point we want to modify, values less than 0 are currently rejected here. Maybe we can change the '<’ to '<=' in the if statement. But I need  test, to make sure there are no regression issues.

What do you think?

Regards!
Hujp

> If instead this is a regression from previous compilers, then I guess we should
> fix it.  But I think it would be good to have a helper function that tests whether
> the default should be used for a given x_flag_align_foo and x_str_align_foo
> pair.  That we we could reuse it in other targets and would have only one place
> to update.  (For example, we might decide to use
> parse_and_check_align_values rather than strcmp.)
> 
> Don't know whether anyone else has any thoughts about the best fix.
> 
> Thanks, and sorry again for the slow reply.
> 
> Richard
> 
> >
> > Regards!
> > Hujp
> >
> > ---
> >  gcc/config/aarch64/aarch64.c | 9 ++++++---
> >  1 file changed, 6 insertions(+), 3 deletions(-)
> >
> > diff --git a/gcc/config/aarch64/aarch64.c
> > b/gcc/config/aarch64/aarch64.c index 17dbe673978..697ac676f4d
> 100644
> > --- a/gcc/config/aarch64/aarch64.c
> > +++ b/gcc/config/aarch64/aarch64.c
> > @@ -14221,11 +14221,14 @@ aarch64_override_options_after_change_1
> (struct gcc_options *opts)
> >       alignment to what the target wants.  */
> >    if (!opts->x_optimize_size)
> >      {
> > -      if (opts->x_flag_align_loops && !opts->x_str_align_loops)
> > +      if ((opts->x_flag_align_loops && !opts->x_str_align_loops)
> > +        || (opts->x_str_align_loops &&
> > + strcmp(opts->x_str_align_loops, "0") == 0))
> >  	opts->x_str_align_loops = aarch64_tune_params.loop_align;
> > -      if (opts->x_flag_align_jumps && !opts->x_str_align_jumps)
> > +      if ((opts->x_flag_align_jumps && !opts->x_str_align_jumps)
> > +        || (opts->x_str_align_jumps &&
> > + strcmp(opts->x_str_align_jumps, "0") == 0))
> >  	opts->x_str_align_jumps = aarch64_tune_params.jump_align;
> > -      if (opts->x_flag_align_functions && !opts->x_str_align_functions)
> > +      if ((opts->x_flag_align_functions && !opts->x_str_align_functions)
> > +        || (opts->x_str_align_functions &&
> > + strcmp(opts->x_str_align_functions, "0") == 0))
> >  	opts->x_str_align_functions = aarch64_tune_params.function_align;
> >      }
> 





More information about the Gcc-patches mailing list