This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [GOOGLE] Refactor AutoFDO


On Wed, Jul 31, 2013 at 10:14 AM, Xinliang David Li <davidxl@google.com> wrote:
> Another round of documentation  and naming (not for coding style, but
> for clearer semantics) related comments:
>
> David
>
>>
>> namespace autofdo {
>>
>> /* Represent a source location: (function_decl, lineno).  */
>> typedef std::pair<tree, unsigned> decl_lineno;
>> /* Represent an inline stack. vector[0] is the leaf node.  */
>> typedef std::vector<decl_lineno> inline_stack;
>
> leaf or root?

leaf

>
>> /* String array.  */
>> typedef std::vector<const char *> string_vector;
>
> Module name, function name strings or a generic string table??

done
>
>> /* Map from index in string_map to profile count.  */
>> typedef std::map<unsigned, gcov_type> target_map;
>
> What index? function index?  Is profile count function profile count
> or target call count?

done
>
> Should it renamed to icall_target_map to be clearer?

done
>
>> /* Represent profile count: (execution_count, value_profile_histogram.  */
>> typedef std::pair<gcov_type, target_map> count_info;
>>
>
> The executation count is for what entity?

done
>
>> struct string_compare
>> {
>>   bool operator() (const char *a, const char *b) const
>>     { return strcmp (a, b) < 0; }
>> };
>>
>> /* Store a string array, indexed by string position in the array.  */
>> class string_map {
>
> Is it better to rename it to function_name_map ? string_map is too general.

done
>
>
>>  public:
>>   static string_map *create ();
>>
>>   /* For a given string, returns its index.  */
>>   int get_index (const char *name) const;
>>   /* For a given decl, returns the index of the decl name.  */
>>   int get_index_by_decl (tree decl) const;
>>   /* For a given index, returns the string.  */
>>   const char *get_name (int index) const;
>>
>>  private:
>>   string_map () {}
>>   bool read ();
>>
>>   typedef std::map<const char *, unsigned, string_compare> string_index_map;
>>   string_vector vector_;
>>   string_index_map map_;
>> };
>>
>> /* Profile of a function copy:
>>      1. total_count of the copy.
>>      2. head_count of the copy (only valid when the copy is a top-level
>> symbol, i.e. it is the original copy instead of the inlined copy).
>>      3. map from source location (decl_lineno) to profile (count_info).
>
> Source location of the inlined callsite?

done
>
>>      4. map from callsite (64 bit integer, higher 32 bit is source location
>> (decl_lineno), lower 32 bit is callee function name index in
>> string_map) to callee symbol.  */
>> class symbol {
>
>
> May be rename it to " function_instance" ?

done
>
>> public:
>>   typedef std::vector<symbol *> symbol_stack;
>>
>>   /* Read the profile and create a symbol with head count as  HEAD_COUNT.
>>      Recursively read callsites to create nested symbols too. STACK is used
>>      to track the recursive creation process.  */
>>   static const symbol *read_symbol (symbol_stack *stack, gcov_type head_count);
>>
>>   /* Recursively deallocate all callsites (nested symbols).  */
>>   ~symbol ();
>>
>>   /* Accessors.  */
>>   unsigned name () const { return name_; }
>>   gcov_type total_count () const { return total_count_; }
>>   gcov_type head_count () const { return head_count_; }
>>
>>   /* Recursively traverse STACK starting from LEVEL to find the corresponding
>>      symbol.  */
>>   const symbol *get_symbol (const inline_stack &stack, unsigned level) const;
>>
>>   /* Return the profile info for LOC.  */
>>   bool get_count_info (location_t loc, count_info *info) const;
>>
>> private:
>>   symbol (unsigned name, gcov_type head_count)
>>       : name_(name), total_count_(0), head_count_(head_count) {}
>>   const symbol *get_symbol_by_decl (unsigned lineno, tree decl) const;
>>
>>   /* Map from callsite (64 bit integer, higher 32 bit is source location
>>      (decl_lineno), lower 32 bit is callee function name index in
>>      string_map) to callee symbol.  */
>>   typedef std::map<gcov_type, const symbol *> callsite_map;
>
> Why not making a pair and use it as the key?

done
>
>>   /* Map from source location (decl_lineno) to profile (count_info).  */
>>   typedef std::map<unsigned, count_info> position_count_map;
>>
>>   /* symbol name index in the string map.  */
>
>
> Index in string_vector or string_map?

done
>
>>   unsigned name_;
>>   /* The total sampled count.  */
>>   gcov_type total_count_;
>>   /* The total sampled count in the head bb.  */
>>   gcov_type head_count_;
>>   /* Map from callsite location to callee symbol.  */
>>   callsite_map callsites;
>>   /* Map from source location to count and instruction number.  */
>>   position_count_map pos_counts;
>> };
>>
>> /* Profile for all functions.  */
>> class symbol_map {
>
>
> symbol_map --> program_profiles or afdo_profile ?

done
>
>> public:
>>   static symbol_map *create ()
>>     {
>>       symbol_map *map = new symbol_map ();
>>       if (map->read ())
>> return map;
>>       delete map;
>>       return NULL;
>>     }
>>   ~symbol_map ();
>>   /* For a given DECL, returns the top-level symbol.  */
>>   const symbol *get_symbol_by_decl (tree decl) const;
>>   /* Find profile info for a given gimple STMT. If found, store the profile
>>      info in INFO, and return true; otherwise return false.  */
>>   bool get_count_info (gimple stmt, count_info *info) const;
>>   /* Find total count of the callee of EDGE.  */
>>   gcov_type get_callsite_total_count (struct cgraph_edge *edge) const;
>>
>> private:
>>   /* Map from symbol name index (in string_map) to symbol.  */
>>   typedef std::map<unsigned, const symbol *> Namesymbol_map;
>>
>>   symbol_map () {}
>>   bool read ();
>>   /* Return the symbol in the profile that correspond to the inline STACK.  */
>>   const symbol *get_symbol_by_inline_stack (const inline_stack &stack) const;
>>
>>   Namesymbol_map map_;
>> };
>>
>> /* Module profile.  */
>> class module_map {
>
> afdo_module_profile ?

done
>
>> public:
>>   static module_map *create ()
>>     {
>>       module_map *map = new module_map ();
>>       if (map->read ())
>> return map;
>>       delete map;
>>       return NULL;
>>     }
>>
>>   /* For a given module NAME, returns this module's gcov_m
>
> On Tue, Jul 30, 2013 at 4:48 PM, Dehao Chen <dehao@google.com> wrote:
>> Patch updated to fix the code style and documentation.
>>
>> Thanks,
>> Dehao
>>
>> On Tue, Jul 30, 2013 at 2:24 PM, Xinliang David Li <davidxl@google.com> wrote:
>>> I have some preliminary comments. Mostly just related to code style
>>> and missing documentation.
>>>
>>> David
>>>
>>>>
>>>> #define DEFAULT_AUTO_PROFILE_FILE "fbdata.afdo"
>>>>
>>>> struct SourceLocation
>>>
>>> Is using Upper case in struct names allowed?
>>>
>>>> {
>>>>   tree func_decl;
>>>>   unsigned lineno;
>>>> };
>>>>
>>>> typedef std::vector<const char *> StringVector;
>>>> typedef std::vector<SourceLocation> InlineStack;
>>>> typedef std::map<unsigned, gcov_type> TargetMap;
>>>>
>>>
>>> Add short description of each new types.
>>>
>>>> struct ProfileInfo
>>>> {
>>>>   gcov_type count;
>>>>   TargetMap target_map;
>>>> };
>>>>
>>>> struct StringCompare
>>>> {
>>>>   bool operator() (const char* a, const char* b) const
>>>
>>> '*' should bind to name.
>>>
>>>>     { return strcmp (a, b) < 0; }
>>>> };
>>>>
>>>
>>>> class StringMap {
>>>>  public:
>>>>   static StringMap *Create();
>>>>   int GetIndex (const char *name) const;
>>>>   int GetIndexByDecl (tree decl) const;
>>>>   const char *GetName (int index) const;
>>>>
>>>>  private:
>>>>   StringMap () {}
>>>>   bool Read ();
>>>>
>>>>   typedef std::map<const char *, unsigned, StringCompare> StringIndexMap;
>>>>   StringVector vector_;
>>>>   StringIndexMap map_;
>>>> };
>>>
>>> Add some documentation on the new type, indicating what is 'index'.
>>>
>>>>
>>>> class Symbol {
>>>
>>> The name 'Symbol' is too generic -- can cause conflicts in the future
>>> unless namespace is used. ALso missing documentation.
>>>
>>>>  public:
>>>>   typedef std::vector<Symbol *> SymbolStack;
>>>
>>> Fix indentation problems.
>>>
>>>
>>>>
>>>>   /* Read the profile and create a symbol with head count as  HEAD_COUNT.
>>>>      Recursively read callsites to create nested symbols too. STACK is used
>>>>      to track the recursive creation process.  */
>>>>   static const Symbol *ReadSymbol (SymbolStack *stack, gcov_type head_count);
>>>>
>>>>   /* Recursively deallocate all callsites (nested symbols).  */
>>>>   ~Symbol ();
>>>>
>>>>   /* Accessors.  */
>>>>   unsigned name () const { return name_; }
>>>>   gcov_type total_count () const { return total_count_; }
>>>>   gcov_type head_count () const { return head_count_; }
>>>>
>>>>   /* Recursively traverse STACK starting from LEVEL to find the corresponding
>>>>      symbol.  */
>>>>   const Symbol *GetSymbol (const InlineStack &stack, unsigned level) const;
>>>>
>>>>   /* Return the profile info for LOC.  */
>>>>   bool GetProfileInfo (location_t loc, ProfileInfo *info) const;
>>>>
>>>>  private:
>>>>   Symbol (unsigned name, gcov_type head_count)
>>>>       : name_(name), total_count_(0), head_count_(head_count) {}
>>>>   const Symbol *GetSymbolByDecl (unsigned lineno, tree decl) const;
>>>>
>>>>   typedef std::map<gcov_type, const Symbol *> CallsiteMap;
>>>
>>> Need documentation for this map.
>>>
>>>>   typedef std::map<unsigned, ProfileInfo> PositionCountMap;
>>>
>>> Need documentation.
>>>
>>>>
>>>>   /* Symbol name index in the string map.  */
>>>>   unsigned name_;
>>>>   /* The total sampled count.  */
>>>>   gcov_type total_count_;
>>>>   /* The total sampled count in the head bb.  */
>>>>   gcov_type head_count_;
>>>>   /* Map from callsite location to callee symbol.  */
>>>>   CallsiteMap callsites;
>>>>   /* Map from source location to count and instruction number.  */
>>>>   PositionCountMap pos_counts;
>>>> };
>>>>
>>>> class SymbolMap {
>>>
>>> Need documentation.
>>>
>>>>  public:
>>>>   static SymbolMap *Create ()
>>>>     {
>>>>       SymbolMap *map = new SymbolMap ();
>>>>       if (map->Read ())
>>>> return map;
>>>>       delete map;
>>>>       return NULL;
>>>>     }
>>>>   ~SymbolMap ();
>>>>   const Symbol *GetSymbolByDecl (tree decl) const;
>>>>   bool GetProfileInfo (gimple stmt, ProfileInfo *info) const;
>>>>   gcov_type GetCallsiteTotalCount (struct cgraph_edge *edge) const;
>>>
>>>  Missing documentation for the interfaces
>>>>
>>>>  private:
>>>
>>>>   typedef std::map<unsigned, const Symbol *> NameSymbolMap;
>>>
>>> map from what to symbol?
>>>
>>>>
>>>>   SymbolMap () {}
>>>>   bool Read ();
>>>>   const Symbol *GetSymbolByInlineStack (const InlineStack &stack) const;
>>>
>>>  Missing documentation for the interfaces
>>>
>>>
>>>>
>>>>   NameSymbolMap map_;
>>>> };
>>>>
>>>> class ModuleMap {
>>>
>>> Need documentation.
>>>
>>> On Tue, Jul 30, 2013 at 11:03 AM, Dehao Chen <dehao@google.com> wrote:
>>>> I just rebased the CL to head and updated the patch.
>>>>
>>>> Thanks,
>>>> Dehao
>>>>
>>>> On Tue, Jul 30, 2013 at 10:09 AM, Xinliang David Li <davidxl@google.com> wrote:
>>>>> I can not apply the patch cleanly in my v17 gcc client -- there is
>>>>> some problem in auto-profile.c.
>>>>>
>>>>> David
>>>>>
>>>>> On Mon, Jul 29, 2013 at 7:52 PM, Dehao Chen <dehao@google.com> wrote:
>>>>>> This patch refactors AutoFDO to use:
>>>>>>
>>>>>> 1. C++ to rewrite the whole thing.
>>>>>> 2. Use tree instead of hashtable to represent the profile.
>>>>>> 3. Make AutoFDO standalone: keep changes to other modules minimum.
>>>>>>
>>>>>> Bootstrapped and passed regression test and benchmark test.
>>>>>>
>>>>>> OK for google-4_8 branch?
>>>>>>
>>>>>> Thanks,
>>>>>> Dehao
>>>>>>
>>>>>> http://codereview.appspot.com/12079043

Attachment: patch.txt
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]