Reinstated part of the patch that is safe
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 12 Jan 2001 22:48:35 +0000 (22:48 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Fri, 12 Jan 2001 22:48:35 +0000 (22:48 +0000)
From-SVN: r38966

gcc/ChangeLog
gcc/regmove.c

index e8d7d15fd000e4d59c350bb0e47f18c786dfa00e..7ae8ae971325e43df30f27f25734a855f6135916 100644 (file)
@@ -3,8 +3,7 @@
        * calls.c (emit_library_call_value_1): Add USEs and CLOBBERs
        to function usage for arguments passed by reference.  Optimize
        callee-copied arguments.
-       * regmove.c (find_related_toplev): Find uses in function usage.
-       (replace_in_call_usage): New function.
+       * regmove.c (replace_in_call_usage): New function.
        (fixup_match_1): Call it.
        * cse.c (cse_insn): Canonicalize registers in function usage.
        * reload1.c (replace_pseudos_in_call_usage): New function.
index 008b22cae3ed878f527089db5a160d4ab271dbd8..879941f0e5a79bd62b2541eac0d8b6c2db3ac5db 100644 (file)
@@ -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))