coverage.c (get_coverage_counts): Use from_function_decl for precise function location.
authorIndu Bhagat <indu.bhagat@oracle.com>
Fri, 30 Nov 2018 23:54:30 +0000 (23:54 +0000)
committerJeff Law <law@gcc.gnu.org>
Fri, 30 Nov 2018 23:54:30 +0000 (16:54 -0700)
* coverage.c (get_coverage_counts): Use from_function_decl for precise
function location.
* profile-count.c (profile_count::dump): Add handling for precise
profile quality.
* profile.c (compute_branch_probabilities): Rely on exec_counts instead
of profile_info to set profile_status of function.
(branch_prob): Do not set profile_status of function based on
profile_info. Done above based on exec_counts.

From-SVN: r266702

gcc/ChangeLog
gcc/coverage.c
gcc/profile-count.c
gcc/profile.c

index a759eeb4695bf1ed719fcc7239109d7dce58de96..6ce31bf892717795845618c00cf1c9a3d241d7f0 100644 (file)
@@ -1,3 +1,14 @@
+2018-11-30  Indu Bhagat  <indu.bhagat@oracle.com>
+
+       * coverage.c (get_coverage_counts): Use from_function_decl for precise
+       function location.
+       * profile-count.c (profile_count::dump): Add handling for precise
+       profile quality.
+       * profile.c (compute_branch_probabilities): Rely on exec_counts instead
+       of profile_info to set profile_status of function.
+       (branch_prob): Do not set profile_status of function based on
+       profile_info. Done above based on exec_counts.
+
 2018-11-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/88274
index f0cbc1e46efec05a6df4838446ad4428a53e074d..9dc1cae28b1074b7a2af78a50e448b8fdc0c7f46 100644 (file)
@@ -358,7 +358,7 @@ get_coverage_counts (unsigned counter, unsigned cfg_checksum,
       if (warning_printed && dump_enabled_p ())
        {
          dump_user_location_t loc
-           = dump_user_location_t::from_location_t (input_location);
+           = dump_user_location_t::from_function_decl (current_function_decl);
           dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
                            "use -Wno-error=coverage-mismatch to tolerate "
                            "the mismatch but performance may drop if the "
index f4ab244e3a3d2b300059e4113495e0ec61ae940b..90f4febfd6698a7c0a69ce7359e75c98f02ab11c 100644 (file)
@@ -83,6 +83,8 @@ profile_count::dump (FILE *f) const
        fprintf (f, " (auto FDO)");
       else if (m_quality == profile_guessed)
        fprintf (f, " (guessed)");
+      else if (m_quality == profile_precise)
+       fprintf (f, " (precise)");
     }
 }
 
index be6d3b8af7e105c41e7758f8cb5ee53e695728a8..ded0958f0aa6b37588bb1de8642b417688e8dfb2 100644 (file)
@@ -698,6 +698,9 @@ compute_branch_probabilities (unsigned cfg_checksum, unsigned lineno_checksum)
        }
     }
 
+  if (exec_counts)
+    profile_status_for_fn (cfun) = PROFILE_READ;
+
   /* If we have real data, use them!  */
   if (bb_gcov_count (ENTRY_BLOCK_PTR_FOR_FN (cfun))
       || !flag_guess_branch_prob)
@@ -705,7 +708,7 @@ compute_branch_probabilities (unsigned cfg_checksum, unsigned lineno_checksum)
       bb->count = profile_count::from_gcov_type (bb_gcov_count (bb));
   /* If function was not trained, preserve local estimates including statically
      determined zero counts.  */
-  else
+  else if (profile_status_for_fn (cfun) == PROFILE_READ)
     FOR_ALL_BB_FN (bb, cfun)
       if (!(bb->count == profile_count::zero ()))
         bb->count = bb->count.global0 ();
@@ -718,6 +721,11 @@ compute_branch_probabilities (unsigned cfg_checksum, unsigned lineno_checksum)
 
   if (dump_file)
     {
+      fprintf (dump_file, " Profile feedback for function");
+      fprintf (dump_file, ((profile_status_for_fn (cfun) == PROFILE_READ)
+                          ? " is available \n"
+                          : " is not available \n"));
+
       fprintf (dump_file, "%d branches\n", num_branches);
       if (num_branches)
        for (i = 0; i < 10; i++)
@@ -1317,12 +1325,12 @@ branch_prob (void)
   values.release ();
   free_edge_list (el);
   coverage_end_function (lineno_checksum, cfg_checksum);
-  if (flag_branch_probabilities && profile_info)
+  if (flag_branch_probabilities
+      && (profile_status_for_fn (cfun) == PROFILE_READ))
     {
       struct loop *loop;
       if (dump_file && (dump_flags & TDF_DETAILS))
        report_predictor_hitrates ();
-      profile_status_for_fn (cfun) = PROFILE_READ;
 
       /* At this moment we have precise loop iteration count estimates.
         Record them to loop structure before the profile gets out of date. */