This was contributed by: 2011-04-13 Neil Vachharajani <[email protected]>
On Wed, Apr 13, 2011 at 3:25 PM, Xinliang David Li <[email protected]> wrote: > Hi, in current FDO implementation, the source file version used in > profile-generate needs to strictly match the version used in > profile-use -- simple formating changes will invalidate the profile > data (use of it will lead to compiler error or ICE). There are two > main problems that lead to the weakness: > > 1) the function checksum is computed based on line number and number > of basic blocks -- this means any line number change will invalidate > the profile data. In fact, line number should play very minimal role > in profile matching decision. Another problem is that number of basic > blocks is also not a good indicator whether CFG matches or not. > 2) cgraph's pid is used as the key to find the matching profile data > for a function. If there is any new function added, or if the order of > the functions changes, the profile data is invalidated. > > The attached is a patch from google that improves this. > 1) function checksum is split into two parts: lineno checksum and cfg checksum > 2) function assembler name is used in profile hashing. > > Bootstrapped and regression tested on x86_64/linux. > > Ok for trunk? > > Thanks, > > David > > 2011-04-13 Xinliang David Li <[email protected]> > > * tree.c (crc32_byte): New function. > * tree.h (crc32_byte): New function. > * gcov.c (function_info): Add new fields. > (read_graph_file): Handle new fields. > (read_count_file): Handle name. > * gcov-io.c (gcov_string_length): New function. > (gcov_write_words): Bug fix. > (gcov_read_words): Bug fix. > * gcov-io.h: New interfaces. > * profile.c (get_exec_counts): New parameter. > (compute_branch_probablilities): New parameter. > (compute_value_histogram): New parameter. > (branch_prob): Pass cfg_checksum. > * coverage.c (get_const_string_type): New function. > (hash_counts_entry_hash): Use string hash. > (hash_counts_entry_eq): Use string compare. > (htab_counts_entry_del): Delete name. > (read_count_file): Add handling of cfg checksum. > (get_coverage_counts): New parameter. > (xstrdup_mask_random): New function. > (coverage_compute_lineno_checksum): New function. > (coverage_compute_cfg_checksum): New function. > (coverage_begin_output): New parameter. > (coverage_end_function): New parameter. > (build_fn_info_type): Build new fields. > (build_fn_info_value): Build new field values. > * coverage.h: Interface changes. > * libgcov.c (gcov_exit): Dump new fields. > * gcov_dump.c (tag_function): Print new fields. >
