summaryrefslogtreecommitdiff
path: root/gcc/regmove.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2001-01-12 22:48:35 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2001-01-12 22:48:35 +0000
commitec7c0481a032ed51f976aee0bb88180ff8a34acf (patch)
treee3680344ad8de8ddec092eab7f5a4265815e2ed8 /gcc/regmove.c
parentc6ca5c693e3af78bff4028b8de916eb33cfaa734 (diff)
downloadgcc-ec7c0481a032ed51f976aee0bb88180ff8a34acf.tar.gz
Reinstated part of the patch that is safe
From-SVN: r38966
Diffstat (limited to 'gcc/regmove.c')
-rw-r--r--gcc/regmove.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/gcc/regmove.c b/gcc/regmove.c
index 008b22cae3e..879941f0e5a 100644
--- a/gcc/regmove.c
+++ b/gcc/regmove.c
@@ -1,6 +1,6 @@
/* Move registers around to reduce number of move instructions needed.
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000 Free Software Foundation, Inc.
+ 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -1571,6 +1571,45 @@ find_matches (insn, matchp)
return any_matches;
}
+/* Try to replace all occurrences of DST_REG with SRC in LOC, that is
+ assumed to be in INSN. */
+
+static void
+replace_in_call_usage (loc, dst_reg, src, insn)
+ rtx *loc;
+ int dst_reg;
+ rtx src;
+ rtx insn;
+{
+ rtx x = *loc;
+ enum rtx_code code;
+ const char *fmt;
+ int i, j;
+
+ if (! x)
+ return;
+
+ code = GET_CODE (x);
+ if (code == REG)
+ {
+ if (REGNO (x) != dst_reg)
+ return;
+
+ validate_change (insn, loc, src, 1);
+
+ return;
+ }
+
+ /* Process each of our operands recursively. */
+ fmt = GET_RTX_FORMAT (code);
+ for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
+ if (*fmt == 'e')
+ replace_in_call_usage (&XEXP (x, i), dst_reg, src, insn);
+ else if (*fmt == 'E')
+ for (j = 0; j < XVECLEN (x, i); j++)
+ replace_in_call_usage (& XVECEXP (x, i, j), dst_reg, src, insn);
+}
+
/* Try to replace output operand DST in SET, with input operand SRC. SET is
the only set in INSN. INSN has just been recognized and constrained.
SRC is operand number OPERAND_NUMBER in INSN.
@@ -1643,6 +1682,10 @@ fixup_match_1 (insn, set, src, src_subreg, dst, backward, operand_number,
for (length = s_length = 0, p = NEXT_INSN (insn); p; p = NEXT_INSN (p))
{
+ if (GET_CODE (p) == CALL_INSN)
+ replace_in_call_usage (& CALL_INSN_FUNCTION_USAGE (p),
+ REGNO (dst), src, p);
+
/* ??? We can't scan past the end of a basic block without updating
the register lifetime info (REG_DEAD/basic_block_live_at_start). */
if (perhaps_ends_bb_p (p))