Hi Jeff,

Thanks for the patch, I learned a lot from it.  Some nits embedded.

on 2019/11/4 下午2:31, Jiufu Guo wrote:
> Hi,
> 
> In this patch, loop unroll adjust hook is introduced for powerpc.  We can do
> target related hueristic adjustment in this hook. In this patch, small loops
> is unrolled 2 times for O2 and O3 by default.  With this patch, we can see
> some improvement for spec2017.  This patch enhanced a little for [Patch V2] to
> enable small loops unroll for O3 by default like O2.
> 
> Bootstrapped and regtested on powerpc64le.  Is this ok for trunk?
> 
> Jiufu
> BR.
> 
> gcc/
> 2019-11-04  Jiufu Guo  <guoji...@linux.ibm.com>           
> 
>       PR tree-optimization/88760
>       * config/rs6000/rs6000.c (rs6000_option_override_internal): Remove
>       code which changes PARAM_MAX_UNROLL_TIMES and PARAM_MAX_UNROLLED_INSNS.
>       (TARGET_LOOP_UNROLL_ADJUST): Add loop unroll adjust hook.
>       (rs6000_loop_unroll_adjust): New hook for loop unroll adjust.
>       Unrolling small loop 2 times for -O2 and -O3.
>       (rs6000_function_specific_save): Save unroll_small_loops flag.
>       (rs6000_function_specific_restore): Restore unroll_small_loops flag.
>       * gcc/config/rs6000/rs6000.opt (unroll_small_loops): New internal flag.
> 
>       
> gcc.testsuite/
> 2019-11-04  Jiufu Guo  <guoji...@linux.ibm.com>
> 
>       PR tree-optimization/88760
>       * gcc.dg/pr59643.c: Update back to r277550.
> 
> ---
>  gcc/config/rs6000/rs6000.c     | 38 ++++++++++++++++++++++++++++----------
>  gcc/config/rs6000/rs6000.opt   |  7 +++++++
>  gcc/testsuite/gcc.dg/pr59643.c |  3 ---
>  3 files changed, 35 insertions(+), 13 deletions(-)
> 
> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
> index 9ed5151..5e1a75d 100644
> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -1428,6 +1428,9 @@ static const struct attribute_spec 
> rs6000_attribute_table[] =
>  #undef TARGET_VECTORIZE_DESTROY_COST_DATA
>  #define TARGET_VECTORIZE_DESTROY_COST_DATA rs6000_destroy_cost_data
>  
> +#undef TARGET_LOOP_UNROLL_ADJUST
> +#define TARGET_LOOP_UNROLL_ADJUST rs6000_loop_unroll_adjust
> +
>  #undef TARGET_INIT_BUILTINS
>  #define TARGET_INIT_BUILTINS rs6000_init_builtins
>  #undef TARGET_BUILTIN_DECL
> @@ -4540,25 +4543,20 @@ rs6000_option_override_internal (bool global_init_p)
>                            global_options.x_param_values,
>                            global_options_set.x_param_values);
>  
> -      /* unroll very small loops 2 time if no -funroll-loops.  */
> +      /* If funroll-loops is not enabled explicitly, then enable small loops
> +      unrolling for -O2, and do not turn fweb or frename-registers on.  */

"for -O2" -> "for -O2 and up"? since I noticed it checks "optimize >=2" later.

>        if (!global_options_set.x_flag_unroll_loops
>         && !global_options_set.x_flag_unroll_all_loops)
>       {
> -       maybe_set_param_value (PARAM_MAX_UNROLL_TIMES, 2,
> -                              global_options.x_param_values,
> -                              global_options_set.x_param_values);
> -
> -       maybe_set_param_value (PARAM_MAX_UNROLLED_INSNS, 20,
> -                              global_options.x_param_values,
> -                              global_options_set.x_param_values);
> +       unroll_small_loops = optimize >= 2 ? 1 : 0;

Maybe simpler with "unroll_small_loops = flag_unroll_loops"? 

>  
> -       /* If fweb or frename-registers are not specificed in command-line,
> -          do not turn them on implicitly.  */
>         if (!global_options_set.x_flag_web)
>           global_options.x_flag_web = 0;
>         if (!global_options_set.x_flag_rename_registers)
>           global_options.x_flag_rename_registers = 0;
>       }
> +      else
> +     unroll_small_loops = 0;

Could we initialize this in rs6000.opt as zero?


BR,
Kewen

Reply via email to