This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[GOOGLE] Represent the callsite with lineno only for AutoFDO
- From: Dehao Chen <dehao at google dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, David Li <davidxl at google dot com>
- Date: Wed, 9 Oct 2013 16:57:42 -0700
- Subject: [GOOGLE] Represent the callsite with lineno only for AutoFDO
- Authentication-results: sourceware.org; auth=none
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;