From 8f6c49f5439f316279d260c2c1bb0d478cd19dcb Mon Sep 17 00:00:00 2001 From: vmakarov Date: Thu, 16 Apr 2009 15:15:48 +0000 Subject: [PATCH] 2009-04-16 Vladimir Makarov PR rtl-optimization/39762 * ira-int.h (ira_register_move_cost, ira_may_move_in_cost, ira_may_move_out_cost): Add comments about way of their usage. (ira_get_register_move_cost, ira_get_may_move_cost): New functions. * ira-conflicts.c (process_regs_for_copy): Use function ira_get_register_move_cost instead of global ira_register_move_cost. * ira-color.c (update_copy_costs, calculate_allocno_spill_cost, color_pass, move_spill_restore, update_curr_costs): Ditto. * ira-lives.c (process_single_reg_class_operands): Ditto. * ira-emit.c (emit_move_list): Ditto. * ira-costs.c (copy_cost): Don't call ira_init_register_move_cost. (record_reg_classes): Ditto. Use functions ira_get_register_move_cost and ira_get_may_move_cost instead of global vars ira_register_move_cost, ira_may_move_out_cost and ira_may_move_in_cost. (record_address_regs): Don't call ira_init_register_move_cost. Use function ira_get_may_move_cost instead of global ira_may_move_in_cost. (process_bb_node_for_hard_reg_moves): Use function ira_get_register_move_cost instead of global ira_register_move_cost. (ira_costs): Don't call ira_init_register_move_cost. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@146198 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 32 +++++++++++++++++++++++++++ gcc/ira-color.c | 16 +++++++------- gcc/ira-conflicts.c | 4 ++-- gcc/ira-costs.c | 63 ++++++++++++++++++++--------------------------------- gcc/ira-emit.c | 3 ++- gcc/ira-int.h | 39 +++++++++++++++++++++++++++++---- gcc/ira-lives.c | 9 ++++---- 7 files changed, 108 insertions(+), 58 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b44225048c9..e34def9b163 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,35 @@ +2009-04-16 Vladimir Makarov + + PR rtl-optimization/39762 + * ira-int.h (ira_register_move_cost, ira_may_move_in_cost, + ira_may_move_out_cost): Add comments about way of their usage. + (ira_get_register_move_cost, ira_get_may_move_cost): New + functions. + + * ira-conflicts.c (process_regs_for_copy): Use function + ira_get_register_move_cost instead of global + ira_register_move_cost. + + * ira-color.c (update_copy_costs, calculate_allocno_spill_cost, + color_pass, move_spill_restore, update_curr_costs): Ditto. + + * ira-lives.c (process_single_reg_class_operands): Ditto. + + * ira-emit.c (emit_move_list): Ditto. + + * ira-costs.c (copy_cost): Don't call ira_init_register_move_cost. + (record_reg_classes): Ditto. Use functions + ira_get_register_move_cost and ira_get_may_move_cost instead of + global vars ira_register_move_cost, ira_may_move_out_cost and + ira_may_move_in_cost. + (record_address_regs): Don't call ira_init_register_move_cost. + Use function ira_get_may_move_cost instead of global + ira_may_move_in_cost. + (process_bb_node_for_hard_reg_moves): Use function + ira_get_register_move_cost instead of global + ira_register_move_cost. + (ira_costs): Don't call ira_init_register_move_cost. + 2009-04-16 Richard Guenther * tree-cfg.c (verify_gimple_assign_binary): diff --git a/gcc/ira-color.c b/gcc/ira-color.c index 4f1d302b7c7..743ec3cd835 100644 --- a/gcc/ira-color.c +++ b/gcc/ira-color.c @@ -285,8 +285,8 @@ update_copy_costs (ira_allocno_t allocno, bool decr_p) continue; cost = (cp->second == allocno - ? ira_register_move_cost[mode][rclass][cover_class] - : ira_register_move_cost[mode][cover_class][rclass]); + ? ira_get_register_move_cost (mode, rclass, cover_class) + : ira_get_register_move_cost (mode, cover_class, rclass)); if (decr_p) cost = -cost; @@ -1071,7 +1071,7 @@ calculate_allocno_spill_cost (ira_allocno_t a) * ira_loop_edge_freq (loop_node, regno, true) + ira_memory_move_cost[mode][rclass][0] * ira_loop_edge_freq (loop_node, regno, false)) - - (ira_register_move_cost[mode][rclass][rclass] + - (ira_get_register_move_cost (mode, rclass, rclass) * (ira_loop_edge_freq (loop_node, regno, false) + ira_loop_edge_freq (loop_node, regno, true)))); return cost; @@ -2039,7 +2039,7 @@ color_pass (ira_loop_tree_node_t loop_tree_node) else { cover_class = ALLOCNO_COVER_CLASS (subloop_allocno); - cost = (ira_register_move_cost[mode][rclass][rclass] + cost = (ira_get_register_move_cost (mode, rclass, rclass) * (exit_freq + enter_freq)); ira_allocate_and_set_or_copy_costs (&ALLOCNO_UPDATED_HARD_REG_COSTS (subloop_allocno), cover_class, @@ -2164,7 +2164,7 @@ move_spill_restore (void) += (ira_memory_move_cost[mode][rclass][0] * exit_freq + ira_memory_move_cost[mode][rclass][1] * enter_freq); if (hard_regno2 != hard_regno) - cost -= (ira_register_move_cost[mode][rclass][rclass] + cost -= (ira_get_register_move_cost (mode, rclass, rclass) * (exit_freq + enter_freq)); } } @@ -2183,7 +2183,7 @@ move_spill_restore (void) += (ira_memory_move_cost[mode][rclass][1] * exit_freq + ira_memory_move_cost[mode][rclass][0] * enter_freq); if (hard_regno2 != hard_regno) - cost -= (ira_register_move_cost[mode][rclass][rclass] + cost -= (ira_get_register_move_cost (mode, rclass, rclass) * (exit_freq + enter_freq)); } } @@ -2249,8 +2249,8 @@ update_curr_costs (ira_allocno_t a) if (i < 0) continue; cost = (cp->first == a - ? ira_register_move_cost[mode][rclass][cover_class] - : ira_register_move_cost[mode][cover_class][rclass]); + ? ira_get_register_move_cost (mode, rclass, cover_class) + : ira_get_register_move_cost (mode, cover_class, rclass)); ira_allocate_and_set_or_copy_costs (&ALLOCNO_UPDATED_HARD_REG_COSTS (a), cover_class, ALLOCNO_COVER_CLASS_COST (a), diff --git a/gcc/ira-conflicts.c b/gcc/ira-conflicts.c index 05870ab4b16..399a28ae5cc 100644 --- a/gcc/ira-conflicts.c +++ b/gcc/ira-conflicts.c @@ -411,9 +411,9 @@ process_regs_for_copy (rtx reg1, rtx reg2, bool constraint_p, /* Can not be tied. It is not in the cover class. */ return false; if (HARD_REGISTER_P (reg1)) - cost = ira_register_move_cost[mode][cover_class][rclass] * freq; + cost = ira_get_register_move_cost (mode, cover_class, rclass) * freq; else - cost = ira_register_move_cost[mode][rclass][cover_class] * freq; + cost = ira_get_register_move_cost (mode, rclass, cover_class) * freq; for (;;) { ira_allocate_and_set_costs diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c index 397affd4b1f..58700b75f14 100644 --- a/gcc/ira-costs.c +++ b/gcc/ira-costs.c @@ -138,9 +138,6 @@ copy_cost (rtx x, enum machine_mode mode, enum reg_class rclass, bool to_p, sri.extra_cost = 0; secondary_class = targetm.secondary_reload (to_p, x, rclass, mode, &sri); - if (ira_register_move_cost[mode] == NULL) - ira_init_register_move_cost (mode); - if (secondary_class != NO_REGS) { if (!move_cost[mode]) @@ -294,19 +291,17 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops, needs to do a copy, which is one insn. */ struct costs *pp = this_op_costs[i]; - if (ira_register_move_cost[mode] == NULL) - ira_init_register_move_cost (mode); - for (k = 0; k < cost_classes_num; k++) { rclass = cost_classes[k]; pp->cost[k] - = ((recog_data.operand_type[i] != OP_OUT - ? ira_may_move_in_cost[mode][rclass] - [classes[i]] * frequency : 0) - + (recog_data.operand_type[i] != OP_IN - ? ira_may_move_out_cost[mode][classes[i]] - [rclass] * frequency : 0)); + = (((recog_data.operand_type[i] != OP_OUT + ? ira_get_may_move_cost (mode, rclass, + classes[i], true) : 0) + + (recog_data.operand_type[i] != OP_IN + ? ira_get_may_move_cost (mode, classes[i], + rclass, false) : 0)) + * frequency); } /* If the alternative actually allows memory, make @@ -342,8 +337,9 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops, : 0)); else if (ira_reg_class_intersect [pref_class][classes[i]] == NO_REGS) - alt_cost += (ira_register_move_cost - [mode][pref_class][classes[i]]); + alt_cost += ira_get_register_move_cost (mode, + pref_class, + classes[i]); } if (REGNO (ops[i]) != REGNO (ops[j]) && ! find_reg_note (insn, REG_DEAD, op)) @@ -540,19 +536,17 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops, { struct costs *pp = this_op_costs[i]; - if (ira_register_move_cost[mode] == NULL) - ira_init_register_move_cost (mode); - for (k = 0; k < cost_classes_num; k++) { rclass = cost_classes[k]; pp->cost[k] - = ((recog_data.operand_type[i] != OP_OUT - ? ira_may_move_in_cost[mode][rclass] - [classes[i]] * frequency : 0) - + (recog_data.operand_type[i] != OP_IN - ? ira_may_move_out_cost[mode][classes[i]] - [rclass] * frequency : 0)); + = (((recog_data.operand_type[i] != OP_OUT + ? ira_get_may_move_cost (mode, rclass, + classes[i], true) : 0) + + (recog_data.operand_type[i] != OP_IN + ? ira_get_may_move_cost (mode, classes[i], + rclass, false) : 0)) + * frequency); } /* If the alternative actually allows memory, make @@ -587,8 +581,9 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops, : 0)); else if (ira_reg_class_intersect[pref_class][classes[i]] == NO_REGS) - alt_cost += (ira_register_move_cost - [mode][pref_class][classes[i]]); + alt_cost += ira_get_register_move_cost (mode, + pref_class, + classes[i]); } } } @@ -901,13 +896,11 @@ record_address_regs (enum machine_mode mode, rtx x, int context, ALLOCNO_NUM (ira_curr_regno_allocno_map [REGNO (x)])); pp->mem_cost += (ira_memory_move_cost[Pmode][rclass][1] * scale) / 2; - if (ira_register_move_cost[Pmode] == NULL) - ira_init_register_move_cost (Pmode); for (k = 0; k < cost_classes_num; k++) { i = cost_classes[k]; pp->cost[k] - += (ira_may_move_in_cost[Pmode][i][rclass] * scale) / 2; + += (ira_get_may_move_cost (Pmode, i, rclass, true) * scale) / 2; } } break; @@ -1425,8 +1418,9 @@ process_bb_node_for_hard_reg_moves (ira_loop_tree_node_t loop_tree_node) continue; mode = ALLOCNO_MODE (a); hard_reg_class = REGNO_REG_CLASS (hard_regno); - cost = (to_p ? ira_register_move_cost[mode][hard_reg_class][rclass] - : ira_register_move_cost[mode][rclass][hard_reg_class]) * freq; + cost + = (to_p ? ira_get_register_move_cost (mode, hard_reg_class, rclass) + : ira_get_register_move_cost (mode, rclass, hard_reg_class)) * freq; ira_allocate_and_set_costs (&ALLOCNO_HARD_REG_COSTS (a), rclass, ALLOCNO_COVER_CLASS_COST (a)); ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a), @@ -1579,9 +1573,6 @@ ira_finish_costs_once (void) void ira_costs (void) { - ira_allocno_t a; - ira_allocno_iterator ai; - allocno_costs = (struct costs *) ira_allocate (max_struct_costs_size * ira_allocnos_num); total_costs = (struct costs *) ira_allocate (max_struct_costs_size @@ -1594,12 +1585,6 @@ ira_costs (void) * max_reg_num ()); find_allocno_class_costs (); setup_allocno_cover_class_and_costs (); - /* Because we could process operands only as subregs, check mode of - the registers themselves too. */ - FOR_EACH_ALLOCNO (a, ai) - if (ira_register_move_cost[ALLOCNO_MODE (a)] == NULL - && have_regs_of_mode[ALLOCNO_MODE (a)]) - ira_init_register_move_cost (ALLOCNO_MODE (a)); ira_free (common_classes); ira_free (allocno_pref_buffer); ira_free (total_costs); diff --git a/gcc/ira-emit.c b/gcc/ira-emit.c index df10ea45d62..1d4d8ea224f 100644 --- a/gcc/ira-emit.c +++ b/gcc/ira-emit.c @@ -812,7 +812,8 @@ emit_move_list (move_t list, int freq) } else { - cost = ira_register_move_cost[mode][cover_class][cover_class] * freq; + cost = (ira_get_register_move_cost (mode, cover_class, cover_class) + * freq); ira_shuffle_cost += cost; } ira_overall_cost += cost; diff --git a/gcc/ira-int.h b/gcc/ira-int.h index 6e66cc49572..5b8c1ef0bae 100644 --- a/gcc/ira-int.h +++ b/gcc/ira-int.h @@ -730,21 +730,24 @@ ira_allocno_set_iter_next (ira_allocno_set_iterator *i) extern HARD_REG_SET ira_reg_mode_hard_regset [FIRST_PSEUDO_REGISTER][NUM_MACHINE_MODES]; -/* Arrays analogous to macros MEMORY_MOVE_COST and - REGISTER_MOVE_COST. */ +/* Arrays analogous to macros MEMORY_MOVE_COST and REGISTER_MOVE_COST. + Don't use ira_register_move_cost directly. Use function of + ira_get_may_move_cost instead. */ extern short ira_memory_move_cost[MAX_MACHINE_MODE][N_REG_CLASSES][2]; extern move_table *ira_register_move_cost[MAX_MACHINE_MODE]; /* Similar to may_move_in_cost but it is calculated in IRA instead of regclass. Another difference we take only available hard registers into account to figure out that one register class is a subset of - the another one. */ + the another one. Don't use it directly. Use function of + ira_get_may_move_cost instead. */ extern move_table *ira_may_move_in_cost[MAX_MACHINE_MODE]; /* Similar to may_move_out_cost but it is calculated in IRA instead of regclass. Another difference we take only available hard registers into account to figure out that one register class is a subset of - the another one. */ + the another one. Don't use it directly. Use function of + ira_get_may_move_cost instead. */ extern move_table *ira_may_move_out_cost[MAX_MACHINE_MODE]; /* Register class subset relation: TRUE if the first class is a subset @@ -941,6 +944,34 @@ extern void ira_emit (bool); +/* Return cost of moving value of MODE from register of class FROM to + register of class TO. */ +static inline int +ira_get_register_move_cost (enum machine_mode mode, + enum reg_class from, enum reg_class to) +{ + if (ira_register_move_cost[mode] == NULL) + ira_init_register_move_cost (mode); + return ira_register_move_cost[mode][from][to]; +} + +/* Return cost of moving value of MODE from register of class FROM to + register of class TO. Return zero if IN_P is true and FROM is + subset of TO or if IN_P is false and FROM is superset of TO. */ +static inline int +ira_get_may_move_cost (enum machine_mode mode, + enum reg_class from, enum reg_class to, + bool in_p) +{ + if (ira_register_move_cost[mode] == NULL) + ira_init_register_move_cost (mode); + return (in_p + ? ira_may_move_in_cost[mode][from][to] + : ira_may_move_out_cost[mode][from][to]); +} + + + /* The iterator for all allocnos. */ typedef struct { /* The number of the current element in IRA_ALLOCNOS. */ diff --git a/gcc/ira-lives.c b/gcc/ira-lives.c index 7ad903d2e44..4390c6fdb8c 100644 --- a/gcc/ira-lives.c +++ b/gcc/ira-lives.c @@ -782,10 +782,11 @@ process_single_reg_class_operands (bool in_p, int freq) [ira_class_hard_regs[cl][0]]) >= 0 && reg_class_size[cl] <= (unsigned) CLASS_MAX_NREGS (cl, mode)) { - /* ??? FREQ */ - cost = freq * (in_p - ? ira_register_move_cost[mode][cover_class][cl] - : ira_register_move_cost[mode][cl][cover_class]); + cost + = (freq + * (in_p + ? ira_get_register_move_cost (mode, cover_class, cl) + : ira_get_register_move_cost (mode, cl, cover_class))); ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (operand_a), cover_class, 0); ALLOCNO_CONFLICT_HARD_REG_COSTS (operand_a) -- 2.11.4.GIT