aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2016-06-22 13:13:22 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2016-06-22 13:13:22 +0000
commit951d8c8a23f37136cd377f8069ddeb5be8a67183 (patch)
tree51a5686c1558c4e5b1825085f9a18364c4ade0b0 /gcc/function.c
parentb60fc3bdf81ecc19693a5e8bab1ab079fa8f085d (diff)
downloadgcc-951d8c8a23f37136cd377f8069ddeb5be8a67183.zip
gcc-951d8c8a23f37136cd377f8069ddeb5be8a67183.tar.gz
gcc-951d8c8a23f37136cd377f8069ddeb5be8a67183.tar.bz2
* function.c (assign_parm_setup_reg): Prevent sharing in another case.
From-SVN: r237703
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/function.c b/gcc/function.c
index c15d47d..abee364 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3314,6 +3314,8 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
set_mem_attributes (parmreg, parm, 1);
}
+ /* We need to preserve an address based on VIRTUAL_STACK_VARS_REGNUM for
+ the debug info in case it is not legitimate. */
if (GET_MODE (parmreg) != GET_MODE (rtl))
{
rtx tempreg = gen_reg_rtx (GET_MODE (rtl));
@@ -3323,7 +3325,8 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
all->last_conversion_insn);
emit_move_insn (tempreg, rtl);
tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
- emit_move_insn (parmreg, tempreg);
+ emit_move_insn (MEM_P (parmreg) ? copy_rtx (parmreg) : parmreg,
+ tempreg);
all->first_conversion_insn = get_insns ();
all->last_conversion_insn = get_last_insn ();
end_sequence ();
@@ -3331,7 +3334,7 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
did_conversion = true;
}
else
- emit_move_insn (parmreg, rtl);
+ emit_move_insn (MEM_P (parmreg) ? copy_rtx (parmreg) : parmreg, rtl);
rtl = parmreg;