diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-10 19:14:17 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-10 19:14:17 +0000 |
commit | 9502706b6bfb9c64e6dcdf0fda503997b4a31ab5 (patch) | |
tree | ea3e010ea64a6fc13c330cfb2ace81f92aea443d | |
parent | 7d1c2d35756ec2bf2c6fdf98b64143479f21d33a (diff) | |
download | gcc-9502706b6bfb9c64e6dcdf0fda503997b4a31ab5.tar.gz |
PR bootstrap/63573
* calls.c (initialize_argument_information): When emitting thunk call
use original memory placement of the argument.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217307 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/calls.c | 10 |
2 files changed, 16 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f29986b6682..10bd4806f63 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-11-10 Jan Hubicka <hubicka@ucw.cz> + + PR bootstrap/63573 + * calls.c (initialize_argument_information): When emitting thunk call + use original memory placement of the argument. + 2014-11-10 Renlin Li <renlin.li@arm.com> PR middle-end/61529 diff --git a/gcc/calls.c b/gcc/calls.c index 06b8485ff7f..7f55aafa734 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1304,6 +1304,16 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED, && TREE_CODE (base) != SSA_NAME && (!DECL_P (base) || MEM_P (DECL_RTL (base))))) { + /* Argument setup code may have copied the value to register. We + revert that optimization now because the tail call code must + use the original location. */ + if (TREE_CODE (args[i].tree_value) == PARM_DECL + && !MEM_P (DECL_RTL (args[i].tree_value)) + && DECL_INCOMING_RTL (args[i].tree_value) + && MEM_P (DECL_INCOMING_RTL (args[i].tree_value))) + set_decl_rtl (args[i].tree_value, + DECL_INCOMING_RTL (args[i].tree_value)); + mark_addressable (args[i].tree_value); /* We can't use sibcalls if a callee-copied argument is |