diff mbox

[GOOGLE] Represent the callsite with lineno only for AutoFDO

Message ID CAO2gOZWJiHsWEOw_NmhrKcLL-z37xCut+iXbXgQMu2NjtuNFKw@mail.gmail.com
State New
Headers show

Commit Message

Dehao Chen Oct. 9, 2013, 11:57 p.m. UTC
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

Comments

Xinliang David Li Oct. 10, 2013, 12:41 a.m. UTC | #1
Ok (please add a short comment on the decl_lineno which encodes
discriminator in it).

David

On Wed, Oct 9, 2013 at 4:57 PM, Dehao Chen <dehao@google.com> wrote:
> 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;
diff mbox

Patch

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;