aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndi Kleen <ak@linux.intel.com>2016-07-14 02:13:48 +0000
committerAndi Kleen <ak@gcc.gnu.org>2016-07-14 02:13:48 +0000
commit0ea221ef245cd19b2308fdfa497d49156e1b801d (patch)
tree92f435ce61a039797184e9e0ebddad351fca64fa /gcc
parent9f01da8e20d3b8ecf97a345e919938a46b029805 (diff)
downloadgcc-0ea221ef245cd19b2308fdfa497d49156e1b801d.zip
gcc-0ea221ef245cd19b2308fdfa497d49156e1b801d.tar.gz
gcc-0ea221ef245cd19b2308fdfa497d49156e1b801d.tar.bz2
Print indirect call changes in afdo dump file
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/auto-profile.c70
2 files changed, 68 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 786e899..b4b8f74 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/auto-profile.c b/gcc/auto-profile.c
index 00b3687..4e3d2bf 100644
--- a/gcc/auto-profile.c
+++ b/gcc/auto-profile.c
@@ -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 ();