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);

?

Reply via email to