Mark variables addressable if they are copied using libcall in RTL expander

Richard Guenther richard.guenther@gmail.com
Tue Jun 21 09:02:00 GMT 2011


On Tue, Jun 21, 2011 at 3:38 AM, Easwaran Raman <eraman@google.com> wrote:
> This fixes bugs introduced by r175063. OK for trunk if there are no
> test regressions?

I fear this isn't enough considering pass-by-value aggregates that
are callee copied.  And I guess there are other cases.  Eric, what
do you suggest here?

Thanks,
Richard.

> -Easwaran
>
>
> 2011-06-20  Easwaran Raman  <eraman@google.com>
>
>        PR rtl-optimization/49429
>        * expr.c (emit_block_move_hints):  Mark MEM_EXPR(x) and
>        MEM_EXPR(y) addressable if emit_block_move_via_libcall is
>        used to copy y into x.
>
> Index: gcc/expr.c
> ===================================================================
> --- gcc/expr.c  (revision 175081)
> +++ gcc/expr.c  (working copy)
> @@ -1181,8 +1181,19 @@ emit_block_move_hints (rtx x, rtx y, rtx size, enu
>   else if (may_use_call
>           && ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (x))
>           && ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (y)))
> -    retval = emit_block_move_via_libcall (x, y, size,
> -                                         method == BLOCK_OP_TAILCALL);
> +    {
> +      /* Since x and y are passed to a libcall, mark the corresponding
> +         tree EXPR as addressable.  */
> +      tree y_expr = MEM_EXPR (y);
> +      tree x_expr = MEM_EXPR (x);
> +      if (y_expr)
> +        mark_addressable (y_expr);
> +      if (x_expr)
> +        mark_addressable (x_expr);
> +      retval = emit_block_move_via_libcall (x, y, size,
> +                                           method == BLOCK_OP_TAILCALL);
> +    }
> +
>   else
>     emit_block_move_via_loop (x, y, size, align);
>



More information about the Gcc-patches mailing list