From f7293b9dfab5e6e760f65934f76bbaa7184b0f45 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 27 Dec 2018 22:23:30 +0100 Subject: ipa-devirt.c (polymorphic_call_target_d): Add n_odr_types. * ipa-devirt.c (polymorphic_call_target_d): Add n_odr_types. (polymorphic_call_target_hasher::hash): Hash it. (polymorphic_call_target_hasher::equal): Compare it. (possible_polymorphic_call_targets): Set it. * tree.c (free_lang_data): Rebuild type inheritance graph even on non-LTO path. * g++.dg/ipa/devirt-53.C: New testcase. From-SVN: r267438 --- gcc/ipa-devirt.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'gcc/ipa-devirt.c') diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 399a6e0..4ba0f0b 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -2759,6 +2759,7 @@ struct polymorphic_call_target_d vec targets; tree decl_warning; int type_warning; + unsigned int n_odr_types; bool complete; bool speculative; }; @@ -2784,6 +2785,7 @@ polymorphic_call_target_hasher::hash (const polymorphic_call_target_d *odr_query hstate.add_hwi (odr_query->type->id); hstate.merge_hash (TYPE_UID (odr_query->context.outer_type)); hstate.add_hwi (odr_query->context.offset); + hstate.add_hwi (odr_query->n_odr_types); if (odr_query->context.speculative_outer_type) { @@ -2814,7 +2816,9 @@ polymorphic_call_target_hasher::equal (const polymorphic_call_target_d *t1, == t2->context.maybe_in_construction && t1->context.maybe_derived_type == t2->context.maybe_derived_type && (t1->context.speculative_maybe_derived_type - == t2->context.speculative_maybe_derived_type)); + == t2->context.speculative_maybe_derived_type) + /* Adding new type may affect outcome of target search. */ + && t1->n_odr_types == t2->n_odr_types); } /* Remove entry in polymorphic call target cache hash. */ @@ -3220,6 +3224,7 @@ possible_polymorphic_call_targets (tree otr_type, key.otr_token = otr_token; key.speculative = speculative; key.context = context; + key.n_odr_types = odr_types.length (); slot = polymorphic_call_target_hash->find_slot (&key, INSERT); if (cache_token) *cache_token = (void *)*slot; @@ -3436,6 +3441,7 @@ possible_polymorphic_call_targets (tree otr_type, (*slot)->targets = nodes; (*slot)->complete = complete; + (*slot)->n_odr_types = odr_types.length (); if (completep) *completep = complete; -- cgit v1.1