mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
97e574d82f
commit
cc603b4051
|
@ -1,3 +1,12 @@
|
||||||
|
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.
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
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.
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
/* 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)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
/* 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)
|
||||||
{
|
{
|
||||||
/* 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue