This fixes bugs introduced by r175063. OK for trunk if there are no test regressions?
-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);