Add -fdump-profile-report.
authorMartin Liska <mliska@suse.cz>
Thu, 9 Jul 2020 09:58:11 +0000 (11:58 +0200)
committerMartin Liska <mliska@suse.cz>
Fri, 10 Jul 2020 08:10:50 +0000 (10:10 +0200)
When using -fprofile-report, -fdump-profile-report can be used to
print the report to a foo.c.000i.profile-report file instead
of stderr. I see it handy for comparison purpose.

gcc/ChangeLog:

* dumpfile.c [profile-report]: Add new profile dump.
* dumpfile.h (enum tree_dump_index): Ad TDI_profile_report.
* passes.c (pass_manager::dump_profile_report): Change stderr
to dump_file.

gcc/dumpfile.c
gcc/dumpfile.h
gcc/passes.c

index 5d61946fc49a902cde3aff9ad035f99849ed96c7..9a5496a18e88f769a7ce6d4a467a5df4951db726 100644 (file)
@@ -103,8 +103,9 @@ static struct dump_file_info dump_files[TDI_end] =
   DUMP_FILE_INFO (".gimple", "tree-gimple", DK_tree, 0),
   DUMP_FILE_INFO (".nested", "tree-nested", DK_tree, 0),
   DUMP_FILE_INFO (".lto-stream-out", "ipa-lto-stream-out", DK_ipa, 0),
+  DUMP_FILE_INFO (".profile-report", "profile-report", DK_ipa, 0),
 #define FIRST_AUTO_NUMBERED_DUMP 1
-#define FIRST_ME_AUTO_NUMBERED_DUMP 4
+#define FIRST_ME_AUTO_NUMBERED_DUMP 5
 
   DUMP_FILE_INFO (NULL, "lang-all", DK_lang, 0),
   DUMP_FILE_INFO (NULL, "tree-all", DK_tree, 0),
index 00e175a4737992c2fa8a27b287a819b8b7def5ba..ee9e602b67f291b876c7d6d3e96c1061e1610a2d 100644 (file)
@@ -48,6 +48,7 @@ enum tree_dump_index
   TDI_gimple,                  /* dump each function after gimplifying it */
   TDI_nested,                  /* dump each function after unnesting it */
   TDI_lto_stream_out,          /* dump information about lto streaming */
+  TDI_profile_report,          /* dump information about profile quality */
 
   TDI_lang_all,                        /* enable all the language dumps.  */
   TDI_tree_all,                        /* enable all the GENERIC/GIMPLE dumps.  */
index 07b2613ffeaa3b8a6180686aaed72246d79e6932..a5da9a46f4e9d165707e68ea5227602c1dbe3012 100644 (file)
@@ -1850,10 +1850,15 @@ pass_manager::dump_profile_report () const
 
   if (!profile_record)
     return;
-  fprintf (stderr, "\nProfile consistency report:\n\n");
-  fprintf (stderr, "                                 |mismatch     |mismatch     |                     |\n");
-  fprintf (stderr, "Pass name                        |IN    |IN    |OUT   |OUT   |overall              |\n");
-  fprintf (stderr, "                                 |freq  |count |freq  |count |size      |time      |\n");
+
+  FILE *dump_file = dump_begin (TDI_profile_report, NULL);
+  if (dump_file == NULL)
+    dump_file = stderr;
+
+  fprintf (dump_file, "Profile consistency report:\n\n");
+  fprintf (dump_file, "                                 |mismatch     |mismatch     |                     |\n");
+  fprintf (dump_file, "Pass name                        |IN    |IN    |OUT   |OUT   |overall              |\n");
+  fprintf (dump_file, "                                 |freq  |count |freq  |count |size      |time      |\n");
           
   for (int i = 1; i < passes_by_id_size; i++)
     if (profile_record[i].run)
@@ -1876,47 +1881,47 @@ pass_manager::dump_profile_report () const
            || rel_time_change || rel_size_change)
          {
            last_reported = i;
-           fprintf (stderr, "%-33s", passes_by_id[i]->name);
+           fprintf (dump_file, "%-33s", passes_by_id[i]->name);
            if (profile_record[i].num_mismatched_freq_in != last_freq_in)
-             fprintf (stderr, "| %+5i",
+             fprintf (dump_file, "| %+5i",
                       profile_record[i].num_mismatched_freq_in
                       - last_freq_in);
            else
-             fprintf (stderr, "|      ");
+             fprintf (dump_file, "|      ");
            if (profile_record[i].num_mismatched_count_in != last_count_in)
-             fprintf (stderr, "| %+5i",
+             fprintf (dump_file, "| %+5i",
                       profile_record[i].num_mismatched_count_in
                       - last_count_in);
            else
-             fprintf (stderr, "|      ");
+             fprintf (dump_file, "|      ");
            if (profile_record[i].num_mismatched_freq_out != last_freq_out)
-             fprintf (stderr, "| %+5i",
+             fprintf (dump_file, "| %+5i",
                       profile_record[i].num_mismatched_freq_out
                       - last_freq_out);
            else
-             fprintf (stderr, "|      ");
+             fprintf (dump_file, "|      ");
            if (profile_record[i].num_mismatched_count_out != last_count_out)
-             fprintf (stderr, "| %+5i",
+             fprintf (dump_file, "| %+5i",
                       profile_record[i].num_mismatched_count_out
                       - last_count_out);
            else
-             fprintf (stderr, "|      ");
+             fprintf (dump_file, "|      ");
 
            /* Size/time units change across gimple and RTL.  */
            if (i == pass_expand_1->static_pass_number)
-             fprintf (stderr, "|----------|----------");
+             fprintf (dump_file, "|----------|----------");
            else
              {
                if (rel_size_change)
-                 fprintf (stderr, "| %+8.1f%%", rel_size_change);
+                 fprintf (dump_file, "| %+8.1f%%", rel_size_change);
                else
-                 fprintf (stderr, "|          ");
+                 fprintf (dump_file, "|          ");
                if (rel_time_change)
-                 fprintf (stderr, "| %+8.1f%%", rel_time_change);
+                 fprintf (dump_file, "| %+8.1f%%", rel_time_change);
                else
-                 fprintf (stderr, "|          ");
+                 fprintf (dump_file, "|          ");
              }
-           fprintf (stderr, "|\n");
+           fprintf (dump_file, "|\n");
            last_freq_in = profile_record[i].num_mismatched_freq_in;
            last_freq_out = profile_record[i].num_mismatched_freq_out;
            last_count_in = profile_record[i].num_mismatched_count_in;
@@ -1925,12 +1930,14 @@ pass_manager::dump_profile_report () const
        else if (last_reported != i)
          {
            last_reported = i;
-           fprintf (stderr, "%-20s ------------|      |      |      |      |          |          |\n",
+           fprintf (dump_file, "%-20s ------------|      |      |      |      |          |          |\n",
                     passes_by_id[i]->name);
          }
        last_time = profile_record[i].time;
        last_size = profile_record[i].size;
       }
+
+  dump_end (TDI_profile_report, dump_file);
 }
 
 /* Perform all TODO actions that ought to be done on each function.  */