http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49429
--- Comment #11 from Easwaran Raman <eraman at google dot com> 2011-06-20
18:40:46 UTC ---
(In reply to comment #10)
> With regards to the question in comment #9, you would probably do better
> asking
> it on the gcc-patches mailing list then in the comment of this bug report
> since
> more people would see it on the mailing list.
Could you please try out this patch? I don't have the ia-64 host libraries and
have a half-broken cross compiler, but this seems to fix the issue in y.c.
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);