diff options
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r-- | gcc/ipa-inline.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 0ed965a..b62d280 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -1629,6 +1629,7 @@ add_new_edges_to_heap (edge_heap_t *heap, vec<cgraph_edge *> new_edges) struct cgraph_edge *edge = new_edges.pop (); gcc_assert (!edge->aux); + gcc_assert (edge->callee); if (edge->inline_failed && can_inline_edge_p (edge, true) && want_inline_small_function_p (edge, true) @@ -1656,6 +1657,10 @@ heap_edge_removal_hook (struct cgraph_edge *e, void *data) bool speculation_useful_p (struct cgraph_edge *e, bool anticipate_inlining) { + /* If we have already decided to inline the edge, it seems useful. */ + if (!e->inline_failed) + return true; + enum availability avail; struct cgraph_node *target = e->callee->ultimate_alias_target (&avail, e->caller); @@ -1690,12 +1695,11 @@ speculation_useful_p (struct cgraph_edge *e, bool anticipate_inlining) to an ipa-cp clone (that are seen by having local flag set), it is probably pointless to inline it unless hardware is missing indirect call predictor. */ - if (!anticipate_inlining && e->inline_failed && !target->local.local) + if (!anticipate_inlining && !target->local.local) return false; /* For overwritable targets there is not much to do. */ - if (e->inline_failed - && (!can_inline_edge_p (e, false) - || !can_inline_edge_by_limits_p (e, false, true))) + if (!can_inline_edge_p (e, false) + || !can_inline_edge_by_limits_p (e, false, true)) return false; /* OK, speculation seems interesting. */ return true; |