In legacy AutoFDO, callsite is represented as a (lineno, callee_name) pair because there could be multiple calls in one line. However, as we enhanced the debug info by assigning discriminators for each function call in the same line, callee_name is not needed when indexing the callsite.
This patch will improve AutoFDO performance because some functions have alias (e.g. constructors/destructors), which could make the function name matching fail. Bootstrapped and passed regression test. OK for google-4_8 branch. Dehao Index: gcc/auto-profile.c =================================================================== --- gcc/auto-profile.c (revision 203331) +++ gcc/auto-profile.c (working copy) @@ -174,10 +174,8 @@ class function_instance { const function_instance *get_function_instance_by_decl (unsigned lineno, tree decl) const; - /* Callsite, represented as (decl_lineno, callee_function_name_index). */ - typedef std::pair<unsigned, unsigned> callsite; - /* Map from callsite to callee function_instance. */ - typedef std::map<callsite, const function_instance *> callsite_map; + /* Map from callsite decl_lineno to callee function_instance. */ + typedef std::map<unsigned, const function_instance *> callsite_map; /* Map from source location (decl_lineno) to profile (count_info). */ typedef std::map<unsigned, count_info> position_count_map; @@ -430,8 +428,7 @@ const function_instance *function_instance::get_fu int func_name_idx = afdo_function_name_map->get_index_by_decl (decl); if (func_name_idx != -1) { - callsite_map::const_iterator ret = callsites.find ( - std::make_pair (lineno, func_name_idx)); + callsite_map::const_iterator ret = callsites.find (lineno); if (ret != callsites.end ()) return ret->second; } @@ -439,8 +436,7 @@ const function_instance *function_instance::get_fu lang_hooks.dwarf_name (decl, 0)); if (func_name_idx != -1) { - callsite_map::const_iterator ret = callsites.find ( - std::make_pair (lineno, func_name_idx)); + callsite_map::const_iterator ret = callsites.find (lineno); if (ret != callsites.end ()) return ret->second; } @@ -500,10 +496,7 @@ const function_instance *function_instance::read_f } for (unsigned i = 0; i < num_callsites; i++) { unsigned offset = gcov_read_unsigned (); - const function_instance *callee_function_instance = - read_function_instance (stack, 0); - s->callsites[std::make_pair (offset, callee_function_instance->name ())] = - callee_function_instance; + s->callsites[offset] = read_function_instance (stack, 0); } stack->pop_back(); return s;