aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-05-06 17:51:42 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1994-05-06 17:51:42 -0400
commite3c69b8a5d4085bf6ce58d0d5244d6f8c51165ea (patch)
treec279c12aae4fd1b41b2ddfcbebb9df65262d7bd2
parent47b0bb9450e673280dfbf74444588f5bb561ef3d (diff)
downloadgcc-e3c69b8a5d4085bf6ce58d0d5244d6f8c51165ea.zip
gcc-e3c69b8a5d4085bf6ce58d0d5244d6f8c51165ea.tar.gz
gcc-e3c69b8a5d4085bf6ce58d0d5244d6f8c51165ea.tar.bz2
(emit_reload_insns): Change from USE and CLOBBER insns to using
CALL_INSN_FUNCTION_USAGE. From-SVN: r7246
-rw-r--r--gcc/reload1.c34
1 files changed, 15 insertions, 19 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index c5877e3..098eed9 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -4844,6 +4844,21 @@ choose_reload_regs (insn, avoid_return_reg)
reload_when_needed[j], reload_mode[j]);
}
+ /* Ban all registers used for argument passing to the current
+ function call. */
+ if (GET_CODE (insn) == CALL_INSN)
+ {
+ rtx link;
+
+ for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
+ if (GET_CODE (XEXP (link, 0)) == USE)
+ {
+ register rtx reg = SET_DEST (XEXP (link, 0));
+ mark_reload_reg_in_use (REGNO (reg), 0, RELOAD_FOR_INPUT,
+ GET_MODE (reg));
+ }
+ }
+
if (n_reloads > 1)
qsort (reload_order, n_reloads, sizeof (short), reload_reg_class_lower);
@@ -5447,25 +5462,6 @@ emit_reload_insns (insn)
input_reload_insns[j] = input_address_reload_insns[j]
= output_reload_insns[j] = output_address_reload_insns[j] = 0;
- /* If this is a CALL_INSN preceded by USE insns, any reload insns
- must go in front of the first USE insn, not in front of INSN. */
-
- if (GET_CODE (insn) == CALL_INSN && GET_CODE (PREV_INSN (insn)) == INSN
- && GET_CODE (PATTERN (PREV_INSN (insn))) == USE)
- while (GET_CODE (PREV_INSN (before_insn)) == INSN
- && GET_CODE (PATTERN (PREV_INSN (before_insn))) == USE)
- before_insn = PREV_INSN (before_insn);
-
- /* If INSN is followed by any CLOBBER insns made by find_reloads,
- put our reloads after them since they may otherwise be
- misinterpreted. */
-
- while (GET_CODE (following_insn) == INSN
- && GET_MODE (following_insn) == DImode
- && GET_CODE (PATTERN (following_insn)) == CLOBBER
- && NEXT_INSN (following_insn) != 0)
- following_insn = NEXT_INSN (following_insn);
-
/* Now output the instructions to copy the data into and out of the
reload registers. Do these in the order that the reloads were reported,
since reloads of base and index registers precede reloads of operands