From 88def6374c15e75e1a179b7a066811563d3c93e3 Mon Sep 17 00:00:00 2001 From: Vladimir Makarov Date: Tue, 25 Feb 2014 20:34:44 +0000 Subject: [PATCH] re PR rtl-optimization/60317 (find_hard_regno_for compile time hog in libvpx) 2014-02-25 Vladimir Makarov PR rtl-optimization/60317 * params.def (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS): New. * params.h (LRA_MAX_CONSIDERED_RELOAD_PSEUDOS): New. * lra-assigns.c: Include params.h. (spill_for): Use LRA_MAX_CONSIDERED_RELOAD_PSEUDOS as guard for other reload pseudos considerations. From-SVN: r208155 --- gcc/ChangeLog | 9 +++++++++ gcc/lra-assigns.c | 19 +++++++++++-------- gcc/params.def | 5 +++++ gcc/params.h | 2 ++ 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 32a74a7..616d8ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-02-25 Vladimir Makarov + + PR rtl-optimization/60317 + * params.def (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS): New. + * params.h (LRA_MAX_CONSIDERED_RELOAD_PSEUDOS): New. + * lra-assigns.c: Include params.h. + (spill_for): Use LRA_MAX_CONSIDERED_RELOAD_PSEUDOS as guard for + other reload pseudos considerations. + 2014-02-25 Bill Schmidt * config/rs6000/vector.md (*vector_unordered): Change split diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c index 268edcc..f94ebe6 100644 --- a/gcc/lra-assigns.c +++ b/gcc/lra-assigns.c @@ -94,6 +94,7 @@ along with GCC; see the file COPYING3. If not see #include "df.h" #include "ira.h" #include "sparseset.h" +#include "params.h" #include "lra-int.h" /* Array containing corresponding values of function @@ -896,14 +897,16 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap) } } n = 0; - EXECUTE_IF_SET_IN_SPARSESET (live_range_reload_inheritance_pseudos, - reload_regno) - if ((int) reload_regno != regno - && (ira_reg_classes_intersect_p - [rclass][regno_allocno_class_array[reload_regno]]) - && live_pseudos_reg_renumber[reload_regno] < 0 - && find_hard_regno_for (reload_regno, &cost, -1) < 0) - sorted_reload_pseudos[n++] = reload_regno; + if (sparseset_cardinality (live_range_reload_inheritance_pseudos) + <= LRA_MAX_CONSIDERED_RELOAD_PSEUDOS) + EXECUTE_IF_SET_IN_SPARSESET (live_range_reload_inheritance_pseudos, + reload_regno) + if ((int) reload_regno != regno + && (ira_reg_classes_intersect_p + [rclass][regno_allocno_class_array[reload_regno]]) + && live_pseudos_reg_renumber[reload_regno] < 0 + && find_hard_regno_for (reload_regno, &cost, -1) < 0) + sorted_reload_pseudos[n++] = reload_regno; EXECUTE_IF_SET_IN_BITMAP (&spill_pseudos_bitmap, 0, spill_regno, bi) { update_lives (spill_regno, true); diff --git a/gcc/params.def b/gcc/params.def index ad63a37..dd2e2cd 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -821,6 +821,11 @@ DEFPARAM (PARAM_IRA_LOOP_RESERVED_REGS, "The number of registers in each class kept unused by loop invariant motion", 2, 0, 0) +DEFPARAM (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS, + "lra-max-considered-reload-pseudos", + "The max number of reload pseudos which are considered during spilling a non-reload pseudo", + 500, 0, 0) + /* Switch initialization conversion will refuse to create arrays that are bigger than this parameter times the number of switch branches. */ diff --git a/gcc/params.h b/gcc/params.h index 64f3a0f..0d6daa2 100644 --- a/gcc/params.h +++ b/gcc/params.h @@ -196,6 +196,8 @@ extern void init_param_values (int *params); PARAM_VALUE (PARAM_IRA_MAX_CONFLICT_TABLE_SIZE) #define IRA_LOOP_RESERVED_REGS \ PARAM_VALUE (PARAM_IRA_LOOP_RESERVED_REGS) +#define LRA_MAX_CONSIDERED_RELOAD_PSEUDOS \ + PARAM_VALUE (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS) #define SWITCH_CONVERSION_BRANCH_RATIO \ PARAM_VALUE (PARAM_SWITCH_CONVERSION_BRANCH_RATIO) #define LOOP_INVARIANT_MAX_BBS_IN_LOOP \ -- 2.7.4