[PATCH 2/2] rs6000: tune loop size for cunroll at O2

Kewen.Lin linkw@linux.ibm.com
Wed May 20 05:28:01 GMT 2020


Hi Jeff,

on 2020/5/20 上午11:58, Jiufu Guo via Gcc-patches wrote:
> Hi,
> 
> This patch check the size of a loop to be unrolled/peeled completely,
> and set the limits to a number (24).  This prevents large loop from
> being unrolled, then avoid binary size increasing, and this limit keeps
> performance.
> 
> Bootstrap&regtest pass on powerpc64le, ok for trunk?
> 
> Jiufu
> 
> ---
>  gcc/config/rs6000/rs6000.c | 19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
> index a1a3f9cb583..f3abb92d046 100644
> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -5142,6 +5142,22 @@ rs6000_loop_unroll_adjust (unsigned nunroll, struct loop *loop)
>    return nunroll;
>  }
>  
> +/* Count the number of statements in LOOP.  */
> +
> +static int
> +num_stmt_in_loop (class loop *loop)
> +{
> +  int res = 0;
> +  basic_block *bbs = get_loop_body (loop);
> +  for (unsigned i = 0; i < loop->num_nodes; i++)
> +    for (gimple_stmt_iterator bsi = gsi_start_bb (bbs[i]); !gsi_end_p (bsi);
> +	 gsi_next (&bsi))
> +      if (!is_gimple_debug (gsi_stmt (bsi)))
> +	res++;
> +
> +  return res;
> +}
> +

Would it be possible to use tree_num_loop_insns here?
If no, this can be part of tree-ssa-loop.c, and we need to free(bbs).

BR,
Kewen

>  /* Implement targetm.loop_allow_unroll_completely_peel.  */
>  
>  static bool
> @@ -5151,7 +5167,8 @@ rs6000_loop_allow_unroll_completely_peel (HOST_WIDE_INT maxiter, tree niter,
>    if (unroll_only_small_loops && optimize == 2)
>      {
>        if (maxiter >= 4
> -	  && !(TREE_CODE (niter) == INTEGER_CST && single_exit (loop)))
> +	  && !(TREE_CODE (niter) == INTEGER_CST && num_stmt_in_loop (loop) < 24
> +	       && single_exit (loop)))
>  	return false;
>      }
>  
> 


More information about the Gcc-patches mailing list