Hi, On Wed, Jan 08 2020, Jan Hubicka wrote: >> Hi, >> >> On Fri, Jan 03 2020, Martin Liška wrote: >> > Hi. >> > >> > This is similar transformation for IPA passes. This time, >> > one needs to use opt_for_fn in order to get the right >> > parameter values. >> > >> > @Martin, Honza: >> > There are last few remaining parameters which should use >> > opt_for_fn: >> > >> > param_ipa_sra_max_replacements >> >> IPA-CP: Always access param_ipa_sra_max_replacements through opt_for_fn >> >> 2020-01-07 Martin Jambor <mjam...@suse.cz> >> >> * params.opt (param_ipa_sra_max_replacements): Mark as Optimization. >> * ipa-sra.c (scanned_node): New variable. >> (allocate_access): Use it to get param_ipa_sra_max_replacements. >> (ipa_sra_summarize_function): Set up scanned_node. >> (pull_accesses_from_callee): New parameter caller, use it to get >> param_ipa_sra_max_replacements. >> (param_splitting_across_edge): Pass the caller to >> pull_accesses_from_callee. >> --- >> gcc/ipa-sra.c | 33 +++++++++++++++++++++------------ >> gcc/params.opt | 2 +- >> 2 files changed, 22 insertions(+), 13 deletions(-) >> >> diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c >> index a051a9f2154..133ed687509 100644 >> --- a/gcc/ipa-sra.c >> +++ b/gcc/ipa-sra.c >> @@ -521,6 +521,10 @@ ipa_sra_call_summaries::duplicate (cgraph_edge *, >> cgraph_edge *, >> >> /* With all GTY stuff done, we can move to anonymous namespace. */ >> namespace { >> +/* Functions which currently has its body analyzed. */ >> + >> +cgraph_node *scanned_node; >> + >> /* Quick mapping from a decl to its param descriptor. */ >> >> hash_map<tree, gensum_param_desc *> *decl2desc; >> @@ -1265,7 +1269,8 @@ allocate_access (gensum_param_desc *desc, >> HOST_WIDE_INT offset, HOST_WIDE_INT size) >> { >> if (desc->access_count >> - == (unsigned) param_ipa_sra_max_replacements) >> + == (unsigned) opt_for_fn (scanned_node->decl, >> + param_ipa_sra_max_replacements)) >> { >> disqualify_split_candidate (desc, "Too many replacement candidates"); >> return NULL; >> @@ -2472,6 +2477,7 @@ ipa_sra_summarize_function (cgraph_node *node) >> node->order); >> if (!ipa_sra_preliminary_function_checks (node)) >> return; >> + scanned_node = node; >> gcc_obstack_init (&gensum_obstack); >> isra_func_summary *ifs = func_sums->get_create (node); >> ifs->m_candidate = true; >> @@ -2526,6 +2532,7 @@ ipa_sra_summarize_function (cgraph_node *node) >> delete decl2desc; >> decl2desc = NULL; >> obstack_free (&gensum_obstack, NULL); >> + scanned_node = NULL; > > It is your code. having static var to track currently analyzed function > is bit ugly, and I am not sure if you don't have current_function_decl > set to that function in all cases. But I will leave this to your > decision.
It is my code but apparently I already forgot some changes to it. Originally I only pushed/popped cfun when processing (some) scan results (I originally hoped not to do it at all) but since May I actually push it whenever the body of the function is scanned, so using cfun is indeed OK. So please use the following instead: IPA-CP: Access param_ipa_sra_max_replacements through opt_for_fn 2020-01-08 Martin Jambor <mjam...@suse.cz> * params.opt (param_ipa_sra_max_replacements): Mark as Optimization. * ipa-sra.c (pull_accesses_from_callee): New parameter caller, use it to get param_ipa_sra_max_replacements. (param_splitting_across_edge): Pass the caller to pull_accesses_from_callee. --- gcc/ipa-sra.c | 24 +++++++++++++----------- gcc/params.opt | 2 +- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c index a051a9f2154..51d225ed772 100644 --- a/gcc/ipa-sra.c +++ b/gcc/ipa-sra.c @@ -3246,16 +3246,17 @@ all_callee_accesses_present_p (isra_param_desc *param_desc, enum acc_prop_kind {ACC_PROP_DONT, ACC_PROP_COPY, ACC_PROP_CERTAIN}; -/* Attempt to propagate all definite accesses from ARG_DESC to PARAM_DESC, if - they would not violate some constraint there. If successful, return NULL, - otherwise return the string reason for failure (which can be written to the - dump file). DELTA_OFFSET is the known offset of the actual argument withing - the formal parameter (so of ARG_DESCS within PARAM_DESCS), ARG_SIZE is the - size of the actual argument or zero, if not known. In case of success, set - *CHANGE_P to true if propagation actually changed anything. */ +/* Attempt to propagate all definite accesses from ARG_DESC to PARAM_DESC, + (which belongs to CALLER) if they would not violate some constraint there. + If successful, return NULL, otherwise return the string reason for failure + (which can be written to the dump file). DELTA_OFFSET is the known offset + of the actual argument withing the formal parameter (so of ARG_DESCS within + PARAM_DESCS), ARG_SIZE is the size of the actual argument or zero, if not + known. In case of success, set *CHANGE_P to true if propagation actually + changed anything. */ static const char * -pull_accesses_from_callee (isra_param_desc *param_desc, +pull_accesses_from_callee (cgraph_node *caller, isra_param_desc *param_desc, isra_param_desc *arg_desc, unsigned delta_offset, unsigned arg_size, bool *change_p) @@ -3335,7 +3336,7 @@ pull_accesses_from_callee (isra_param_desc *param_desc, return NULL; if ((prop_count + pclen - > (unsigned) param_ipa_sra_max_replacements) + > (unsigned) opt_for_fn (caller->decl, param_ipa_sra_max_replacements)) || size_would_violate_limit_p (param_desc, param_desc->size_reached + prop_size)) return "propagating accesses would violate the count or size limit"; @@ -3455,7 +3456,8 @@ param_splitting_across_edge (cgraph_edge *cs) else { const char *pull_failure - = pull_accesses_from_callee (param_desc, arg_desc, 0, 0, &res); + = pull_accesses_from_callee (cs->caller, param_desc, arg_desc, + 0, 0, &res); if (pull_failure) { if (dump_file && (dump_flags & TDF_DETAILS)) @@ -3516,7 +3518,7 @@ param_splitting_across_edge (cgraph_edge *cs) else { const char *pull_failure - = pull_accesses_from_callee (param_desc, arg_desc, + = pull_accesses_from_callee (cs->caller, param_desc, arg_desc, ipf->unit_offset, ipf->unit_size, &res); if (pull_failure) diff --git a/gcc/params.opt b/gcc/params.opt index 3cd6d7d481d..02584740640 100644 --- a/gcc/params.opt +++ b/gcc/params.opt @@ -235,7 +235,7 @@ Common Joined UInteger Var(param_ipa_max_switch_predicate_bounds) Init(5) Param Maximal number of boundary endpoints of case ranges of switch statement used during IPA functoin summary generation. -param=ipa-sra-max-replacements= -Common Joined UInteger Var(param_ipa_sra_max_replacements) Init(8) IntegerRange(0, 16) Param +Common Joined UInteger Var(param_ipa_sra_max_replacements) Optimization Init(8) IntegerRange(0, 16) Param Maximum pieces that IPA-SRA tracks per formal parameter, as a consequence, also the maximum number of replacements of a formal parameter. -param=ipa-sra-ptr-growth-factor= -- 2.24.1