Add -fdump-profile-report.

Message ID 77f1ab24-1abc-04d7-3024-4f3f3c31bdf7@suse.cz
State New
Headers show
Series
  • Add -fdump-profile-report.
Related show

Commit Message

Martin Liška July 9, 2020, 11:54 a.m.
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.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

---
  gcc/dumpfile.c |  3 ++-
  gcc/dumpfile.h |  1 +
  gcc/passes.c   | 47 +++++++++++++++++++++++++++--------------------
  3 files changed, 30 insertions(+), 21 deletions(-)

-- 
2.27.0

Comments

Richard Sandiford via Gcc-patches July 10, 2020, 7:57 a.m. | #1
On Thu, Jul 9, 2020 at 1:55 PM Martin Liška <mliska@suse.cz> wrote:
>

> 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.

>

> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

>

> Ready to be installed?


OK.

> Thanks,

> Martin

>

> ---

>   gcc/dumpfile.c |  3 ++-

>   gcc/dumpfile.h |  1 +

>   gcc/passes.c   | 47 +++++++++++++++++++++++++++--------------------

>   3 files changed, 30 insertions(+), 21 deletions(-)

>

> diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c

> index 5d61946fc49..9a5496a18e8 100644

> --- a/gcc/dumpfile.c

> +++ b/gcc/dumpfile.c

> @@ -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),

> diff --git a/gcc/dumpfile.h b/gcc/dumpfile.h

> index 00e175a4737..ee9e602b67f 100644

> --- a/gcc/dumpfile.h

> +++ b/gcc/dumpfile.h

> @@ -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.  */

> diff --git a/gcc/passes.c b/gcc/passes.c

> index 07b2613ffea..a5da9a46f4e 100644

> --- a/gcc/passes.c

> +++ b/gcc/passes.c

> @@ -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.  */

> --

> 2.27.0

>

Patch

diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c
index 5d61946fc49..9a5496a18e8 100644
--- a/gcc/dumpfile.c
+++ b/gcc/dumpfile.c
@@ -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),
diff --git a/gcc/dumpfile.h b/gcc/dumpfile.h
index 00e175a4737..ee9e602b67f 100644
--- a/gcc/dumpfile.h
+++ b/gcc/dumpfile.h
@@ -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.  */
diff --git a/gcc/passes.c b/gcc/passes.c
index 07b2613ffea..a5da9a46f4e 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -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.  */