http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55823



--- Comment #7 from Jan Hubicka <hubicka at gcc dot gnu.org> 2013-01-03 
16:26:16 UTC ---

The following patch to devirtualize before updating jump functions solves the

testcase but I am not at all sure it is correct.

Index: ipa-prop.c

===================================================================

--- ipa-prop.c  (revision 194770)

+++ ipa-prop.c  (working copy)

@@ -2264,8 +2264,19 @@ update_indirect_edges_after_inlining (st



       param_index = ici->param_index;

       jfunc = ipa_get_ith_jump_func (top, param_index);

-      if (jfunc->type == IPA_JF_PASS_THROUGH

-         && ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)

+

+      if (!flag_indirect_inlining)

+       ;

+      else if (ici->polymorphic)

+       new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc,

+                                                            new_root_info);

+      else

+       new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc,

+                                                           new_root_info);

+      if (new_direct_edge)

+       ;

+      else 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))

@@ -2291,13 +2302,6 @@ update_indirect_edges_after_inlining (st

       if (!flag_indirect_inlining)

        continue;



-      if (ici->polymorphic)

-       new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc,

-                                                            new_root_info);

-      else

-       new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc,

-                                                           new_root_info);

-

       if (new_direct_edge)

        {

          new_direct_edge->indirect_inlining_edge = 1;

Reply via email to