The patch is about porting of dump information to -fopt-info so
that we can compare the current pass with a modified one.

Right now, there are 1945 'optimized: Unswitching loop on condition' lines
for SPEC 2006 benchmark.

Moreover, I adjusted dump functions in profile-count.{ch} so that it dumps
to a string buffer.

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

Ready to be installed?
Thanks,
Martin

gcc/ChangeLog:

        * profile-count.c (profile_count::dump): Add function
        that can dump to a provided buffer.
        (profile_probability::dump): Likewise.
        * profile-count.h: Likewise.
        * tree-ssa-loop-unswitch.c (tree_unswitch_single_loop):
        Use dump_printf_loc infrastructure.
        (tree_unswitch_outer_loop): Likewise.
        (find_loop_guard): Likewise.
        (hoist_guard): Likewise.

gcc/testsuite/ChangeLog:

        * gcc.dg/loop-unswitch-1.c: Adjust test-case based on
        dump_printf_loc.
        * gcc.dg/loop-unswitch-2.c: Likewise.
        * gcc.dg/loop-unswitch-3.c: Likewise.
        * gcc.dg/loop-unswitch-4.c: Likewise.
        * gcc.dg/loop-unswitch-5.c: Likewise.
---
 gcc/profile-count.c                    |  48 ++++++---
 gcc/profile-count.h                    |   6 ++
 gcc/testsuite/gcc.dg/loop-unswitch-1.c |   4 +-
 gcc/testsuite/gcc.dg/loop-unswitch-2.c |   5 +-
 gcc/testsuite/gcc.dg/loop-unswitch-3.c |   7 +-
 gcc/testsuite/gcc.dg/loop-unswitch-4.c |   1 -
 gcc/testsuite/gcc.dg/loop-unswitch-5.c |   2 +-
 gcc/tree-ssa-loop-unswitch.c           | 131 +++++++++++++++----------
 8 files changed, 128 insertions(+), 76 deletions(-)

diff --git a/gcc/profile-count.c b/gcc/profile-count.c
index f7f4dffdc90..c04b4fe823d 100644
--- a/gcc/profile-count.c
+++ b/gcc/profile-count.c
@@ -84,18 +84,28 @@ const char *profile_quality_display_names[] =
   "precise"
 };
-/* Dump THIS to F. */
+/* Dump THIS to BUFFER.  */
void
-profile_count::dump (FILE *f) const
+profile_count::dump (char *buffer) const
 {
   if (!initialized_p ())
-    fprintf (f, "uninitialized");
+    sprintf (buffer, "uninitialized");
   else
-    fprintf (f, "%" PRId64 " (%s)", m_val,
+    sprintf (buffer, "%" PRId64 " (%s)", m_val,
             profile_quality_display_names[m_quality]);
 }
+/* Dump THIS to F. */
+
+void
+profile_count::dump (FILE *f) const
+{
+  char buffer[64];
+  dump (buffer);
+  fputs (buffer, f);
+}
+
 /* Dump THIS to stderr.  */
void
@@ -151,32 +161,44 @@ profile_count::stream_out (struct lto_output_stream *ob)
   streamer_write_uhwi_stream (ob, m_quality);
 }
-/* Dump THIS to F. */
+
+/* Output THIS to BUFFER.  */
void
-profile_probability::dump (FILE *f) const
+profile_probability::dump (char *buffer) const
 {
   if (!initialized_p ())
-    fprintf (f, "uninitialized");
+    sprintf (buffer, "uninitialized");
   else
     {
       /* Make difference between 0.00 as a roundoff error and actual 0.
         Similarly for 1.  */
       if (m_val == 0)
-        fprintf (f, "never");
+       buffer += sprintf (buffer, "never");
       else if (m_val == max_probability)
-        fprintf (f, "always");
+       buffer += sprintf (buffer, "always");
       else
-        fprintf (f, "%3.1f%%", (double)m_val * 100 / max_probability);
+       buffer += sprintf (buffer, "%3.1f%%", (double)m_val * 100 / 
max_probability);
+
       if (m_quality == ADJUSTED)
-       fprintf (f, " (adjusted)");
+       sprintf (buffer, " (adjusted)");
       else if (m_quality == AFDO)
-       fprintf (f, " (auto FDO)");
+       sprintf (buffer, " (auto FDO)");
       else if (m_quality == GUESSED)
-       fprintf (f, " (guessed)");
+       sprintf (buffer, " (guessed)");
     }
 }
+/* Dump THIS to F. */
+
+void
+profile_probability::dump (FILE *f) const
+{
+  char buffer[64];
+  dump (buffer);
+  fputs (buffer, f);
+}
+
 /* Dump THIS to stderr.  */
