Commit cc603b40 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/53226 (Endless loop in forwprop)

	PR tree-optimization/53226
	* tree-ssa-forwprop.c (ssa_forward_propagate_and_combine): Remove
	prev and prev_initialized vars, gimple_set_plf (stmt, GF_PLF_1, false)
	before processing it and gimple_set_plf (stmt, GF_PLF_1, true) if it
	doesn't need to be revisited, look for earliest stmt with
	!gimple_plf (stmt, GF_PLF_1) if something changed.

	* gcc.c-torture/compile/pr53226.c: New test.

From-SVN: r187328
parent 97e574d8
2012-05-09 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/53226
* tree-ssa-forwprop.c (ssa_forward_propagate_and_combine): Remove
prev and prev_initialized vars, gimple_set_plf (stmt, GF_PLF_1, false)
before processing it and gimple_set_plf (stmt, GF_PLF_1, true) if it
doesn't need to be revisited, look for earliest stmt with
!gimple_plf (stmt, GF_PLF_1) if something changed.
2012-05-09 Terry Guo <terry.guo@arm.com> 2012-05-09 Terry Guo <terry.guo@arm.com>
* genmultilib: Update copyright dates. * genmultilib: Update copyright dates.
......
2012-05-09 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/53226
* gcc.c-torture/compile/pr53226.c: New test.
2012-05-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2012-05-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* gcc.target/i386/hle-add-acq-1.c: Allow for ; after lock. * gcc.target/i386/hle-add-acq-1.c: Allow for ; after lock.
......
/* PR tree-optimization/53226 */
void
foo (unsigned long *x, char y, char z)
{
int i;
for (i = y; i < z; ++i)
{
unsigned long a = ((unsigned char) i) & 63UL;
unsigned long b = 1ULL << a;
*x |= b;
}
}
...@@ -2677,8 +2677,7 @@ ssa_forward_propagate_and_combine (void) ...@@ -2677,8 +2677,7 @@ ssa_forward_propagate_and_combine (void)
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
{ {
gimple_stmt_iterator gsi, prev; gimple_stmt_iterator gsi;
bool prev_initialized;
/* Apply forward propagation to all stmts in the basic-block. /* Apply forward propagation to all stmts in the basic-block.
Note we update GSI within the loop as necessary. */ Note we update GSI within the loop as necessary. */
...@@ -2771,12 +2770,14 @@ ssa_forward_propagate_and_combine (void) ...@@ -2771,12 +2770,14 @@ ssa_forward_propagate_and_combine (void)
/* Combine stmts with the stmts defining their operands. /* Combine stmts with the stmts defining their operands.
Note we update GSI within the loop as necessary. */ Note we update GSI within the loop as necessary. */
prev_initialized = false;
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);) for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
{ {
gimple stmt = gsi_stmt (gsi); gimple stmt = gsi_stmt (gsi);
bool changed = false; bool changed = false;
/* Mark stmt as potentially needing revisiting. */
gimple_set_plf (stmt, GF_PLF_1, false);
switch (gimple_code (stmt)) switch (gimple_code (stmt))
{ {
case GIMPLE_ASSIGN: case GIMPLE_ASSIGN:
...@@ -2856,18 +2857,18 @@ ssa_forward_propagate_and_combine (void) ...@@ -2856,18 +2857,18 @@ ssa_forward_propagate_and_combine (void)
{ {
/* If the stmt changed then re-visit it and the statements /* If the stmt changed then re-visit it and the statements
inserted before it. */ inserted before it. */
if (!prev_initialized) for (; !gsi_end_p (gsi); gsi_prev (&gsi))
if (gimple_plf (gsi_stmt (gsi), GF_PLF_1))
break;
if (gsi_end_p (gsi))
gsi = gsi_start_bb (bb); gsi = gsi_start_bb (bb);
else else
{
gsi = prev;
gsi_next (&gsi); gsi_next (&gsi);
} }
}
else else
{ {
prev = gsi; /* Stmt no longer needs to be revisited. */
prev_initialized = true; gimple_set_plf (stmt, GF_PLF_1, true);
gsi_next (&gsi); gsi_next (&gsi);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment