aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-inline.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@gcc.gnu.org>2019-11-14 12:41:55 +0000
committerJan Hubicka <hubicka@gcc.gnu.org>2019-11-14 12:41:55 +0000
commit68718e8e60209edc98771f54091d983eecd6f93c (patch)
tree70300f4db395bcfd44ad4749a8f9d8354827813e /gcc/ipa-inline.c
parentafeb887562af17ea235fbec650ff6d16c412682a (diff)
downloadgcc-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.c15
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)