* regmove.c (regmove_optimize): Avoid increasing of register pressure.
authorJan Hubicka <jh@suse.cz>
Tue, 19 Feb 2002 11:39:01 +0000 (12:39 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 19 Feb 2002 11:39:01 +0000 (11:39 +0000)
From-SVN: r49864

gcc/ChangeLog
gcc/regmove.c

index ffb087cf2fdc875886a3db2e3c3fe76b794f6011..b6f6a1c1de0d1ed7be2bcb775723cb536dfe43f9 100644 (file)
@@ -1,3 +1,7 @@
+Tue Feb 19 12:37:23 CET 2002  Jan Hubicka  <jh@suse.cz>
+
+       * regmove.c (regmove_optimize): Avoid increasing of register pressure.
+
 2002-02-19  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        PR other/5718
index 9530128721aacc986565aab7f84e910e548780d7..aa1c17bbcee6e595315250665e5e3844094a03c6 100644 (file)
@@ -1328,19 +1328,22 @@ regmove_optimize (f, nregs, regmove_dump_file)
                }
              src_class = reg_preferred_class (REGNO (src));
              dst_class = reg_preferred_class (REGNO (dst));
-             if (! regclass_compatible_p (src_class, dst_class))
+
+             if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
                {
-                 if (!copy_src)
-                   {
-                     copy_src = src;
-                     copy_dst = dst;
-                   }
+                 /* We used to force the copy here like in other cases, but
+                    it produces worse code, as it eliminates no copy
+                    instructions and the copy emitted will be produced by
+                    reload anyway.  On patterns with multiple alternatives,
+                    there may be better sollution availble.
+
+                    In particular this change produced slower code for numeric
+                    i387 programs.  */
+
                  continue;
                }
 
-             /* Can not modify an earlier insn to set dst if this insn
-                uses an old value in the source.  */
-             if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
+             if (! regclass_compatible_p (src_class, dst_class))
                {
                  if (!copy_src)
                    {
@@ -1350,7 +1353,9 @@ regmove_optimize (f, nregs, regmove_dump_file)
                  continue;
                }
 
-             if (! (src_note = find_reg_note (insn, REG_DEAD, src)))
+             /* Can not modify an earlier insn to set dst if this insn
+                uses an old value in the source.  */
+             if (reg_overlap_mentioned_p (dst, SET_SRC (set)))
                {
                  if (!copy_src)
                    {
@@ -1360,7 +1365,6 @@ regmove_optimize (f, nregs, regmove_dump_file)
                  continue;
                }
 
-
              /* If src is set once in a different basic block,
                 and is set equal to a constant, then do not use
                 it for this optimization, as this would make it