From: Richard Biener Date: Mon, 21 Mar 2016 09:11:37 +0000 (+0000) Subject: re PR tree-optimization/70288 (ICE with -O1 -fno-tree-dominator-opts) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=56bbfaf62ca1d53c8016e0d9e00394a5f23c047a;p=gcc.git re PR tree-optimization/70288 (ICE with -O1 -fno-tree-dominator-opts) 2016-03-21 Richard Biener 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 --- 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 + + 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 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 + + PR tree-optimization/70288 + * gcc.dg/torture/pr70288-1.c: New testcase. + * gcc.dg/torture/pr70288-2.c: Likewise. + 2016-03-21 Andrey Belevantsev 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 (stmt)), - stmt, loop))) + stmt, loop) + && ! is_gimple_min_invariant (gimple_switch_index ( + as_a (stmt))))) { if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, " Constant conditional.\n");