On Tue, Jun 21, 2011 at 3:38 AM, Easwaran Raman <era...@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 <era...@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); >