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

Reply via email to