On Fri, 21 Jan 2022, Jiufu Guo wrote:

> Hi,
> 
> This patch correct the type of niter->control.base, when it is updated
> as a PLUS expr.
> During build PLUS expr, the result type should align with the type of
> the operands.
> 
> Bootstrap and regtest pass on ppc64/ppc64le and x86.
> Is this ok for trunk?

OK.

Thanks,
Richard.

> BR,
> Jiufu
> 
> 
>       PR tree-optimization/102087
> 
> gcc/ChangeLog:
> 
>       * tree-ssa-loop-niter.c (number_of_iterations_until_wrap):
>       Correct PLUS result type.
> 
> gcc/testsuite/ChangeLog:
> 
>       * gcc.dg/pr102087_1.c: New test.
> 
> ---
>  gcc/tree-ssa-loop-niter.c         | 17 +++++++++++++++--
>  gcc/testsuite/gcc.dg/pr102087_1.c | 13 +++++++++++++
>  2 files changed, 28 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/pr102087_1.c
> 
> diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
> index b767056aeb0..21cc257c91b 100644
> --- a/gcc/tree-ssa-loop-niter.c
> +++ b/gcc/tree-ssa-loop-niter.c
> @@ -1579,8 +1579,21 @@ number_of_iterations_until_wrap (class loop *loop, 
> tree type, affine_iv *iv0,
>       { IVbase - STEP, +, STEP } != bound
>       Here, biasing IVbase by 1 step makes 'bound' be the value before wrap.
>       */
> -  niter->control.base = fold_build2 (MINUS_EXPR, niter_type,
> -                                  niter->control.base, niter->control.step);
> +  tree base_type = TREE_TYPE (niter->control.base);
> +  if (POINTER_TYPE_P (base_type))
> +    {
> +      tree utype = unsigned_type_for (base_type);
> +      niter->control.base
> +     = fold_build2 (MINUS_EXPR, utype,
> +                    fold_convert (utype, niter->control.base),
> +                    fold_convert (utype, niter->control.step));
> +      niter->control.base = fold_convert (base_type, niter->control.base);
> +    }
> +  else
> +    niter->control.base
> +      = fold_build2 (MINUS_EXPR, base_type, niter->control.base,
> +                  niter->control.step);
> +
>    span = fold_build2 (MULT_EXPR, niter_type, niter->niter,
>                     fold_convert (niter_type, niter->control.step));
>    niter->bound = fold_build2 (PLUS_EXPR, niter_type, span,
> diff --git a/gcc/testsuite/gcc.dg/pr102087_1.c 
> b/gcc/testsuite/gcc.dg/pr102087_1.c
> new file mode 100644
> index 00000000000..ba4efe3b412
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr102087_1.c
> @@ -0,0 +1,13 @@
> +/* PR tree-optimization/102087 */
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -fprefetch-loop-arrays -w" { target x86_64-*-* 
> powerpc*-*-* } } */
> +
> +char **Gif_ClipImage_gfi_0;
> +int Gif_ClipImage_gfi_1, Gif_ClipImage_y, Gif_ClipImage_shift;
> +void Gif_ClipImage() {
> +  Gif_ClipImage_y = Gif_ClipImage_gfi_1 - 1;
> +  for (; Gif_ClipImage_y >= Gif_ClipImage_shift; Gif_ClipImage_y++)
> +    Gif_ClipImage_gfi_0[Gif_ClipImage_shift] =
> +        Gif_ClipImage_gfi_0[Gif_ClipImage_y];
> +}
> +
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)

Reply via email to