diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2014-07-24 15:17:35 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-07-24 15:17:35 +0000 |
commit | 1a8cb1557afa68b6924036babfa7b68f2d9bdfec (patch) | |
tree | 49d0c94109fd5b2babebf70c832b8a08a6eb1b6b /gcc/calls.c | |
parent | 4b92caa1d6e5623e3562a76976d0bba7a413b2ce (diff) | |
download | gcc-1a8cb1557afa68b6924036babfa7b68f2d9bdfec.zip gcc-1a8cb1557afa68b6924036babfa7b68f2d9bdfec.tar.gz gcc-1a8cb1557afa68b6924036babfa7b68f2d9bdfec.tar.bz2 |
re PR middle-end/61268 (ICE in vt_expand_var_loc_chain, at var-tracking.c:8262)
gcc/
PR middle-end/61268
* function.c (assign_parm_setup_reg): Prevent invalid sharing of
DECL_INCOMING_RTL and entry_parm.
(get_arg_pointer_save_area): Likewise arg_pointer_save_area.
* calls.c (load_register_parameters): Likewise argument values.
(emit_library_call_value_1, store_one_arg): Likewise argument
save areas.
* config/i386/i386.c (assign_386_stack_local): Likewise the local
stack slot.
* explow.c (validize_mem): Modify the argument in-place.
From-SVN: r213002
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index 78fe7d8..e845652 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1937,7 +1937,7 @@ load_register_parameters (struct arg_data *args, int num_actuals, else if (partial == 0 || args[i].pass_on_stack) { - rtx mem = validize_mem (args[i].value); + rtx mem = validize_mem (copy_rtx (args[i].value)); /* Check for overlap with already clobbered argument area, providing that this has non-zero size. */ @@ -4014,7 +4014,8 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, argvec[argnum].locate.size.constant ); - emit_block_move (validize_mem (argvec[argnum].save_area), + emit_block_move (validize_mem + (copy_rtx (argvec[argnum].save_area)), stack_area, GEN_INT (argvec[argnum].locate.size.constant), BLOCK_OP_CALL_PARM); @@ -4289,7 +4290,8 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, if (save_mode == BLKmode) emit_block_move (stack_area, - validize_mem (argvec[count].save_area), + validize_mem + (copy_rtx (argvec[count].save_area)), GEN_INT (argvec[count].locate.size.constant), BLOCK_OP_CALL_PARM); else @@ -4433,7 +4435,8 @@ store_one_arg (struct arg_data *arg, rtx argblock, int flags, arg->save_area = assign_temp (TREE_TYPE (arg->tree_value), 1, 1); preserve_temp_slots (arg->save_area); - emit_block_move (validize_mem (arg->save_area), stack_area, + emit_block_move (validize_mem (copy_rtx (arg->save_area)), + stack_area, GEN_INT (arg->locate.size.constant), BLOCK_OP_CALL_PARM); } |