void
diff --git a/gcc/profile-count.h b/gcc/profile-count.h
index c7a45ac5ee3..f86091f23a8 100644
--- a/gcc/profile-count.h
+++ b/gcc/profile-count.h
@@ -609,6 +609,9 @@ public:
   /* Output THIS to F.  */
   void dump (FILE *f) const;
+ /* Output THIS to BUFFER. */
+  void dump (char *buffer) const;
+
   /* Print THIS to stderr.  */
   void debug () const;
@@ -1208,6 +1211,9 @@ public:
   /* Output THIS to F.  */
   void dump (FILE *f) const;
+ /* Output THIS to BUFFER. */
+  void dump (char *buffer) const;
+
   /* Print THIS to stderr.  */
   void debug () const;
diff --git a/gcc/testsuite/gcc.dg/loop-unswitch-1.c b/gcc/testsuite/gcc.dg/loop-unswitch-1.c
index de2fb2c0e4b..f9d628df510 100644
--- a/gcc/testsuite/gcc.dg/loop-unswitch-1.c
+++ b/gcc/testsuite/gcc.dg/loop-unswitch-1.c
@@ -1,6 +1,6 @@
 /* For PR rtl-optimization/27735  */
 /* { dg-do compile } */
-/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-details 
-fno-finite-loops" } */
+/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-all 
-fno-finite-loops" } */
void set_color(void);
 void xml_colorize_line(unsigned int *p, int state)
@@ -33,4 +33,4 @@ parse_tag: ;
 }
/* Test that we actually unswitched something. */
-/* { dg-final { scan-tree-dump ";; Unswitching loop" "unswitch" } } */
+/* { dg-final { scan-tree-dump "Unswitching loop" "unswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/loop-unswitch-2.c 
b/gcc/testsuite/gcc.dg/loop-unswitch-2.c
index f8e99bd1669..e92ae553516 100644
--- a/gcc/testsuite/gcc.dg/loop-unswitch-2.c
+++ b/gcc/testsuite/gcc.dg/loop-unswitch-2.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-details 
-fno-thread-jumps" } */
+/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-all 
-fno-thread-jumps" } */
void foo (float **a, float **b, float *c, int n, int m, int l)
 {
@@ -11,6 +11,5 @@ void foo (float **a, float **b, float *c, int n, int m, int l)
        c[i] += a[i][k] * b[k][j];
 }
-/* { dg-final { scan-tree-dump-times "guard hoisted" 3 "unswitch" } } */
+/* { dg-final { scan-tree-dump-times "Guard hoisted" 3 "unswitch" } } */
 /* { dg-final { scan-tree-dump-not "Invalid sum" "unswitch" } } */
-
diff --git a/gcc/testsuite/gcc.dg/loop-unswitch-3.c 
b/gcc/testsuite/gcc.dg/loop-unswitch-3.c
index 089b6106711..31a90ef23eb 100644
--- a/gcc/testsuite/gcc.dg/loop-unswitch-3.c
+++ b/gcc/testsuite/gcc.dg/loop-unswitch-3.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-details" } */
+/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-all" } */
#include <stdlib.h>
 #define N 32
@@ -21,7 +21,4 @@ float *foo(int ustride, int size, float *src)
    return buffer;
 }
-/* { dg-final { scan-tree-dump-times "guard hoisted" 1 "unswitch" } } */
-/* { dg-final { scan-tree-dump-not "Invalid sum" "unswitch" } } */
-
-
+/* { dg-final { scan-tree-dump-times "Guard hoisted" 1 "unswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/loop-unswitch-4.c 
b/gcc/testsuite/gcc.dg/loop-unswitch-4.c
index 320a1cdb507..05d0fe80321 100644
--- a/gcc/testsuite/gcc.dg/loop-unswitch-4.c
+++ b/gcc/testsuite/gcc.dg/loop-unswitch-4.c
@@ -49,4 +49,3 @@ int main()
return 0;
 }
-
diff --git a/gcc/testsuite/gcc.dg/loop-unswitch-5.c 
b/gcc/testsuite/gcc.dg/loop-unswitch-5.c
index b41e85379ae..77880005301 100644
--- a/gcc/testsuite/gcc.dg/loop-unswitch-5.c
+++ b/gcc/testsuite/gcc.dg/loop-unswitch-5.c
@@ -1,6 +1,6 @@
 /* PR middle-end/71691 */
 /* { dg-do run } */
