summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-03-21 09:11:37 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-03-21 09:11:37 +0000
commit56bbfaf62ca1d53c8016e0d9e00394a5f23c047a (patch)
tree3bc1f9fdebe2a92b99d3cd21c5a25bcbdd36041f
parent3eee49ed0d613c47ddfec85eeb7c0430ae6d2ec5 (diff)
re PR tree-optimization/70288 (ICE with -O1 -fno-tree-dominator-opts)
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr70288-1.c36
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr70288-2.c35
-rw-r--r--gcc/tree-ssa-loop-ivcanon.c10
5 files changed, 92 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f4431a02bdb..2efe7ea31fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d022eb12fa9..f7ca6848fd0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..1fb049548fa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr70288-1.c
@@ -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
index 00000000000..ad90fd45887
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr70288-2.c
@@ -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);
+}
diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c
index 1a4d6df7062..72f91b27342 100644
--- a/gcc/tree-ssa-loop-ivcanon.c
+++ b/gcc/tree-ssa-loop-ivcanon.c
@@ -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");