Print indirect call changes in afdo dump file
authorAndi Kleen <ak@linux.intel.com>
Thu, 14 Jul 2016 02:13:48 +0000 (02:13 +0000)
committerAndi Kleen <ak@gcc.gnu.org>
Thu, 14 Jul 2016 02:13:48 +0000 (02:13 +0000)
Print some information about indirect call promotions in the afdo dump
file. Do it in the same format as the instrumented profiler so that
the test suite can match on it.

gcc/:

2016-07-13  Andi Kleen  <ak@linux.intel.com>

* auto-profile.c (update_inlined_ind_target,
afdo_indirect_call): Print information to dump file.

From-SVN: r238320

gcc/ChangeLog
gcc/auto-profile.c

index 786e899046d8c0c1806d0273a15254eccba4b0c0..b4b8f74c1caad6f38c5d9fc990377b3f7fb568b7 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-13  Andi Kleen  <ak@linux.intel.com>
+
+       * auto-profile.c (update_inlined_ind_target,
+       afdo_indirect_call): Print information to dump file.
+
 2016-07-13  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * genrecog.c (special_predicate_operand_p): New function.
index 00b3687e9968920b15575f44081be10290c97b08..4e3d2bff6b95287bd8604e6f0163f7ea40e71b8b 100644 (file)
@@ -47,6 +47,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "ipa-inline.h"
 #include "tree-inline.h"
 #include "auto-profile.h"
+#include "tree-pretty-print.h"
+#include "gimple-pretty-print.h"
 
 /* The following routines implements AutoFDO optimization.
 
@@ -747,8 +749,18 @@ bool
 autofdo_source_profile::update_inlined_ind_target (gcall *stmt,
                                                    count_info *info)
 {
+  if (dump_file)
+    {
+      fprintf (dump_file, "Checking indirect call -> direct call ");
+      print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
+    }
+
   if (LOCATION_LOCUS (gimple_location (stmt)) == cfun->function_end_locus)
-    return false;
+    {
+      if (dump_file)
+       fprintf (dump_file, " good locus\n");
+      return false;
+    }
 
   count_info old_info;
   get_count_info (stmt, &old_info);
@@ -765,21 +777,41 @@ autofdo_source_profile::update_inlined_ind_target (gcall *stmt,
      than half of the callsite count (stored in INFO), the original promoted
      target is considered not hot any more.  */
   if (total >= info->count / 2)
-    return false;
+    {
+      if (dump_file)
+       fprintf (dump_file, " not hot anymore %ld >= %ld",
+                (long)total,
+                (long)info->count /2);
+      return false;
+    }
 
   inline_stack stack;
   get_inline_stack (gimple_location (stmt), &stack);
   if (stack.length () == 0)
-    return false;
+    {
+      if (dump_file)
+       fprintf (dump_file, " no inline stack\n");
+      return false;
+    }
   function_instance *s = get_function_instance_by_inline_stack (stack);
   if (s == NULL)
-    return false;
+    {
+      if (dump_file)
+       fprintf (dump_file, " function not found in inline stack\n");
+      return false;
+    }
   icall_target_map map;
   if (s->find_icall_target_map (stmt, &map) == 0)
-    return false;
+    {
+      if (dump_file)
+       fprintf (dump_file, " no target map\n");
+      return false;
+    }
   for (icall_target_map::const_iterator iter = map.begin ();
        iter != map.end (); ++iter)
     info->targets[iter->first] = iter->second;
+  if (dump_file)
+    fprintf (dump_file, " looks good\n");
   return true;
 }
 
@@ -997,10 +1029,34 @@ afdo_indirect_call (gimple_stmt_iterator *gsi, const icall_target_map &map,
   struct cgraph_node *direct_call = cgraph_node::get_for_asmname (
       get_identifier ((const char *) hist->hvalue.counters[0]));
 
+  if (dump_file)
+    {
+      fprintf (dump_file, "Indirect call -> direct call ");
+      print_generic_expr (dump_file, callee, TDF_SLIM);
+      fprintf (dump_file, " => ");
+      print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
+    }
+
   if (direct_call == NULL || !check_ic_target (stmt, direct_call))
-    return;
+    {
+      if (dump_file)
+        fprintf (dump_file, " not transforming\n");
+      return;
+    }
   if (DECL_STRUCT_FUNCTION (direct_call->decl) == NULL)
-    return;
+    {
+      if (dump_file)
+        fprintf (dump_file, " no declaration\n");
+      return;
+    }
+
+  if (dump_file)
+    {
+      fprintf (dump_file, " transformation on insn ");
+      print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
+      fprintf (dump_file, "\n");
+    }
+
   struct cgraph_edge *new_edge
       = indirect_edge->make_speculative (direct_call, 0, 0);
   new_edge->redirect_call_stmt_to_callee ();