integrate.c (expand_inline_function): Don't put a virtual register into the reg map.
authorJ"orn Rennecke <amylaar@redhat.com>
Thu, 4 Jan 2001 23:28:00 +0000 (23:28 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Thu, 4 Jan 2001 23:28:00 +0000 (23:28 +0000)
* integrate.c (expand_inline_function): Don't put a virtual
register into the reg map.

* function.c (fixup_var_refs_1): If force_operand didn't put
the address into the target, move it there.

From-SVN: r38694

gcc/ChangeLog
gcc/function.c
gcc/integrate.c

index d422a7b06f1c0064aba55c558cd500b7fdad1788..ac4f2e507a86e24495ce70b16bfffd09c5bc2a51 100644 (file)
@@ -1,3 +1,11 @@
+Thu Jan  4 21:09:47 2001  J"orn Rennecke <amylaar@redhat.com>
+
+       * integrate.c (expand_inline_function): Don't put a virtual
+       register into the reg map.
+
+       * function.c (fixup_var_refs_1): If force_operand didn't put
+       the address into the target, move it there.
+
 2001-01-04  Mark Mitchell  <mark@codesourcery.com>
 
        Special-case tree_decl/tree_list allocations.
index bbd7ecc3e978aa6283ce878be2def9b7a3296045..90ca36a5b6a4ba797962c98ebc30616fd0ff0613 100644 (file)
@@ -1916,7 +1916,9 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
                  /* That failed.  Fall back on force_operand and hope.  */
 
                  start_sequence ();
-                 force_operand (sub, y);
+                 sub = force_operand (sub, y);
+                 if (sub != y)
+                   emit_insn (gen_move_insn (y, sub));
                  seq = gen_sequence ();
                  end_sequence ();
                }
index 30e13408ec0910f7cca3a64507c0f616114845ab..f6e43027580d3f23c94dd4db1ddb33d271f22cff 100644 (file)
@@ -1,6 +1,6 @@
 /* Procedure integration for GNU CC.
    Copyright (C) 1988, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000 Free Software Foundation, Inc.
+   1999, 2000, 2001 Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GNU CC.
@@ -989,6 +989,15 @@ expand_inline_function (fndecl, parms, target, ignore, type,
            {
              temp = force_operand (structure_value_addr, NULL_RTX);
              temp = force_reg (Pmode, temp);
+             /* A virtual register might be invalid in an insn, because
+                it can cause trouble in reload.  Since we don't have access
+                to the expanders at map translation time, make sure we have
+                a proper register now.
+                If a virtual register is actually valid, cse or combine
+                can put it into the mapped insns.  */
+             if (REGNO (temp) >= FIRST_VIRTUAL_REGISTER
+                 && REGNO (temp) <= LAST_VIRTUAL_REGISTER)
+             temp = copy_to_mode_reg (Pmode, temp);
              map->reg_map[REGNO (XEXP (loc, 0))] = temp;
 
              if (CONSTANT_P (structure_value_addr)