diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2004-03-29 14:48:45 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2004-03-29 09:48:45 -0500 |
commit | 97955d55bbe5aab1da0427e11e740851c83e18ff (patch) | |
tree | 0267fcb37b88731de6ad0267822013c7567f8316 | |
parent | 2820d220585177ca4e2e3136bf8ff255303ba6db (diff) | |
download | gcc-97955d55bbe5aab1da0427e11e740851c83e18ff.zip gcc-97955d55bbe5aab1da0427e11e740851c83e18ff.tar.gz gcc-97955d55bbe5aab1da0427e11e740851c83e18ff.tar.bz2 |
function.c (put_var_into_stack): If old RTL was ADDRESSOF, update the address inside the old RTL.
* function.c (put_var_into_stack): If old RTL was ADDRESSOF, update
the address inside the old RTL.
From-SVN: r80057
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/function.c | 14 |
2 files changed, 15 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ea79883..28a6353 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/function.c b/gcc/function.c index 0972615..48e2f5d 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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) { |