regclass.c (record_reg_classes): Update comment for merging register class preference...
authorJeffrey A Law <law@cygnus.com>
Wed, 15 Dec 1999 08:29:37 +0000 (08:29 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 15 Dec 1999 08:29:37 +0000 (01:29 -0700)
        * regclass.c (record_reg_classes): Update comment for merging
        register class preferences in reg->reg copies.  Tighten conditions
        for merging register class preferences in reg->reg copies.

From-SVN: r30943

gcc/ChangeLog
gcc/regclass.c

index a53413a15f54c53e3fba65cb47e177fdd676d35c..40c1180d579ea2e09c7b9e276d77f5171afcc2aa 100644 (file)
@@ -1,3 +1,9 @@
+Wed Dec 15 01:23:29 1999  Jeffrey A Law  (law@cygnus.com)
+
+       * regclass.c (record_reg_classes): Update comment for merging
+       register class preferences in reg->reg copies.  Tighten conditions
+       for merging register class preferences in reg->reg copies.
+
 Wed Dec 15 02:19:32 1999  David Edelsohn  <edelsohn@gnu.org>
 
        * rs6000.md (tablejumpdi): Generate DImode LABEL_REF.
index e8eca4de2fc88cd6f4fef7b49c550a2129c1392a..ea131c0a8d3ef7a69c9ed3aa022b77e22ca573e2 100644 (file)
@@ -1622,11 +1622,18 @@ record_reg_classes (n_alts, n_ops, ops, modes, subreg_changes_size,
     }
 
   /* If this insn is a single set copying operand 1 to operand 0
-     and one is a pseudo with the other a hard reg that is in its
-     own register class, set the cost of that register class to -1.
-     Do this only when source dies to avoid stressing of register
-     allocator by preferrencing two coliding registers into single
-     place.  */
+     and one operand is a pseudo with the other a hard reg or a pseudo
+     that prefers a register that is in its own register class then
+     we may want to adjust the cost of that register class to -1.
+     Avoid the adjustment if the source does not die to avoid stressing of
+     register allocator by preferrencing two coliding registers into single
+     class.
+
+     Also avoid the adjustment if a copy between registers of the class
+     is expensive (ten times the cost of a default copy is considered
+     arbitrarily expensive).  This avoids losing when the preferred class
+     is very expensive as the source of a copy instruction.  */
 
   if ((set = single_set (insn)) != 0
       && ops[0] == SET_DEST (set) && ops[1] == SET_SRC (set)
@@ -1640,10 +1647,15 @@ record_reg_classes (n_alts, n_ops, ops, modes, subreg_changes_size,
          int class;
          int nr;
 
-         if (regno >= FIRST_PSEUDO_REGISTER && reg_pref != 0
-             && (reg_class_size[(unsigned char) reg_pref[regno].prefclass]
-                 == CLASS_MAX_NREGS (reg_pref[regno].prefclass, mode)))
-           op_costs[i].cost[(unsigned char) reg_pref[regno].prefclass] = -1;
+         if (regno >= FIRST_PSEUDO_REGISTER && reg_pref != 0)
+           {
+             enum reg_class pref = reg_pref[regno].prefclass;
+
+             if ((reg_class_size[(unsigned char) pref]
+                  == CLASS_MAX_NREGS (pref, mode))
+                 && REGISTER_MOVE_COST (pref, pref) < 10 * 2)
+               op_costs[i].cost[(unsigned char) pref] = -1;
+           }
          else if (regno < FIRST_PSEUDO_REGISTER)
            for (class = 0; class < N_REG_CLASSES; class++)
              if (TEST_HARD_REG_BIT (reg_class_contents[class], regno)