From dab67d2ca2788745393a57b54ed59afb7585602c Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 29 Oct 2014 10:02:33 +0000 Subject: [PATCH] PR rtl-optimization/63340 (part 2) gcc/ PR rtl-optimization/63340 (part 2) * rtl.h (invalid_mode_change_p): Delete. (valid_mode_changes_for_regno): New function. * reginfo.c (invalid_mode_change_p): Delete. (valid_mode_changes_for_regno): New function. * ira-costs.c (setup_regno_cost_classes_by_aclass): Restrict the classes to registers that are allowed by valid_mode_changes_for_regno. (setup_regno_cost_classes_by_mode): Likewise. (print_allocno_costs): Remove invalid_mode_change_p test. (print_pseudo_costs, find_costs_and_classes): Likewise. From-SVN: r216829 --- gcc/ChangeLog | 13 +++++++++++ gcc/ira-costs.c | 62 ++++++++++++++++++++++++------------------------- gcc/reginfo.c | 10 +++----- gcc/rtl.h | 4 +++- 4 files changed, 50 insertions(+), 39 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8be1f259da1..c40577b29ce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2014-10-29 Richard Sandiford + + PR rtl-optimization/63340 (part 2) + * rtl.h (invalid_mode_change_p): Delete. + (valid_mode_changes_for_regno): New function. + * reginfo.c (invalid_mode_change_p): Delete. + (valid_mode_changes_for_regno): New function. + * ira-costs.c (setup_regno_cost_classes_by_aclass): Restrict the + classes to registers that are allowed by valid_mode_changes_for_regno. + (setup_regno_cost_classes_by_mode): Likewise. + (print_allocno_costs): Remove invalid_mode_change_p test. + (print_pseudo_costs, find_costs_and_classes): Likewise. + 2014-10-29 Richard Sandiford PR rtl-optimization/63340 (part 1) diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c index dbefaced657..76de59af68b 100644 --- a/gcc/ira-costs.c +++ b/gcc/ira-costs.c @@ -387,12 +387,18 @@ setup_regno_cost_classes_by_aclass (int regno, enum reg_class aclass) classes_ptr = cost_classes_aclass_cache[aclass] = (cost_classes_t) *slot; } if (regno_reg_rtx[regno] != NULL_RTX) - /* Restrict the classes to those that are valid for REGNO's mode - (which might for example exclude singleton classes if the mode requires - two registers). */ - classes_ptr = restrict_cost_classes (classes_ptr, - PSEUDO_REGNO_MODE (regno), - reg_class_contents[ALL_REGS]); + { + /* Restrict the classes to those that are valid for REGNO's mode + (which might for example exclude singleton classes if the mode + requires two registers). Also restrict the classes to those that + are valid for subregs of REGNO. */ + const HARD_REG_SET *valid_regs = valid_mode_changes_for_regno (regno); + if (!valid_regs) + valid_regs = ®_class_contents[ALL_REGS]; + classes_ptr = restrict_cost_classes (classes_ptr, + PSEUDO_REGNO_MODE (regno), + *valid_regs); + } regno_cost_classes[regno] = classes_ptr; } @@ -405,11 +411,17 @@ setup_regno_cost_classes_by_aclass (int regno, enum reg_class aclass) static void setup_regno_cost_classes_by_mode (int regno, enum machine_mode mode) { - if (cost_classes_mode_cache[mode] == NULL) - cost_classes_mode_cache[mode] - = restrict_cost_classes (&all_cost_classes, mode, - reg_class_contents[ALL_REGS]); - regno_cost_classes[regno] = cost_classes_mode_cache[mode]; + if (const HARD_REG_SET *valid_regs = valid_mode_changes_for_regno (regno)) + regno_cost_classes[regno] = restrict_cost_classes (&all_cost_classes, + mode, *valid_regs); + else + { + if (cost_classes_mode_cache[mode] == NULL) + cost_classes_mode_cache[mode] + = restrict_cost_classes (&all_cost_classes, mode, + reg_class_contents[ALL_REGS]); + regno_cost_classes[regno] = cost_classes_mode_cache[mode]; + } } /* Finalize info about the cost classes for each pseudo. */ @@ -1536,14 +1548,11 @@ print_allocno_costs (FILE *f) for (k = 0; k < cost_classes_ptr->num; k++) { rclass = cost_classes[k]; - if (! invalid_mode_change_p (regno, (enum reg_class) rclass)) - { - fprintf (f, " %s:%d", reg_class_names[rclass], - COSTS (costs, i)->cost[k]); - if (flag_ira_region == IRA_REGION_ALL - || flag_ira_region == IRA_REGION_MIXED) - fprintf (f, ",%d", COSTS (total_allocno_costs, i)->cost[k]); - } + fprintf (f, " %s:%d", reg_class_names[rclass], + COSTS (costs, i)->cost[k]); + if (flag_ira_region == IRA_REGION_ALL + || flag_ira_region == IRA_REGION_MIXED) + fprintf (f, ",%d", COSTS (total_allocno_costs, i)->cost[k]); } fprintf (f, " MEM:%i", COSTS (costs, i)->mem_cost); if (flag_ira_region == IRA_REGION_ALL @@ -1574,9 +1583,8 @@ print_pseudo_costs (FILE *f) for (k = 0; k < cost_classes_ptr->num; k++) { rclass = cost_classes[k]; - if (! invalid_mode_change_p (regno, (enum reg_class) rclass)) - fprintf (f, " %s:%d", reg_class_names[rclass], - COSTS (costs, regno)->cost[k]); + fprintf (f, " %s:%d", reg_class_names[rclass], + COSTS (costs, regno)->cost[k]); } fprintf (f, " MEM:%i\n", COSTS (costs, regno)->mem_cost); } @@ -1813,10 +1821,6 @@ find_costs_and_classes (FILE *dump_file) for (k = 0; k < cost_classes_ptr->num; k++) { rclass = cost_classes[k]; - /* Ignore classes that are too small or invalid for this - operand. */ - if (invalid_mode_change_p (i, (enum reg_class) rclass)) - continue; if (i_costs[k] < best_cost) { best_cost = i_costs[k]; @@ -1906,11 +1910,7 @@ find_costs_and_classes (FILE *dump_file) rclass = cost_classes[k]; if (! ira_class_subset_p[rclass][aclass]) continue; - /* Ignore classes that are too small or invalid - for this operand. */ - if (invalid_mode_change_p (i, (enum reg_class) rclass)) - ; - else if (total_a_costs[k] < best_cost) + if (total_a_costs[k] < best_cost) { best_cost = total_a_costs[k]; allocno_cost = a_costs[k]; diff --git a/gcc/reginfo.c b/gcc/reginfo.c index 45af98a165e..1c1839352cf 100644 --- a/gcc/reginfo.c +++ b/gcc/reginfo.c @@ -1333,14 +1333,10 @@ init_subregs_of_mode (void) find_subregs_of_mode (PATTERN (insn)); } -/* Return 1 if REGNO has had an invalid mode change in CLASS from FROM - mode. */ -bool -invalid_mode_change_p (unsigned int regno, enum reg_class rclass) +const HARD_REG_SET * +valid_mode_changes_for_regno (unsigned int regno) { - return (valid_mode_changes[regno] - && !hard_reg_set_intersect_p (reg_class_contents[rclass], - *valid_mode_changes[regno])); + return valid_mode_changes[regno]; } void diff --git a/gcc/rtl.h b/gcc/rtl.h index ddd39c920cc..b3fe680bd90 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -3468,7 +3468,9 @@ extern void init_reg_sets (void); extern void regclass (rtx, int); extern void reg_scan (rtx_insn *, unsigned int); extern void fix_register (const char *, int, int); -extern bool invalid_mode_change_p (unsigned int, enum reg_class); +#ifdef HARD_CONST +extern const HARD_REG_SET *valid_mode_changes_for_regno (unsigned int); +#endif /* In reload1.c */ extern int function_invariant_p (const_rtx); -- 2.30.2