function.c (instantiate_virtual_regs_in_insn): Copy to new reg before forcing mode.
authorSteve Ellcey <sje@cup.hp.com>
Mon, 30 Nov 2009 22:06:19 +0000 (22:06 +0000)
committerSteve Ellcey <sje@gcc.gnu.org>
Mon, 30 Nov 2009 22:06:19 +0000 (22:06 +0000)
2009-11-30  Steve Ellcey  <sje@cup.hp.com>
    Jakub Jelinek <jakub@redhat.com>

* function.c (instantiate_virtual_regs_in_insn): Copy to new reg
before forcing mode.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r154843

gcc/ChangeLog
gcc/function.c

index 417e4b6..2ded17f 100644 (file)
@@ -1,3 +1,9 @@
+2009-11-30  Steve Ellcey  <sje@cup.hp.com>
+           Jakub Jelinek <jakub@redhat.com>
+
+       * function.c (instantiate_virtual_regs_in_insn): Copy to new reg
+       before forcing mode.
+
 2009-11-30  Anatoly Sokolov  <aesok@post.ru>
 
        * config/sh/sh.c (sh_promote_prototypes): Make static.
index 88e036c..b8042d0 100644 (file)
@@ -1598,7 +1598,13 @@ instantiate_virtual_regs_in_insn (rtx insn)
       if (!safe_insn_predicate (insn_code, i, x))
        {
          start_sequence ();
-         x = force_reg (insn_data[insn_code].operand[i].mode, x);
+         if (REG_P (x))
+           {
+             gcc_assert (REGNO (x) <= LAST_VIRTUAL_REGISTER);
+             x = copy_to_reg (x);
+           }
+         else
+           x = force_reg (insn_data[insn_code].operand[i].mode, x);
          seq = get_insns ();
          end_sequence ();
          if (seq)