diff options
author | kyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-10-03 08:43:21 +0000 |
---|---|---|
committer | kyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-10-03 08:43:21 +0000 |
commit | e88cf7afb8c5b002d778687fac41c7f6d3f2a7c3 (patch) | |
tree | cb18144264106e9531c4d4df7a79d5ff50b16098 | |
parent | 321d85d9e8bddb1b9b8f000cf13710228a865779 (diff) | |
download | gcc-e88cf7afb8c5b002d778687fac41c7f6d3f2a7c3.tar.gz |
gcc/
* lra-constraints.c (inherit_in_ebb): Handle calls with
multiple return values.
* caller-save.c (save_call_clobbered_regs): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215839 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/caller-save.c | 9 | ||||
-rw-r--r-- | gcc/lra-constraints.c | 25 |
3 files changed, 28 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4a7366d4e90..884495f4ab2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-10-03 Ilya Enkovich <ilya.enkovich@intel.com> + + * lra-constraints.c (inherit_in_ebb): Handle calls with + multiple return values. + * caller-save.c (save_call_clobbered_regs): Likewise. + 2014-10-03 Jakub Jelinek <jakub@redhat.com> * tree-vect-data-refs.c (vect_permute_load_chain, diff --git a/gcc/caller-save.c b/gcc/caller-save.c index 11df2ecc171..e28facba7be 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -879,8 +879,13 @@ save_call_clobbered_regs (void) if (GET_CODE (pat) == PARALLEL) pat = XVECEXP (pat, 0, 0); dest = SET_DEST (pat); - newpat = gen_rtx_SET (VOIDmode, cheap, copy_rtx (dest)); - chain = insert_one_insn (chain, 0, -1, newpat); + /* For multiple return values dest is PARALLEL. + Currently we handle only single return value case. */ + if (REG_P (dest)) + { + newpat = gen_rtx_SET (VOIDmode, cheap, copy_rtx (dest)); + chain = insert_one_insn (chain, 0, -1, newpat); + } } } last = chain; diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index 5f6839968d6..f1642f3b390 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -5348,16 +5348,21 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail) if (GET_CODE (pat) == PARALLEL) pat = XVECEXP (pat, 0, 0); dest = SET_DEST (pat); - start_sequence (); - emit_move_insn (cheap, copy_rtx (dest)); - restore = get_insns (); - end_sequence (); - lra_process_new_insns (curr_insn, NULL, restore, - "Inserting call parameter restore"); - /* We don't need to save/restore of the pseudo from - this call. */ - usage_insns[regno].calls_num = calls_num; - bitmap_set_bit (&check_only_regs, regno); + /* For multiple return values dest is PARALLEL. + Currently we handle only single return value case. */ + if (REG_P (dest)) + { + start_sequence (); + emit_move_insn (cheap, copy_rtx (dest)); + restore = get_insns (); + end_sequence (); + lra_process_new_insns (curr_insn, NULL, restore, + "Inserting call parameter restore"); + /* We don't need to save/restore of the pseudo from + this call. */ + usage_insns[regno].calls_num = calls_num; + bitmap_set_bit (&check_only_regs, regno); + } } } to_inherit_num = 0; |