aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 ();