+2020-01-18 Jan Hubicka <hubicka@ucw.cz>
+
+ PR lto/93318
+ * cgraph.c (cgraph_edge::resolve_speculation,
+ cgraph_edge::redirect_call_stmt_to_callee): Fix update of
+ call_stmt_site_hash.
+
2020-01-21 Martin Liska <mliska@suse.cz>
* config/rs6000/rs6000.c (common_mode_defined): Remove
else
e2->callee->remove_symbol_and_inline_clones ();
if (edge->caller->call_site_hash)
- cgraph_update_edge_in_call_site_hash (edge);
+ {
+ /* We always maintain direct edge in the call site hash, if one
+ exists. */
+ if (!edge->num_speculative_call_targets_p ())
+ cgraph_update_edge_in_call_site_hash (edge);
+ else
+ {
+ cgraph_edge *e;
+ for (e = edge->caller->callees;
+ e->call_stmt != edge->call_stmt
+ || e->lto_stmt_uid != edge->lto_stmt_uid;
+ e = e->next_callee)
+ ;
+ cgraph_update_edge_in_call_site_hash (e);
+ }
+ }
return edge;
}
/* Indirect edges are not both in the call site hash.
get it updated. */
if (e->caller->call_site_hash)
- cgraph_update_edge_in_call_site_hash (e2);
+ {
+ if (!e2->num_speculative_call_targets_p ())
+ cgraph_update_edge_in_call_site_hash (e2);
+ else
+ {
+ cgraph_edge *e;
+ for (e = e2->caller->callees;
+ e->call_stmt != e2->call_stmt
+ || e->lto_stmt_uid != e2->lto_stmt_uid;
+ e = e->next_callee)
+ ;
+ cgraph_update_edge_in_call_site_hash (e);
+ }
+ }
pop_cfun ();
/* Continue redirecting E to proper target. */
}
n->used_as_abstract_origin = true;
}
}
- /* If any symbol in a comdat group is reachable, force
- all externally visible symbols in the same comdat
+ /* If any non-external and non-local symbol in a comdat group is
+ reachable, force all externally visible symbols in the same comdat
group to be reachable as well. Comdat-local symbols
can be discarded if all uses were inlined. */
- if (node->same_comdat_group)
+ if (node->same_comdat_group
+ && node->externally_visible
+ && !DECL_EXTERNAL (node->decl))
{
symtab_node *next;
for (next = node->same_comdat_group;
next != node;
next = next->same_comdat_group)
if (!next->comdat_local_p ()
+ && !DECL_EXTERNAL (next->decl)
&& !reachable.add (next))
enqueue_node (next, &first, &reachable);
}