From: Richard Sandiford Date: Wed, 29 Oct 2014 10:02:33 +0000 (+0000) Subject: PR rtl-optimization/63340 (part 2) X-Git-Tag: upstream/12.2.0~59387 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dab67d2ca2788745393a57b54ed59afb7585602c;p=platform%2Fupstream%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8be1f25..c40577b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,18 @@ 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) * ira-costs.c (all_cost_classes): New variable. (complete_cost_classes): New function, split out from... diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c index dbeface..76de59a 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 45af98a..1c18393 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 ddd39c9..b3fe680 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);