Hi.

This is small improvement for {gimple,generic}-match.c files.
The code path that reports application of a pattern is now guarded
with __builtin_expect. And reporting function lives in gimple.c.

For gimple-match.o, difference is:

bloaty /tmp/after.o -- /tmp/before.o
     VM SIZE                           FILE SIZE
 ++++++++++++++ GROWING             ++++++++++++++
  [ = ]       0 .rela.debug_loc     +58.5Ki  +0.5%
  +0.7% +7.70Ki .text               +7.70Ki  +0.7%
  [ = ]       0 .debug_info         +3.53Ki  +0.6%
  [ = ]       0 .rela.debug_ranges  +2.02Ki  +0.0%
  [ = ]       0 .debug_loc          +1.86Ki  +0.7%
  +0.7%    +448 .eh_frame              +448  +0.7%
  [ = ]       0 .rela.eh_frame         +192  +0.7%
  [ = ]       0 .rela.debug_line        +48  +0.4%
  [ = ]       0 .debug_str              +26  +0.0%
  +6.9%      +9 .rodata.str1.1           +9  +6.9%

 -------------- SHRINKING           --------------
 -97.5% -24.8Ki .rodata.str1.8      -24.8Ki -97.5%
  [ = ]       0 .symtab             -14.7Ki -26.1%
  [ = ]       0 .strtab             -3.57Ki  -2.2%
  [ = ]       0 .rela.debug_info    -2.81Ki  -0.0%
  [ = ]       0 .debug_line         -2.14Ki  -0.6%
  [ = ]       0 .rela.text             -816  -0.1%
  [ = ]       0 .rela.text.unlikely    -288  -0.1%
  -0.1%    -131 .text.unlikely         -131  -0.1%
  [ = ]       0 [Unmapped]              -23 -14.0%
  [ = ]       0 .debug_abbrev            -2  -0.1%

  -1.2% -16.8Ki TOTAL               +25.1Ki  +0.1%

I'm testing the patch.
Thoughts?

Martin

gcc/ChangeLog:

2018-08-31  Martin Liska  <mli...@suse.cz>

        * genmatch.c (output_line_directive): Add new argument
        fnargs.
        (dt_simplify::gen_1): Generate call to report_match_pattern
        function and wrap that into __builtin_expect.
        * gimple.c (report_match_pattern): New function.
        * gimple.h (report_match_pattern): Likewise.
---
 gcc/genmatch.c | 18 ++++++++++++------
 gcc/gimple.c   | 14 ++++++++++++++
 gcc/gimple.h   |  4 ++++
 3 files changed, 30 insertions(+), 6 deletions(-)


diff --git a/gcc/genmatch.c b/gcc/genmatch.c
index 50d72f8f1e7..8e209b7e6cb 100644
--- a/gcc/genmatch.c
+++ b/gcc/genmatch.c
@@ -184,7 +184,7 @@ fprintf_indent (FILE *f, unsigned int indent, const char *format, ...)
 
 static void
 output_line_directive (FILE *f, source_location location,
-		       bool dumpfile = false)
+		       bool dumpfile = false, bool fnargs = false)
 {
   const line_map_ordinary *map;
   linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
@@ -202,7 +202,11 @@ output_line_directive (FILE *f, source_location location,
 	file = loc.file;
       else
 	++file;
-      fprintf (f, "%s:%d", file, loc.line);
+
+      if (fnargs)
+	fprintf (f, "\"%s\", %d", file, loc.line);
+      else
+	fprintf (f, "%s:%d", file, loc.line);
     }
   else
     /* Other gen programs really output line directives here, at least for
@@ -3305,11 +3309,13 @@ dt_simplify::gen_1 (FILE *f, int indent, bool gimple, operand *result)
 	}
     }
 
-  fprintf_indent (f, indent, "if (dump_file && (dump_flags & TDF_FOLDING)) "
-	   "fprintf (dump_file, \"Applying pattern ");
+  fprintf_indent (f, indent, "if (__builtin_expect (dump_file && "
+		  "(dump_flags & TDF_FOLDING), 0)) report_match_pattern (");
+
   output_line_directive (f,
-			 result ? result->location : s->match->location, true);
-  fprintf (f, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
+			 result ? result->location : s->match->location, true,
+			 true);
+  fprintf (f, ", __FILE__, __LINE__);\n");
 
   if (!result)
     {
diff --git a/gcc/gimple.c b/gcc/gimple.c
index e3e651b1e61..7f4254c930d 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -3190,6 +3190,20 @@ gimple_inexpensive_call_p (gcall *stmt)
   return false;
 }
 
+/* Report about a match of pattern that lives
+   in MATCH_FILE at MATCH_FILE_LINE.  The pattern is matched
+   in GENERATED_FILE at line GENERATE_FILE_LINE.  */
+
+void report_match_pattern (const char *match_file,
+			   unsigned int match_file_line,
+			   const char *generated_file,
+			   unsigned int generate_file_line)
+{
+  fprintf (dump_file, "Applying pattern %s:%d, %s:%d\n",
+	   match_file, match_file_line,
+	   generated_file, generate_file_line);
+}
+
 #if CHECKING_P
 
 namespace selftest {
diff --git a/gcc/gimple.h b/gcc/gimple.h
index a5dda9369bc..cd9e3e54e79 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -6404,6 +6404,10 @@ gimple_set_do_not_emit_location (gimple *g)
   gimple_set_plf (g, GF_PLF_1, true);
 }
 
+extern void report_match_pattern (const char *match_file,
+				  unsigned int match_file_line,
+				  const char *generated_file,
+				  unsigned int generate_file_line);
 
 /* Macros for showing usage statistics.  */
 #define SCALE(x) ((unsigned long) ((x) < 1024*10	\

Reply via email to