mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-09 22:51:29 +08:00
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
This commit is contained in:
parent
3eee49ed0d
commit
56bbfaf62c
gcc
@ -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
|
||||
|
@ -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
|
||||
|
36
gcc/testsuite/gcc.dg/torture/pr70288-1.c
Normal file
36
gcc/testsuite/gcc.dg/torture/pr70288-1.c
Normal file
@ -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);
|
||||
}
|
35
gcc/testsuite/gcc.dg/torture/pr70288-2.c
Normal file
35
gcc/testsuite/gcc.dg/torture/pr70288-2.c
Normal file
@ -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);
|
||||
}
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user