-/* { dg-options "-fno-tree-vrp -O2 -funswitch-loops 
-fdump-tree-unswitch-details" } */
+/* { dg-options "-fno-tree-vrp -O2 -funswitch-loops" } */
/* Note: The -fno-tree-vrp above is only there to avoid VRP papering
    over the problem.  */
diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c
index fe4dacc0833..e7b405b9357 100644
--- a/gcc/tree-ssa-loop-unswitch.c
+++ b/gcc/tree-ssa-loop-unswitch.c
@@ -273,14 +273,17 @@ tree_unswitch_single_loop (class loop *loop, int num)
   bool changed = false;
   HOST_WIDE_INT iterations;
+ dump_user_location_t loc (last_stmt (loop->header));
+
   /* Perform initial tests if unswitch is eligible.  */
   if (num == 0)
     {
       /* Do not unswitch in cold regions. */
       if (optimize_loop_for_size_p (loop))
        {
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, ";; Not unswitching cold loops\n");
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                            "Not unswitching cold loops\n");
          return false;
        }
@@ -288,8 +291,9 @@ tree_unswitch_single_loop (class loop *loop, int num)
       if (tree_num_loop_insns (loop, &eni_size_weights)
          > (unsigned) param_max_unswitch_insns)
        {
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, ";; Not unswitching, loop too big\n");
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                            "Not unswitching, loop too big\n");
          return false;
        }
@@ -300,9 +304,10 @@ tree_unswitch_single_loop (class loop *loop, int num)
         iterations = likely_max_loop_iterations_int (loop);
       if (iterations >= 0 && iterations <= 1)
        {
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, ";; Not unswitching, loop is not expected"
-                    " to iterate\n");
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                            "Not unswitching, loop is not expected"
+                            " to iterate\n");
          return false;
        }
     }
@@ -320,10 +325,10 @@ tree_unswitch_single_loop (class loop *loop, int num)
if (i == loop->num_nodes)
        {
-         if (dump_file
-             && num > param_max_unswitch_level
-             && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, ";; Not unswitching anymore, hit max level\n");
+         if (dump_enabled_p ()
+             && num > param_max_unswitch_level)
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                            "Not unswitching anymore, hit max level\n");
if (found == loop->num_nodes)
            {
@@ -445,8 +450,10 @@ tree_unswitch_single_loop (class loop *loop, int num)
        }
     }
- if (dump_file && (dump_flags & TDF_DETAILS))
-    fprintf (dump_file, ";; Unswitching loop\n");
+  if (dump_enabled_p ())
+    dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
+                    "Unswitching loop on condition: %G\n",
+                    last_stmt (bbs[found]));
initialize_original_copy_tables ();
   /* Unswitch the loop on this condition.  */
@@ -520,9 +527,13 @@ tree_unswitch_outer_loop (class loop *loop)
     iterations = likely_max_loop_iterations_int (loop);
   if (iterations >= 0 && iterations <= 1)
     {
-      if (dump_file && (dump_flags & TDF_DETAILS))
-       fprintf (dump_file, ";; Not unswitching, loop is not expected"
-                " to iterate\n");
+      if (dump_enabled_p ())
+       {
+         dump_user_location_t loc (last_stmt (loop->header));
+         dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                          "Not unswitching, loop is not expected"
+                          " to iterate\n");
+       }
       return false;
     }
@@ -623,26 +634,31 @@ find_loop_guard (class loop *loop)
   else
     return NULL;
+ dump_user_location_t loc (last_stmt (loop->header));
+
   /* Guard edge must skip inner loop.  */
   if (!dominated_by_p (CDI_DOMINATORS, loop->inner->header,
       guard_edge == fe ? te->dest : fe->dest))
     {
-      if (dump_file && (dump_flags & TDF_DETAILS))
-       fprintf (dump_file, "Guard edge %d --> %d is not around the loop!\n",
-                guard_edge->src->index, guard_edge->dest->index);
+      if (dump_enabled_p ())
+       dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                        "Guard edge %d --> %d is not around the loop!\n",
+                        guard_edge->src->index, guard_edge->dest->index);
       return NULL;
     }
   if (guard_edge->dest == loop->latch)
     {
-      if (dump_file && (dump_flags & TDF_DETAILS))
-       fprintf (dump_file, "Guard edge destination is loop latch.\n");
+      if (dump_enabled_p ())
+       dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                        "Guard edge destination is loop latch.\n");
       return NULL;
     }
