re PR tree-optimization/31797 (infinite loop in tree-ssa-pre or ICE)

2007-05-12  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/31797
	* tree-ssa-forwprop.c (forward_propagate_addr_expr): Do not
	propagate into a stmt that has volatile ops.

	* gcc.c-torture/compile/pr31797.c: New testcase.

From-SVN: r124637
This commit is contained in:
Richard Guenther 2007-05-12 17:21:43 +00:00 committed by Richard Biener
parent a747170836
commit c4160806e1
4 changed files with 51 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2007-05-12 Richard Guenther <rguenther@suse.de>
PR tree-optimization/31797
* tree-ssa-forwprop.c (forward_propagate_addr_expr): Do not
propagate into a stmt that has volatile ops.
2007-05-12 Richard Sandiford <richard@codesourcery.com>
* configure.ac (gcc_gxx_include_dir): Use $(libsubdir_to_prefix).

View File

@ -1,3 +1,8 @@
2007-05-12 Richard Guenther <rguenther@suse.de>
PR tree-optimization/31797
* gcc.c-torture/compile/pr31797.c: New testcase.
2007-05-12 Paul Thomas <pault@gcc.gnu.org>
PR fortran/30746

View File

@ -0,0 +1,31 @@
struct GTeth_desc
{
unsigned ed_cmdsts;
};
struct GTeth_softc
{
struct GTeth_desc txq_desc[32];
unsigned int txq_fi;
unsigned int txq_nactive;
};
void
GTeth_txq_free (struct GTeth_softc *sc)
{
struct GTeth_desc *txd = &sc->txq_desc[0];
txd->ed_cmdsts &= ~(1U << (31));
}
void
GTeth_txq_done (struct GTeth_softc *sc)
{
while (sc->txq_nactive > 0)
{
volatile struct GTeth_desc *txd = &sc->txq_desc[sc->txq_fi];
if (txd->ed_cmdsts)
{
if (sc->txq_nactive == 1)
return;
}
GTeth_txq_free (sc);
}
}

View File

@ -727,7 +727,7 @@ forward_propagate_addr_expr (tree name, tree rhs)
continue;
}
/* If the use is in a deeper loop nest, then we do not want
/* If the use is in a deeper loop nest, then we do not want
to propagate the ADDR_EXPR into the loop as that is likely
adding expression evaluations into the loop. */
if (bb_for_stmt (use_stmt)->loop_depth > stmt_loop_depth)
@ -735,7 +735,14 @@ forward_propagate_addr_expr (tree name, tree rhs)
all = false;
continue;
}
/* If the use_stmt has side-effects, don't propagate into it. */
if (stmt_ann (use_stmt)->has_volatile_ops)
{
all = false;
continue;
}
push_stmt_changes (&use_stmt);
result = forward_propagate_addr_expr_1 (name, rhs, use_stmt,