From: rguenth Date: Mon, 21 Mar 2016 09:11:37 +0000 (+0000) Subject: 2016-03-21 Richard Biener X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=93505d2263b79f3e5967ae1fec082cf0843e610a;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234361 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f4431a02bdb8..2efe7ea31fa7 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 d022eb12fa99..f7ca6848fd04 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 000000000000..1fb049548faa --- /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 000000000000..ad90fd45887f --- /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 1a4d6df7062b..72f91b273421 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");