I have tested the following patch to revert the fix for PR84204.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk
and branch.

Richard.

2018-10-18  Richard Biener  <rguent...@suse.de>

        PR middle-end/87087
        Revert
        2018-02-07  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/84204
        * tree-chrec.c (chrec_fold_plus_1): Remove size limiting in
        this place.

        * gcc.dg/torture/pr87087.c: New testcase.
        * gcc.dg/graphite/pr84204.c: XFAIL.
        * gcc.dg/graphite/pr85935.c: Likewise.

Index: gcc/testsuite/gcc.dg/graphite/pr84204.c
===================================================================
--- gcc/testsuite/gcc.dg/graphite/pr84204.c     (revision 265234)
+++ gcc/testsuite/gcc.dg/graphite/pr84204.c     (working copy)
@@ -1,5 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-O -floop-parallelize-all -fno-tree-loop-im --param 
scev-max-expr-size=3" } */
+/* The fix for PR84204 was reverted.  */
+/* { dg-additional-options "--param graphite-allow-codegen-errors=1" } */
 
 int oc;
 
Index: gcc/testsuite/gcc.dg/graphite/pr85935.c
===================================================================
--- gcc/testsuite/gcc.dg/graphite/pr85935.c     (revision 265234)
+++ gcc/testsuite/gcc.dg/graphite/pr85935.c     (working copy)
@@ -1,5 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-O -floop-parallelize-all -fno-tree-loop-im --param 
scev-max-expr-size=3" } */
+/* The fix for PR84204 was reverted.  */
+/* { dg-additional-options "--param graphite-allow-codegen-errors=1" } */
 
 typedef int dq;
 
Index: gcc/testsuite/gcc.dg/torture/pr87087.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr87087.c      (nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr87087.c      (working copy)
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target int32plus } */
+
+int b;
+int d;
+void e()
+{
+  unsigned f;
+  unsigned g;
+  int h;
+  long i = 901380;
+  for (;;) {
+      d = 0;
+      for (; d; d++) {
+         h = 143366620;
+         f = 0;
+         for (; f < 15; f += 3) {
+             g = 0;
+             for (; g < 9; g++)
+               b = h = i - (h << 5) + h;
+         }
+      }
+      i = 0;
+  }
+}
Index: gcc/tree-chrec.c
===================================================================
--- gcc/tree-chrec.c    (revision 265234)
+++ gcc/tree-chrec.c    (working copy)
@@ -375,10 +375,12 @@ chrec_fold_plus_1 (enum tree_code code,
 
        default:
          {
-           if (tree_contains_chrecs (op0, NULL)
-               || tree_contains_chrecs (op1, NULL))
+           int size = 0;
+           if ((tree_contains_chrecs (op0, &size)
+                || tree_contains_chrecs (op1, &size))
+               && size < PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE))
              return build2 (code, type, op0, op1);
-           else
+           else if (size < PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE))
              {
                if (code == POINTER_PLUS_EXPR)
                  return fold_build_pointer_plus (fold_convert (type, op0),
@@ -388,6 +390,8 @@ chrec_fold_plus_1 (enum tree_code code,
                                      fold_convert (type, op0),
                                      fold_convert (type, op1));
              }
+           else
+             return chrec_dont_know;
          }
        }
     }

Reply via email to