diff mbox

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

Message ID BANLkTimaWkw09MdFgTYCMqh-jELuRt1ej7S87GFajWho=ZUHdA@mail.gmail.com
State New
Headers show

Commit Message

Easwaran Raman June 23, 2011, 7:02 p.m. UTC
On Thu, Jun 23, 2011 at 3:22 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>> So, what's the patch(es) that need approval now?
>
> Original expr.c patch for PR rtl-optimization/49429 + adjusted and augmented
> calls.c patch for PR target/49454.  Everything is in this thread.
>
> Easwaran, would you mind posting a consolidated patch?
>
> --
> Eric Botcazou
>
Here is the revised patch. Bootstraps and all tests pass on
x86_64-unknown-linux. OK for trunk?


2011-06-23  Easwaran Raman  <eraman@google.com>

       PR rtl-optimization/49429
       PR target/49454
       * 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.
       * calls.c (initialize_argument_information): Mark
       an argument addressable if it is passed by invisible reference.
       (emit_library_call_value_1): Mark  MEM_EXPR (val) addressable
       if it is passed by reference.

Comments

Jakub Jelinek June 23, 2011, 7:16 p.m. UTC | #1
On Thu, Jun 23, 2011 at 12:02:35PM -0700, Easwaran Raman wrote:
> +      if (y_expr)
> +        mark_addressable (y_expr);

Please watch formatting, a tab should be used instead of 8 spaces.

> +      if (x_expr)
> +        mark_addressable (x_expr);

Ditto.

> @@ -1084,6 +1084,8 @@ initialize_argument_information (int num_actuals A
>  		  && TREE_CODE (base) != SSA_NAME
>  		  && (!DECL_P (base) || MEM_P (DECL_RTL (base)))))
>  	    {
> +              mark_addressable (args[i].tree_value);
> +

Likewise, plus the line is indented too much, each level should be indented
by 2 chars.

	Jakub
diff mbox

Patch

Index: gcc/expr.c
===================================================================
--- gcc/expr.c	(revision 175346)
+++ 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);

Index: gcc/calls.c
===================================================================
--- gcc/calls.c	(revision 175346)
+++ gcc/calls.c	(working copy)
@@ -1084,6 +1084,8 @@  initialize_argument_information (int num_actuals A
 		  && TREE_CODE (base) != SSA_NAME
 		  && (!DECL_P (base) || MEM_P (DECL_RTL (base)))))
 	    {
+              mark_addressable (args[i].tree_value);
+
 	      /* We can't use sibcalls if a callee-copied argument is
 		 stored in the current function's frame.  */
 	      if (!call_from_thunk_p && DECL_P (base) && !TREE_STATIC (base))
@@ -3524,7 +3526,12 @@  emit_library_call_value_1 (int retval, rtx orgfun,
 	    }

 	  if (MEM_P (val) && !must_copy)
-	    slot = val;
+            {
+              tree val_expr = MEM_EXPR (val);
+              if (val_expr)
+                mark_addressable (val_expr);
+	      slot = val;
+            }
 	  else
 	    {
 	      slot = assign_temp (lang_hooks.types.type_for_mode (mode, 0),