aboutsummaryrefslogtreecommitdiff
path: root/gcc/auto-profile.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/auto-profile.cc')
-rw-r--r--gcc/auto-profile.cc46
1 files changed, 43 insertions, 3 deletions
diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc
index aa4d163..7e0e8c6 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)));