This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix PR80539


On Thu, Apr 27, 2017 at 10:25 AM, Richard Biener <rguenther@suse.de> wrote:
>
> SCEV analysis requires us to be in loop-closed SSA form to be able
> to compute overall effects of inner loops when required.  Unfortunately
> we have too many places it is used where we are not in loop-closed SSA
> form.  The following patch makes us more conservative in two places
> where we previously ICEd.
>
> I'm not 100% sure we'll get away w/ not being in loop-closed SSA form
> (code correctness wise) but unless we get a testcase showing this the
> following is a sane approach (esp. on release branches).
>
> Bootstrap and regtest in progress on x86_64-unknown-linux-gnu.
>
> Richard.
>
> 2017-04-27  Richard Biener  <rguenther@suse.de>
>
>         PR middle-end/80539
>         * tree-chrec.c (chrec_fold_plus_poly_poly): Deal with not
>         being in loop-closed SSA form conservatively.
>         (chrec_fold_multiply_poly_poly): Likewise.
>
>         * gcc.dg/torture/pr80539.c: New testcase.
>
> Index: gcc/tree-chrec.c
> ===================================================================
> --- gcc/tree-chrec.c    (revision 247293)
> +++ gcc/tree-chrec.c    (working copy)
> @@ -149,7 +149,12 @@ chrec_fold_plus_poly_poly (enum tree_cod
>
>    /* This function should never be called for chrecs of loops that
>       do not belong to the same loop nest.  */
> -  gcc_assert (loop0 == loop1);
> +  if (loop0 != loop1)
> +    {
> +      /* It still can happen if we are not in loop-closed SSA form.  */
> +      gcc_assert (! loops_state_satisfies_p (LOOP_CLOSED_SSA));
> +      return chrec_dont_know;
> +    }
But it returns chrec_dont_know in the case it didn't if LOOP_CLOSED_SSA?

Thanks,
bin
>
>    if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
>      {
> @@ -211,7 +216,12 @@ chrec_fold_multiply_poly_poly (tree type
>         chrec_fold_multiply (type, CHREC_LEFT (poly0), poly1),
>         CHREC_RIGHT (poly0));
>
> -  gcc_assert (loop0 == loop1);
> +  if (loop0 != loop1)
> +    {
> +      /* It still can happen if we are not in loop-closed SSA form.  */
> +      gcc_assert (! loops_state_satisfies_p (LOOP_CLOSED_SSA));
> +      return chrec_dont_know;
> +    }
>
>    /* poly0 and poly1 are two polynomials in the same variable,
>       {a, +, b}_x * {c, +, d}_x  ->  {a*c, +, a*d + b*c + b*d, +, 2*b*d}_x.  */
> Index: gcc/testsuite/gcc.dg/torture/pr80539.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/torture/pr80539.c      (nonexistent)
> +++ gcc/testsuite/gcc.dg/torture/pr80539.c      (working copy)
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +
> +signed char a, b;
> +void fn1()
> +{
> +  signed char c, e;
> +  short d;
> +  if (0) {
> +      for (; d;) {
> +l1:
> +         for (c = 7; a; c++)
> +           ;
> +         e = 6;
> +         for (; b; e++)
> +           ;
> +      }
> +      c -= e;
> +  }
> +  if (d == 7)
> +    goto l1;
> +  a = c;
> +}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]