re PR ipa/65028 (450.soplex in SPEC CPU 2006 is miscompiled)
authorJan Hubicka <hubicka@ucw.cz>
Fri, 13 Feb 2015 20:05:39 +0000 (21:05 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 13 Feb 2015 20:05:39 +0000 (20:05 +0000)
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.

From-SVN: r220694

gcc/ChangeLog
gcc/ipa-prop.c

index 269bcf0..290d3ac 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-13  Jan Hubicka  <hubicka@ucw.cz>
+
+       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.
+
 2015-02-13  Maritn Jambor  <mjambor@suse.cz>
 
        PR ipa/65028
index 878e94f..908b5ee 100644 (file)
@@ -3143,25 +3143,31 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
       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_ancestor_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_ancestor_type_preserved (jfunc))
+               ici->vptr_changed = true;
            }
        }
       else