[Bug ipa/63671] [5 Regression] 21% tramp3d-v4 performance hit due to -fdevirtualize

hubicka at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Nov 11 05:33:00 GMT 2014


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63671

--- Comment #5 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
There is also code size differnce. I tried to track it down and with
-fno-devirtualize I need to disable all places devirtualization happens:
Index: gimple-fold.c
===================================================================
--- gimple-fold.c       (revision 217304)
+++ gimple-fold.c       (working copy)
@@ -331,7 +331,7 @@ fold_gimple_assign (gimple_stmt_iterator
            tree val = OBJ_TYPE_REF_EXPR (rhs);
            if (is_gimple_min_invariant (val))
              return val;
-           else if (flag_devirtualize && virtual_method_call_p (rhs))
+           else if (flag_devirtualize && virtual_method_call_p (rhs) && 0)
              {
                bool final;
                vec <cgraph_node *>targets
@@ -2633,7 +2633,7 @@ gimple_fold_call (gimple_stmt_iterator *
          gimple_call_set_fn (stmt, OBJ_TYPE_REF_EXPR (callee));
          changed = true;
        }
-      else if (flag_devirtualize && !inplace && virtual_method_call_p
(callee))
+      else if (flag_devirtualize && !inplace && virtual_method_call_p (callee)
&& 0)
        {
          bool final;
          vec <cgraph_node *>targets
Index: ipa.c
===================================================================
--- ipa.c       (revision 217304)
+++ ipa.c       (working copy)
@@ -198,7 +198,7 @@ walk_polymorphic_call_targets (hash_set<
      final or anonymous (so we know all its derivation)
      and there is only one possible virtual call target,
      make the edge direct.  */
-  if (final)
+  if (final && 0)
     {
       if (targets.length () <= 1 && dbg_cnt (devirt))
        {
Index: tree-ssa-pre.c
===================================================================
--- tree-ssa-pre.c      (revision 217304)
+++ tree-ssa-pre.c      (working copy)
@@ -4320,7 +4320,7 @@ eliminate_dom_walker::before_dom_childre
        {
          tree fn = gimple_call_fn (stmt);
          if (fn
-             && flag_devirtualize
+             && flag_devirtualize && 0
              && virtual_method_call_p (fn))
            {
              tree otr_type = obj_type_ref_class (fn);

So apparently it is not the unit growth nor reachability code. It is simply
presence of direct calls instead of polymorphic calls that seems to make
inliner to do bad decisions...



More information about the Gcc-bugs mailing list