Hi, while looking for the soplex miscompilation I run across the following place that was not updated to polymorphic call contexts. When we do not know if type is preserved, we only need to note that in the indirect_call_info.
Bootstrapped/regtested x86_64-linux, comitted. Honza PR ipa/65028 * ipa-prop.c (update_indirect_edges_after_inlining): Do not drop polymorphic call info when type is not known to be preserved. Index: /aux/hubicka/trunk-7/gcc/ipa-prop.c =================================================================== --- /aux/hubicka/trunk-7/gcc/ipa-prop.c (revision 220632) +++ /aux/hubicka/trunk-7/gcc/ipa-prop.c (working copy) @@ -3143,25 +3143,31 @@ update_indirect_edges_after_inlining (st if (jfunc->type == IPA_JF_PASS_THROUGH && ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR) { - if ((ici->agg_contents - && !ipa_get_jf_pass_through_agg_preserved (jfunc)) - || (ici->polymorphic - && !ipa_get_jf_pass_through_type_preserved (jfunc))) + if (ici->agg_contents + && !ipa_get_jf_pass_through_agg_preserved (jfunc) + && !ici->polymorphic) ici->param_index = -1; else - ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc); + { + ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc); + if (ici->polymorphic + && !ipa_get_jf_pass_through_type_preserved (jfunc)) + ici->vptr_changed = true; + } } else if (jfunc->type == IPA_JF_ANCESTOR) { - if ((ici->agg_contents - && !ipa_get_jf_ancestor_agg_preserved (jfunc)) - || (ici->polymorphic - && !ipa_get_jf_ancestor_type_preserved (jfunc))) + if (ici->agg_contents + && !ipa_get_jf_pass_through_agg_preserved (jfunc) + && !ici->polymorphic) ici->param_index = -1; else { ici->param_index = ipa_get_jf_ancestor_formal_id (jfunc); ici->offset += ipa_get_jf_ancestor_offset (jfunc); + if (ici->polymorphic + && !ipa_get_jf_pass_through_type_preserved (jfunc)) + ici->vptr_changed = true; } } else