On Wed, 20 Jun 2018, Tom de Vries wrote:

> Hi,
> 
> Consider the test-case from the patch. When compiled with "-O2
> -ftree-parallelize-loops=2 -fno-tree-dce", it ICEs like this:
> ...
> error: mismatching comparison operand types
> signed int
> unsigned int
> if (ivtmp_32 < 3)
> during GIMPLE pass: parloops
> pr86097.c:4:1: internal compiler error: verify_gimple failed
> ...
> 
> The comparison with signed int and unsigned int operands is generated during
> the call to canonicalize_loop_ivs in the parloops pass.
> 
> Parloops calls canonicalize_loop_ivs with nit (the number of loop iterations)
> set to (unsigned int)3. Then canonicalize_loop_ivs decides to use a canonical
> iv of type signed int.  At the end of canonicalize_loop_ivs, the comparison
> between the unsigned nit and the signed iv is constructed.
> 
> This patch fixes the ICE by ensuring that nit is casted to the iv type in this
> case.
> 
> Bootstrapped and reg-tested on x86_64.
> 
> OK for trunk?

OK.

Thanks,
Richard.

> Thanks,
> - Tom
> 
> Generate correctly typed compare in canonicalize_loop_ivs
> 
> 2018-06-20  Tom de Vries  <tdevr...@suse.de>
> 
>       PR tree-optimization/86097
>       * tree-ssa-loop-manip.c (canonicalize_loop_ivs): Also convert *nit to
>       iv type if signedness of iv type is not the same as that of *nit.
> 
>       * gcc.dg/autopar/pr86097.c: New test.
> 
> ---
>  gcc/testsuite/gcc.dg/autopar/pr86097.c | 31 +++++++++++++++++++++++++++++++
>  gcc/tree-ssa-loop-manip.c              |  3 ++-
>  2 files changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/gcc/testsuite/gcc.dg/autopar/pr86097.c 
> b/gcc/testsuite/gcc.dg/autopar/pr86097.c
> new file mode 100644
> index 00000000000..b48e87b8bf9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/autopar/pr86097.c
> @@ -0,0 +1,31 @@
> +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fno-tree-dce 
> -Wno-aggressive-loop-optimizations" } */
> +int rp, vd;
> +
> +void
> +p5 (int cd)
> +{
> +  while (cd != 0)
> +    {
> +      for (rp = 0; rp < 4; ++rp)
> +        for (vd = 0; vd < 1; ++vd)
> +          {
> + g0:
> +            ;
> +          }
> +
> +      ++rp;
> +    }
> +
> +  while (rp < 2)
> +    {
> +      for (cd = 0; cd < 1; ++cd)
> +        for (rp = 1; rp != 0; ++rp)
> +          {
> +          }
> +
> +      ++rp;
> +    }
> +
> +  if (cd != 0)
> +    goto g0;
> +}
> diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c
> index bf425afd436..5acee6c98f3 100644
> --- a/gcc/tree-ssa-loop-manip.c
> +++ b/gcc/tree-ssa-loop-manip.c
> @@ -1542,7 +1542,8 @@ canonicalize_loop_ivs (struct loop *loop, tree *nit, 
> bool bump_in_latch)
>    precision = GET_MODE_PRECISION (mode);
>    type = build_nonstandard_integer_type (precision, unsigned_p);
>  
> -  if (original_precision != precision)
> +  if (original_precision != precision
> +      || TYPE_UNSIGNED (TREE_TYPE (*nit)) != unsigned_p)
>      {
>        *nit = fold_convert (type, *nit);
>        *nit = force_gimple_operand (*nit, &stmts, true, NULL_TREE);
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to