#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.
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);
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;
}
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 ();