I found there are too many rejecting pseudo splits because I excluded most common case of choosing register class for split pseudo.

The following patch fixes this.

Committed as rev. 184315.

2012-02-16  Vladimir Makarov <vmaka...@redhat.com>

    * lra-constraints.c (choose_split_class): Check allocno_class too.
    (split_pseudo): Print more debug info about split rejecting
    because of reg class.

Index: lra-constraints.c
===================================================================
--- lra-constraints.c   (revision 184215)
+++ lra-constraints.c   (working copy)
@@ -3810,6 +3810,9 @@ choose_split_class (enum reg_class alloc
   enum reg_class cl, best_cl = NO_REGS;
   enum reg_class hard_reg_class = REGNO_REG_CLASS (hard_regno);
   
+  if (! SECONDARY_MEMORY_NEEDED (allocno_class, allocno_class, mode)
+      && TEST_HARD_REG_BIT (reg_class_contents[allocno_class], hard_regno))
+    return allocno_class;
   for (i = 0;
        (cl = reg_class_subclasses[allocno_class][i]) != LIM_REG_CLASSES;
        i++)
@@ -3881,8 +3884,13 @@ split_pseudo (bool before_p, int origina
          if (lra_dump_file != NULL)
            {
              fprintf (lra_dump_file,
-                      "    Rejecting split of %d: no good reg class\n",
-                      original_regno);
+                      "    Rejecting split of %d(%s): "
+                      "no good reg class for %d(%s)\n",
+                      original_regno,
+                      reg_class_names[lra_get_allocno_class (original_regno)],
+                      reg_renumber[original_regno],
+                      reg_class_names[REGNO_REG_CLASS
+                                      (reg_renumber[original_regno])]);
              fprintf (lra_dump_file,
                       "    
))))))))))))))))))))))))))))))))))))))))))))))))\n");
            }

Reply via email to