aboutsummaryrefslogtreecommitdiff
path: root/gcc/sched.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-05-07 12:16:15 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1994-05-07 12:16:15 -0400
commitb288f2b3393ffdce4b2b9b70203d1804d202c529 (patch)
tree82b31f1567ae4f71669421b692c56b124f82586e /gcc/sched.c
parentac8ec8c0c9a31eff3eee3cf8e5cedcb7eee17cca (diff)
downloadgcc-b288f2b3393ffdce4b2b9b70203d1804d202c529.zip
gcc-b288f2b3393ffdce4b2b9b70203d1804d202c529.tar.gz
gcc-b288f2b3393ffdce4b2b9b70203d1804d202c529.tar.bz2
(sched_analyze_insn, attach_deaths_insn): Look at
CALL_INSN_FUNCTION_USAGE. From-SVN: r7263
Diffstat (limited to 'gcc/sched.c')
-rw-r--r--gcc/sched.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/sched.c b/gcc/sched.c
index b307c73..f31a7ad 100644
--- a/gcc/sched.c
+++ b/gcc/sched.c
@@ -2038,6 +2038,16 @@ sched_analyze_insn (x, insn)
else
sched_analyze_2 (x, insn);
+ /* Mark registers CLOBBERED or used by called function. */
+ if (GET_CODE (insn) == CALL_INSN)
+ for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
+ {
+ if (GET_CODE (XEXP (link, 0)) == CLOBBER)
+ sched_analyze_1 (XEXP (XEXP (link, 0), 0), insn);
+ else
+ sched_analyze_2 (XEXP (XEXP (link, 0), 0), insn);
+ }
+
/* After reload, it is possible for an instruction to have a REG_DEAD note
for a register that actually dies a few instructions earlier. For
example, this can happen with SECONDARY_MEMORY_NEEDED reloads.
@@ -2906,6 +2916,7 @@ attach_deaths_insn (insn)
{
rtx x = PATTERN (insn);
register RTX_CODE code = GET_CODE (x);
+ rtx link;
if (code == SET)
{
@@ -2941,6 +2952,12 @@ attach_deaths_insn (insn)
/* Otherwise don't add a death note to things being clobbered. */
else if (code != CLOBBER)
attach_deaths (x, insn, 0);
+
+ /* Make death notes for things used in the called function. */
+ if (GET_CODE (insn) == CALL_INSN)
+ for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
+ attach_deaths (XEXP (XEXP (link, 0), 0), insn,
+ GET_CODE (XEXP (link, 0)) == CLOBBER);
}
/* Delete notes beginning with INSN and maybe put them in the chain