- if (dump_file && (dump_flags & TDF_DETAILS))
-    fprintf (dump_file,
-            "Considering guard %d -> %d in loop %d\n",
-            guard_edge->src->index, guard_edge->dest->index, loop->num);
+  if (dump_enabled_p ())
+    dump_printf_loc (MSG_NOTE, loc,
+                    "Considering guard %d -> %d in loop %d\n",
+                    guard_edge->src->index, guard_edge->dest->index,
+                    loop->num);
   /* Check if condition operands do not have definitions inside loop since
      any bb copying is not performed.  */
   FOR_EACH_SSA_TREE_OPERAND (use, cond, iter, SSA_OP_USE)
@@ -652,9 +668,9 @@ find_loop_guard (class loop *loop)
       if (def_bb
           && flow_bb_inside_loop_p (loop, def_bb))
        {
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, "  guard operands have definitions"
-                               " inside loop\n");
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_NOTE, loc, "guard operands have definitions"
+                            " inside loop\n");
          return NULL;
        }
     }
@@ -667,23 +683,26 @@ find_loop_guard (class loop *loop)
        continue;
       if (bb->flags & BB_IRREDUCIBLE_LOOP)
        {
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, "Block %d is marked as irreducible in loop\n",
-                     bb->index);
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                            "Block %d is marked as irreducible in loop\n",
+                            bb->index);
          guard_edge = NULL;
          goto end;
        }
       if (!empty_bb_without_guard_p (loop, bb))
        {
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, "  block %d has side effects\n", bb->index);
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                            "Block %d has side effects\n", bb->index);
          guard_edge = NULL;
          goto end;
        }
     }
- if (dump_file && (dump_flags & TDF_DETAILS))
-    fprintf (dump_file, "  suitable to hoist\n");
+  if (dump_enabled_p ())
+    dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
+                    "suitable to hoist\n");
 end:
   if (body)
     free (body);
@@ -822,13 +841,19 @@ hoist_guard (class loop *loop, edge guard)
   update_stmt (cond_stmt);
   /* Create new loop pre-header.  */
   e = split_block (pre_header, last_stmt (pre_header));
-  if (dump_file && (dump_flags & TDF_DETAILS))
+
+  dump_user_location_t loc (last_stmt (loop->header));
+
+  if (dump_enabled_p ())
     {
-      fprintf (dump_file, "  Moving guard %i->%i (prob ",
-              guard->src->index, guard->dest->index);
-      guard->probability.dump (dump_file);
-      fprintf (dump_file, ") to bb %i, new preheader is %i\n",
-              e->src->index, e->dest->index);
+      char buffer[64];
+      guard->probability.dump (buffer);
+
+      dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
+                      "Moving guard %i->%i (prob %s) to bb %i, "
+                      "new preheader is %i\n",
+                      guard->src->index, guard->dest->index,
+                      buffer, e->src->index, e->dest->index);
     }
gcc_assert (loop_preheader_edge (loop)->src == e->dest);
@@ -860,11 +885,14 @@ hoist_guard (class loop *loop, edge guard)
       fprintf (dump_file, "  Capping count; expect profile inconsistency\n");
       skip_count = e->count ();
     }
-  if (dump_file && (dump_flags & TDF_DETAILS))
+  if (dump_enabled_p ())
     {
-      fprintf (dump_file, "  Estimated probability of skipping loop is ");
-      new_edge->probability.dump (dump_file);
-      fprintf (dump_file, "\n");
+      char buffer[64];
+      new_edge->probability.dump (buffer);
+
+      dump_printf_loc (MSG_NOTE, loc,
+                      "Estimated probability of skipping loop is %s\n",
+                      buffer);
     }
/* Update profile after the transform:
@@ -883,15 +911,15 @@ hoist_guard (class loop *loop, edge guard)
      where profile does not change.  */
   basic_block *body = get_loop_body (loop);
- if (dump_file && (dump_flags & TDF_DETAILS))
-    fprintf (dump_file, "  Scaling nonguarded BBs in loop:");
   for (unsigned int i = 0; i < loop->num_nodes; i++)
     {
       basic_block bb = body[i];
       if (!dominated_by_p (CDI_DOMINATORS, bb, not_guard->dest))
        {
-         if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, " %i", bb->index);
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_NOTE, loc,
+                            "Scaling nonguarded BBs in loop: %i\n",
+                            bb->index);
          if (e->probability.initialized_p ())
             scale_bbs_frequencies (&bb, 1, e->probability);
        }
@@ -922,8 +950,9 @@ hoist_guard (class loop *loop, edge guard)
        }
     }
- if (dump_file && (dump_flags & TDF_DETAILS))
-    fprintf (dump_file, "\n  guard hoisted.\n");
+  if (dump_enabled_p ())
+    dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
+                    "Guard hoisted\n");
free (body);
 }
--
2.34.1

Reply via email to