diff options
author | Jan Hubicka <hubicka@gcc.gnu.org> | 2019-11-14 12:41:55 +0000 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2019-11-14 12:41:55 +0000 |
commit | 68718e8e60209edc98771f54091d983eecd6f93c (patch) | |
tree | 70300f4db395bcfd44ad4749a8f9d8354827813e /gcc/ipa-inline.c | |
parent | afeb887562af17ea235fbec650ff6d16c412682a (diff) | |
download | gcc-68718e8e60209edc98771f54091d983eecd6f93c.zip gcc-68718e8e60209edc98771f54091d983eecd6f93c.tar.gz gcc-68718e8e60209edc98771f54091d983eecd6f93c.tar.bz2 |
Support for value ranges in IPA predicates
* ipa-cp.c (ipa_vr_operation_and_type_effects): Move up in file.
(ipa_value_range_from_jfunc): New function.
* ipa-fnsummary.c (evaluate_conditions_for_known_args): Add
known_value_ranges parameter; use it to evalulate conditions.
(evaluate_properties_for_edge): Compute known value ranges.
(ipa_fn_summary_t::duplicate): Update use of
evaluate_conditions_for_known_args.
(estimate_ipcp_clone_size_and_time): Likewise.
(ipa_merge_fn_summary_after_inlining): Likewise.
* ipa-prop.h (ipa_value_range_from_jfunc): Declare.
* gcc.dg/ipa/inline-9.c: New testcase.
From-SVN: r278220
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r-- | gcc/ipa-inline.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index e27859b..b5e0096 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -1163,6 +1163,7 @@ edge_badness (struct cgraph_edge *edge, bool dump) overall_growth = callee_info->growth; +#if 1 /* Look for inliner wrappers of the form: inline_caller () @@ -1214,6 +1215,7 @@ edge_badness (struct cgraph_edge *edge, bool dump) overall_growth = caller_growth; } } +#endif if (overall_growth > 0) { /* Strongly preffer functions with few callers that can be inlined @@ -2132,12 +2134,23 @@ inline_small_functions (void) fprintf (dump_file, " Peeling recursion with depth %i\n", depth); gcc_checking_assert (!callee->inlined_to); + + int old_size = ipa_size_summaries->get (where)->size; + sreal old_time = ipa_fn_summaries->get (where)->time; + inline_call (edge, true, &new_indirect_edges, &overall_size, true); add_new_edges_to_heap (&edge_heap, new_indirect_edges); reset_edge_caches (edge->callee); - update_callee_keys (&edge_heap, where, updated_nodes); + /* If caller's size and time increased we do not need to update + all edges becuase badness is not going to decrease. */ + if (old_size <= ipa_size_summaries->get (where)->size + && old_time <= ipa_fn_summaries->get (where)->time + && 0) + update_callee_keys (&edge_heap, edge->callee, updated_nodes); + else + update_callee_keys (&edge_heap, where, updated_nodes); } where = edge->caller; if (where->inlined_to) |