re PR tree-optimization/70288 (ICE with -O1 -fno-tree-dominator-opts)
authorRichard Biener <rguenther@suse.de>
Mon, 21 Mar 2016 09:11:37 +0000 (09:11 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 21 Mar 2016 09:11:37 +0000 (09:11 +0000)
2016-03-21  Richard Biener  <rguenther@suse.de>

PR tree-optimization/70288
* tree-ssa-loop-ivcanon.c (tree_estimate_loop_size): Make sure
we do not estimate unsimplified all-constant conditionals or
switches as optimized away.

* gcc.dg/torture/pr70288-1.c: New testcase.
* gcc.dg/torture/pr70288-2.c: Likewise.

From-SVN: r234361

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr70288-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr70288-2.c [new file with mode: 0644]
gcc/tree-ssa-loop-ivcanon.c

index f4431a02bdb88b15397c9c172017ac6c10060011..2efe7ea31fa740f3b2f5bbd766684c8bc722ed4b 100644 (file)
@@ -1,3 +1,10 @@
+2016-03-21  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/70288
+       * tree-ssa-loop-ivcanon.c (tree_estimate_loop_size): Make sure
+       we do not estimate unsimplified all-constant conditionals or
+       switches as optimized away.
+
 2016-03-21  Andrey Belevantsev  <abel@ispras.ru>
 
        PR rtl-optimization/69102
index d022eb12fa99f55df0d51636cfb27217888fd133..f7ca6848fd04821ad096b6e6008e74a2ec332210 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-21  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/70288
+       * gcc.dg/torture/pr70288-1.c: New testcase.
+       * gcc.dg/torture/pr70288-2.c: Likewise.
+
 2016-03-21  Andrey Belevantsev  <abel@ispras.ru>
 
        PR rtl-optimization/69307
diff --git a/gcc/testsuite/gcc.dg/torture/pr70288-1.c b/gcc/testsuite/gcc.dg/torture/pr70288-1.c
new file mode 100644 (file)
index 0000000..1fb0495
--- /dev/null
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target int32plus } */
+
+int main()
+{
+  int var6 = -1267827473;
+  do {
+      ++var6;
+      double s1_115[4], s2_108[4];
+      int var8 = -161498264;
+      do {
+         ++var8;
+         int var12 = 1260960076;
+         for (; var12 <= 1260960080; ++var12) {
+             int var13 = 1960990937;
+             do {
+                 ++var13;
+                 int var14 = 2128638723;
+                 for (; var14 <= 2128638728; ++var14) {
+                     int var22 = -1141190839;
+                     do {
+                         ++var22;
+                         if (s2_108 > s1_115) {
+                             int var23 = -890798748;
+                             do {
+                                 ++var23;
+                                 long long e_119[4];
+                             } while (var23 <= -890798746);
+                         }
+                     } while (var22 <= -1141190829);
+                 }
+             } while (var13 <= 1960990946);
+         }
+      } while (var8 <= -161498254);
+  } while (var6 <= -1267827462);
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr70288-2.c b/gcc/testsuite/gcc.dg/torture/pr70288-2.c
new file mode 100644 (file)
index 0000000..ad90fd4
--- /dev/null
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target int32plus } */
+
+int main()
+{
+  int var6 = -1267827473;
+  do {
+      ++var6;
+      double s1_115[4], s2_108[4];
+      int var8 = -161498264;
+      do {
+         ++var8;
+         int var12 = 1260960076;
+         for (; var12 <= 1260960080; ++var12) {
+             int var13 = 1960990937;
+             do {
+                 ++var13;
+                 int var14 = 2128638723;
+                 for (; var14 <= 2128638728; ++var14) {
+                     int var22 = -1141190839;
+                     do {
+                         ++var22;
+                         if (s2_108 > s1_115) {
+                             int var23 = -890798748;
+                             do {
+                                 long long e_119[4];
+                             } while (var23 <= -890798746);
+                         }
+                     } while (var22 <= -1141190829);
+                 }
+             } while (var13 <= 1960990946);
+         }
+      } while (var8 <= -161498254);
+  } while (var6 <= -1267827462);
+}
index 1a4d6df7062b12134a615be001132888d56fa5ce..72f91b27342158ed02caffc44168a946332078c0 100644 (file)
@@ -298,11 +298,17 @@ tree_estimate_loop_size (struct loop *loop, edge exit, edge edge_to_cancel, stru
          /* Conditionals.  */
          else if ((gimple_code (stmt) == GIMPLE_COND
                    && constant_after_peeling (gimple_cond_lhs (stmt), stmt, loop)
-                   && constant_after_peeling (gimple_cond_rhs (stmt), stmt, loop))
+                   && constant_after_peeling (gimple_cond_rhs (stmt), stmt, loop)
+                   /* We don't simplify all constant compares so make sure
+                      they are not both constant already.  See PR70288.  */
+                   && (! is_gimple_min_invariant (gimple_cond_lhs (stmt))
+                       || ! is_gimple_min_invariant (gimple_cond_rhs (stmt))))
                   || (gimple_code (stmt) == GIMPLE_SWITCH
                       && constant_after_peeling (gimple_switch_index (
                                                    as_a <gswitch *> (stmt)),
-                                                 stmt, loop)))
+                                                 stmt, loop)
+                      && ! is_gimple_min_invariant (gimple_switch_index (
+                                                      as_a <gswitch *> (stmt)))))
            {
              if (dump_file && (dump_flags & TDF_DETAILS))
                fprintf (dump_file, "   Constant conditional.\n");