function.c (put_var_into_stack): If old RTL was ADDRESSOF, update the address inside...
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Mon, 29 Mar 2004 14:48:45 +0000 (14:48 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 29 Mar 2004 14:48:45 +0000 (09:48 -0500)
* function.c (put_var_into_stack): If old RTL was ADDRESSOF, update
the address inside the old RTL.

From-SVN: r80057

gcc/ChangeLog
gcc/function.c

index ea7988319bf73adcaede2a6449ea0752f35341e6..28a63535fe3eb27327e92d5b38d5484e7576e48d 100644 (file)
@@ -1,3 +1,8 @@
+2004-03-29  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * function.c (put_var_into_stack): If old RTL was ADDRESSOF, update
+       the address inside the old RTL.
+
 2004-03-28  Zack Weinberg  <zack@codesourcery.com>
 
        * c-decl.c: Verify that C_SIZEOF_STRUCT_LANG_IDENTIFIER is correct.
index 0972615d89f7b25cda9d2a76046fe4b02de2005c..48e2f5d79d9ec95909079004a7dc400645881159 100644 (file)
@@ -1287,7 +1287,7 @@ init_temp_slots (void)
 void
 put_var_into_stack (tree decl, int rescan)
 {
-  rtx reg;
+  rtx orig_reg, reg;
   enum machine_mode promoted_mode, decl_mode;
   struct function *function = 0;
   tree context;
@@ -1299,9 +1299,9 @@ put_var_into_stack (tree decl, int rescan)
   context = decl_function_context (decl);
 
   /* Get the current rtl used for this object and its original mode.  */
-  reg = (TREE_CODE (decl) == SAVE_EXPR
-        ? SAVE_EXPR_RTL (decl)
-        : DECL_RTL_IF_SET (decl));
orig_reg = reg = (TREE_CODE (decl) == SAVE_EXPR
+                  ? SAVE_EXPR_RTL (decl)
+                  : DECL_RTL_IF_SET (decl));
 
   /* No need to do anything if decl has no rtx yet
      since in that case caller is setting TREE_ADDRESSABLE
@@ -1366,6 +1366,12 @@ put_var_into_stack (tree decl, int rescan)
       else
        put_reg_into_stack (function, reg, TREE_TYPE (decl), promoted_mode,
                            decl_mode, volatilep, 0, usedp, 0);
+
+         /* If this was previously a MEM but we've removed the ADDRESSOF,
+            set this address into that MEM so we always use the same
+            rtx for this variable.  */
+         if (orig_reg != reg && GET_CODE (orig_reg) == MEM)
+           XEXP (orig_reg, 0) = XEXP (reg, 0);
     }
   else if (GET_CODE (reg) == CONCAT)
     {