diff options
author | Pranav Bhandarkar <pranav.bhandarkar@celunite.com> | 2007-12-10 01:01:03 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2007-12-10 01:01:03 +0000 |
commit | ac8bc93ea6f5d34237316f60004dd336f6a2b817 (patch) | |
tree | 4d46990c076f2782885e8a8a034988ab5096b244 /gcc/caller-save.c | |
parent | 79e790677d5a0088d60da607ef0c93c1c06becb5 (diff) | |
download | gcc-ac8bc93ea6f5d34237316f60004dd336f6a2b817.tar.gz |
caller-save.c (insert_one_insn): If inserting before a call_insn then the registers containing the arguments of...
* caller-save.c (insert_one_insn): If inserting before a call_insn
then the registers containing the arguments of the call are
live_throughout in the new insn.
Co-Authored-By: Hans-Peter Nilsson <hp@axis.com>
From-SVN: r130733
Diffstat (limited to 'gcc/caller-save.c')
-rw-r--r-- | gcc/caller-save.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/caller-save.c b/gcc/caller-save.c index 26ac50eadd1..7976fd5fd75 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -850,6 +850,38 @@ insert_one_insn (struct insn_chain *chain, int before_p, int code, rtx pat) SET_REGNO_REG_SET (&new->live_throughout, regno + i); } } + + /* If CHAIN->INSN is a call, then the registers which contain + the arguments to the function are live in the new insn. */ + if (CALL_P (chain->insn)) + { + for (link = CALL_INSN_FUNCTION_USAGE (chain->insn); + link != NULL_RTX; + link = XEXP (link, 1)) + { + rtx arg = XEXP (link, 0); + + if (GET_CODE (arg) == USE) + { + rtx reg = XEXP (arg, 0); + + if (REG_P (reg)) + { + int i, regno = REGNO (reg); + + /* Registers in CALL_INSN_FUNCTION_USAGE are always + hard registers. */ + gcc_assert (regno < FIRST_PSEUDO_REGISTER); + + for (i = hard_regno_nregs[regno][GET_MODE (reg)] - 1; + i >= 0; i--) + SET_REGNO_REG_SET (&new->live_throughout, regno + i); + } + } + } + + } + CLEAR_REG_SET (&new->dead_or_set); if (chain->insn == BB_HEAD (BASIC_BLOCK (chain->block))) BB_HEAD (BASIC_BLOCK (chain->block)) = new->insn; |