http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47265
--- Comment #6 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-01-25 10:47:29 UTC --- (In reply to comment #5) > Actually, there is a far easier fix. Either add > if (all && !has_zero_uses (name)) > all = false; > to the end of forward_propagate_addr_expr, or we could iterate some more, > either like this: > --- gcc/tree-ssa-forwprop.c.jj 2011-01-15 11:26:42.000000000 +0100 > +++ gcc/tree-ssa-forwprop.c 2011-01-25 11:22:02.828495766 +0100 > @@ -1061,6 +1061,8 @@ forward_propagate_addr_expr (tree name, > bool all = true; > bool single_use_p = has_single_use (name); > > + do > + { > FOR_EACH_IMM_USE_STMT (use_stmt, iter, name) > { > bool result; > @@ -1113,6 +1115,7 @@ forward_propagate_addr_expr (tree name, > gsi_remove (&gsi, true); > } > } > + } while (all && !has_zero_uses (name)); > > return all; > } > > or say just once or say 4 times: > int i; > for (i = 0; i < 4; i++) > { > FOR_EACH_IMM_USE_STMT (use_stmt, iter, name) > { > ... > } > if (!all || has_zero_uses (name)) > return all; > } > return false; Or simply return all && has_zero_uses (name); ?