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