aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPranav Bhandarkar <pranav.bhandarkar@celunite.com>2007-12-10 01:01:03 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2007-12-10 01:01:03 +0000
commitac8bc93ea6f5d34237316f60004dd336f6a2b817 (patch)
tree4d46990c076f2782885e8a8a034988ab5096b244 /gcc
parent79e790677d5a0088d60da607ef0c93c1c06becb5 (diff)
downloadgcc-ac8bc93ea6f5d34237316f60004dd336f6a2b817.zip
gcc-ac8bc93ea6f5d34237316f60004dd336f6a2b817.tar.gz
gcc-ac8bc93ea6f5d34237316f60004dd336f6a2b817.tar.bz2
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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/caller-save.c32
2 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b3bb96e..11088fd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-12-10 Pranav Bhandarkar <pranav.bhandarkar@celunite.com>
+ Hans-Peter Nilsson <hp@axis.com>
+
+ * 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.
+
2007-12-09 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR middle-end/32889
diff --git a/gcc/caller-save.c b/gcc/caller-save.c
index 26ac50e..7976fd5 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;