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");
}