diff options
author | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-07-22 22:00:17 +0000 |
---|---|---|
committer | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-07-22 22:00:17 +0000 |
commit | 9f724a5879643ac5fce0742debda3ca2e458cdd5 (patch) | |
tree | e6debce284f28f6755b99e28e2d7cd846214ef7d /gcc/ira.c | |
parent | d60ec13d843da3d28b399506b230a144847cd44f (diff) | |
download | gcc-9f724a5879643ac5fce0742debda3ca2e458cdd5.tar.gz |
2009-07-22 Vladimir Makarov <vmakarov@redhat.com>
PR target/37488
* ira-lives.c (bb_has_abnormal_call_pred): New function.
(process_bb_node_lives): Use it.
* ira.c (setup_cover_and_important_classes): Don't setup
ira_important_class_nums. Add cover classes to the end of
important classes.
(cover_class_order, comp_reg_classes_func,
reorder_important_classes): New.
(find_reg_class_closure): Use reorder_important_classes.
* config/i386/i386.h (IRA_COVER_CLASSES): Remove.
* config/i386/i386.c (i386_ira_cover_classes): New function.
(TARGET_IRA_COVER_CLASSES): Redefine.
* doc/tm.texi (TARGET_IRA_COVER_CLASSES): Add a comment about
importance of order of cover classes in the array.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149962 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ira.c')
-rw-r--r-- | gcc/ira.c | 67 |
1 files changed, 50 insertions, 17 deletions
diff --git a/gcc/ira.c b/gcc/ira.c index 7a2efe9dc86..e4caf31fb8d 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -729,7 +729,7 @@ static void setup_cover_and_important_classes (void) { int i, j, n, cl; - bool set_p, eq_p; + bool set_p; const enum reg_class *cover_classes; HARD_REG_SET temp_hard_regset2; static enum reg_class classes[LIM_REG_CLASSES + 1]; @@ -802,7 +802,7 @@ setup_cover_and_important_classes (void) AND_COMPL_HARD_REG_SET (temp_hard_regset, no_unit_alloc_regs); if (! hard_reg_set_empty_p (temp_hard_regset)) { - set_p = eq_p = false; + set_p = false; for (j = 0; j < ira_reg_class_cover_size; j++) { COPY_HARD_REG_SET (temp_hard_regset, reg_class_contents[cl]); @@ -810,27 +810,22 @@ setup_cover_and_important_classes (void) COPY_HARD_REG_SET (temp_hard_regset2, reg_class_contents[ira_reg_class_cover[j]]); AND_COMPL_HARD_REG_SET (temp_hard_regset2, no_unit_alloc_regs); - if ((enum reg_class) cl == ira_reg_class_cover[j]) - { - eq_p = false; - set_p = true; - break; - } - else if (hard_reg_set_equal_p (temp_hard_regset, - temp_hard_regset2)) - eq_p = true; + if ((enum reg_class) cl == ira_reg_class_cover[j] + || hard_reg_set_equal_p (temp_hard_regset, + temp_hard_regset2)) + break; else if (hard_reg_set_subset_p (temp_hard_regset, temp_hard_regset2)) set_p = true; } - if (set_p && ! eq_p) - { - ira_important_class_nums[cl] = ira_important_classes_num; - ira_important_classes[ira_important_classes_num++] = - (enum reg_class) cl; - } + if (set_p && j >= ira_reg_class_cover_size) + ira_important_classes[ira_important_classes_num++] + = (enum reg_class) cl; } } + for (j = 0; j < ira_reg_class_cover_size; j++) + ira_important_classes[ira_important_classes_num++] + = ira_reg_class_cover[j]; } /* Map of all register classes to corresponding cover class containing @@ -925,6 +920,43 @@ setup_class_translate (void) } } +/* Order numbers of cover classes in original target cover class + array, -1 for non-cover classes. */ +static int cover_class_order[N_REG_CLASSES]; + +/* The function used to sort the important classes. */ +static int +comp_reg_classes_func (const void *v1p, const void *v2p) +{ + enum reg_class cl1 = *(const enum reg_class *) v1p; + enum reg_class cl2 = *(const enum reg_class *) v2p; + int diff; + + cl1 = ira_class_translate[cl1]; + cl2 = ira_class_translate[cl2]; + if (cl1 != NO_REGS && cl2 != NO_REGS + && (diff = cover_class_order[cl1] - cover_class_order[cl2]) != 0) + return diff; + return (int) cl1 - (int) cl2; +} + +/* Reorder important classes according to the order of their cover + classes. Set up array ira_important_class_nums too. */ +static void +reorder_important_classes (void) +{ + int i; + + for (i = 0; i < N_REG_CLASSES; i++) + cover_class_order[i] = -1; + for (i = 0; i < ira_reg_class_cover_size; i++) + cover_class_order[ira_reg_class_cover[i]] = i; + qsort (ira_important_classes, ira_important_classes_num, + sizeof (enum reg_class), comp_reg_classes_func); + for (i = 0; i < ira_important_classes_num; i++) + ira_important_class_nums[ira_important_classes[i]] = i; +} + /* The biggest important reg_class inside of intersection of the two reg_classes (that is calculated taking only hard registers available for allocation into account). If the both reg_classes @@ -1089,6 +1121,7 @@ find_reg_class_closure (void) setup_reg_subclasses (); setup_cover_and_important_classes (); setup_class_translate (); + reorder_important_classes (); setup_reg_class_relations (); } |