https://gcc.gnu.org/g:59e853308bd797f91df15fd0fa65a3b5ce2cf4a2
commit r16-274-g59e853308bd797f91df15fd0fa65a3b5ce2cf4a2 Author: hongtao.liu <hongtao....@intel.com> Date: Wed Jan 22 07:44:01 2025 +0100 Annotate empty bb with all debug_stmt with location of phi in the single_succ. For an empty BB with all debug_stmt, it will be ignored by afdo_set_bb_count, but it can be set with count of single successors PHIs which edge from the BB. gcc/ChangeLog: PR gcov-profile/118581 * auto-profile.cc (autofdo_source_profile::get_count_info): Overload the function with parameter gimple location instead of stmt. (afdo_set_bb_count): For !has_annotated BB, Check single successors PHIs corresponding to the block and use those count. Diff: --- gcc/auto-profile.cc | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc index aa4d1634f018..7e0e8c66124e 100644 --- a/gcc/auto-profile.cc +++ b/gcc/auto-profile.cc @@ -303,6 +303,10 @@ public: in INFO and return true; otherwise return false. */ bool get_count_info (gimple *stmt, count_info *info) const; + /* Find count_info for a given gimple location GIMPLE_LOC. If found, + store the count_info in INFO and return true; otherwise return false. */ + bool get_count_info (location_t gimple_loc, count_info *info) const; + /* Find total count of the callee of EDGE. */ gcov_type get_callsite_total_count (struct cgraph_edge *edge) const; @@ -724,11 +728,18 @@ autofdo_source_profile::get_function_instance_by_decl (tree decl) const bool autofdo_source_profile::get_count_info (gimple *stmt, count_info *info) const { - if (LOCATION_LOCUS (gimple_location (stmt)) == cfun->function_end_locus) + return get_count_info (gimple_location (stmt), info); +} + +bool +autofdo_source_profile::get_count_info (location_t gimple_loc, + count_info *info) const +{ + if (LOCATION_LOCUS (gimple_loc) == cfun->function_end_locus) return false; inline_stack stack; - get_inline_stack (gimple_location (stmt), &stack); + get_inline_stack (gimple_loc, &stack); if (stack.length () == 0) return false; function_instance *s = get_function_instance_by_inline_stack (stack); @@ -1130,7 +1141,36 @@ afdo_set_bb_count (basic_block bb, const stmt_set &promoted) } if (!has_annotated) - return false; + { + /* For an empty BB with all debug stmt which assigne a value with + constant, check successors PHIs corresponding to the block and + use those counts. */ + edge tmp_e; + edge_iterator tmp_ei; + FOR_EACH_EDGE (tmp_e, tmp_ei, bb->succs) + { + basic_block bb_succ = tmp_e->dest; + for (gphi_iterator gpi = gsi_start_phis (bb_succ); + !gsi_end_p (gpi); + gsi_next (&gpi)) + { + gphi *phi = gpi.phi (); + location_t phi_loc + = gimple_phi_arg_location_from_edge (phi, tmp_e); + count_info info; + if (afdo_source_profile->get_count_info (phi_loc, &info) + && info.count != 0) + { + if (info.count > max_count) + max_count = info.count; + has_annotated = true; + } + } + } + + if (!has_annotated) + return false; + } for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) afdo_source_profile->mark_annotated (gimple_location (gsi_stmt (gsi)));