public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] tree-ssa-loop-unswitch.c: port to the dump_* API (PR tree-optimization/88763)
@ 2019-01-10  1:55 David Malcolm
  2019-04-26 12:30 ` Richard Biener
  0 siblings, 1 reply; 2+ messages in thread
From: David Malcolm @ 2019-01-10  1:55 UTC (permalink / raw)
  To: gcc-patches, Richard Biener; +Cc: David Malcolm

PR tree-optimization/88763 reports difficulties in getting useful
information from the log of tree-ssa-loop-unswitch.c.

As work towards improving this, this patch eliminates all uses of
dump_file from that source file, in favor of the dump API (to
support -fopt-info* and -fsave-optimization-record).

Doing so required adding a way to dump profile_probability instances,
so the patch adds a profile_probability::dump overload for this.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.

OK for next stage 1?

gcc/ChangeLog:
	PR tree-optimization/88763
	* cfgloop.h (find_loop_location): Move decl to here.
	* profile-count.c (profile_probability::dump): Reimplement in
	terms of...
	(profile_probability::print): ...this new function, moving the
	body here, and porting from FILE * to pretty_printer *.
	(profile_probability::dump): New function.
	* profile-count.h (class dump_metadata_t): New forward decl.
	(profile_probability::print): New decl.
	(profile_probability::dump): New overloaded decl.
	* tree-ssa-loop-unswitch.c (tree_unswitch_single_loop): Port from
	fprintf to the dump_* API.
	(tree_unswitch_outer_loop): Likewise.
	(find_loop_guard): Likewise.
	(hoist_guard): Likewise.
	* tree-vectorizer.h (find_loop_location): Move from here to
	cfgloop.h.
---
 gcc/cfgloop.h                |   3 +
 gcc/profile-count.c          |  34 ++++++++---
 gcc/profile-count.h          |   7 +++
 gcc/tree-ssa-loop-unswitch.c | 135 ++++++++++++++++++++++++++-----------------
 gcc/tree-vectorizer.h        |   1 -
 5 files changed, 120 insertions(+), 60 deletions(-)

diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h
index 2e93af3..c175dcb 100644
--- a/gcc/cfgloop.h
+++ b/gcc/cfgloop.h
@@ -870,4 +870,7 @@ gcov_type_to_wide_int (gcov_type val)
 
   return widest_int::from_array (a, 2);
 }
+
+extern dump_user_location_t find_loop_location (struct loop *);
+
 #endif /* GCC_CFGLOOP_H */
diff --git a/gcc/profile-count.c b/gcc/profile-count.c
index 8c58f86..eaad18d 100644
--- a/gcc/profile-count.c
+++ b/gcc/profile-count.c
@@ -148,27 +148,47 @@ profile_count::stream_out (struct lto_output_stream *ob)
 void
 profile_probability::dump (FILE *f) const
 {
+  pretty_printer pp;
+  print (&pp);
+  fprintf (f, "%s", pp_formatted_text (&pp));
+}
+
+/* Print THIS to the PP.  */
+
+void
+profile_probability::print (pretty_printer *pp) const
+{
   if (!initialized_p ())
-    fprintf (f, "uninitialized");
+    pp_string (pp, "uninitialized");
   else
     {
       /* Make difference between 0.00 as a roundoff error and actual 0.
 	 Similarly for 1.  */
       if (m_val == 0)
-        fprintf (f, "never");
+        pp_string (pp, "never");
       else if (m_val == max_probability)
-        fprintf (f, "always");
+        pp_string (pp, "always");
       else
-        fprintf (f, "%3.1f%%", (double)m_val * 100 / max_probability);
+	pp_scalar (pp, "%3.1f%%", (double)m_val * 100 / max_probability);
       if (m_quality == profile_adjusted)
-	fprintf (f, " (adjusted)");
+	pp_string (pp, " (adjusted)");
       else if (m_quality == profile_afdo)
-	fprintf (f, " (auto FDO)");
+	pp_string (pp, " (auto FDO)");
       else if (m_quality == profile_guessed)
-	fprintf (f, " (guessed)");
+	pp_string (pp, " (guessed)");
     }
 }
 
+/* Dump THIS to the active dump destinations.  */
+
+void
+profile_probability::dump (const dump_metadata_t &metadata) const
+{
+  pretty_printer pp;
+  print (&pp);
+  dump_printf (metadata, "%s", pp_formatted_text (&pp));
+}
+
 /* Dump THIS to stderr.  */
 
 void
diff --git a/gcc/profile-count.h b/gcc/profile-count.h
index 96b7400..a761836 100644
--- a/gcc/profile-count.h
+++ b/gcc/profile-count.h
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3.  If not see
 
 struct function;
 class profile_count;
+class dump_metadata_t;
 
 /* Quality of the profile count.  Because gengtype does not support enums
    inside of classes, this is in global namespace.  */
@@ -561,6 +562,12 @@ public:
   /* Output THIS to F.  */
   void dump (FILE *f) const;
 
+  /* Output THIS to the active dump destinations.  */
+  void dump (const dump_metadata_t &) const;
+
+  /* Write THIS to PP.  */
+  void print (pretty_printer *pp) const;
+
   /* Print THIS to stderr.  */
   void debug () const;
 
diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c
index 30a2a9d..3fdbc57 100644
--- a/gcc/tree-ssa-loop-unswitch.c
+++ b/gcc/tree-ssa-loop-unswitch.c
@@ -281,8 +281,10 @@ tree_unswitch_single_loop (struct loop *loop, int num)
       /* 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 | TDF_DETAILS,
+			     find_loop_location (loop),
+			     ";; Not unswitching cold loops\n");
 	  return false;
 	}
 
@@ -290,8 +292,10 @@ tree_unswitch_single_loop (struct loop *loop, int num)
       if (tree_num_loop_insns (loop, &eni_size_weights)
 	  > (unsigned) PARAM_VALUE (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 | TDF_DETAILS,
+			     find_loop_location (loop),
+			     ";; Not unswitching, loop too big\n");
 	  return false;
 	}
 
@@ -302,9 +306,11 @@ tree_unswitch_single_loop (struct 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 | TDF_DETAILS,
+			     find_loop_location (loop),
+			     ";; Not unswitching, loop is not expected"
+			     " to iterate\n");
 	  return false;
 	}
     }
@@ -322,10 +328,11 @@ tree_unswitch_single_loop (struct loop *loop, int num)
 
       if (i == loop->num_nodes)
 	{
-	  if (dump_file
-	      && num > PARAM_VALUE (PARAM_MAX_UNSWITCH_LEVEL)
-	      && (dump_flags & TDF_DETAILS))
-	    fprintf (dump_file, ";; Not unswitching anymore, hit max level\n");
+	  if (dump_enabled_p ())
+	    if (num > PARAM_VALUE (PARAM_MAX_UNSWITCH_LEVEL))
+	      dump_printf_loc (MSG_MISSED_OPTIMIZATION | TDF_DETAILS,
+			       find_loop_location (loop),
+			       ";; Not unswitching anymore, hit max level\n");
 
 	  if (found == loop->num_nodes)
 	    {
@@ -447,8 +454,10 @@ tree_unswitch_single_loop (struct 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 | TDF_DETAILS,
+		     find_loop_location (loop),
+		     ";; Unswitching loop\n");
 
   initialize_original_copy_tables ();
   /* Unswitch the loop on this condition.  */
@@ -522,9 +531,11 @@ tree_unswitch_outer_loop (struct 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_printf_loc (MSG_MISSED_OPTIMIZATION | TDF_DETAILS,
+			 find_loop_location (loop),
+			 ";; Not unswitching, loop is not expected"
+			 " to iterate\n");
       return false;
     }
 
@@ -629,22 +640,27 @@ find_loop_guard (struct loop *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 | TDF_DETAILS,
+			 find_loop_location (loop),
+			 "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 | TDF_DETAILS,
+			 find_loop_location (loop),
+			 "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 | TDF_DETAILS, find_loop_location (loop),
+		     "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)
@@ -654,9 +670,10 @@ find_loop_guard (struct 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_MISSED_OPTIMIZATION | TDF_DETAILS, def,
+			     "  guard operands have definitions"
+			     " inside loop\n");
 	  return NULL;
 	}
     }
@@ -669,23 +686,28 @@ find_loop_guard (struct 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 | TDF_DETAILS,
+			     find_loop_location (loop),
+			     "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 | TDF_DETAILS,
+			     find_loop_location (loop),
+			     "  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_NOTE | TDF_DETAILS, find_loop_location (loop),
+		     "  suitable to hoist\n");
 end:
   if (body)
     free (body);
@@ -824,13 +846,15 @@ hoist_guard (struct 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))
+  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);
+      dump_printf_loc (MSG_NOTE | TDF_DETAILS, cond_stmt,
+		       "  Moving guard %i->%i (prob ",
+		       guard->src->index, guard->dest->index);
+      guard->probability.dump (MSG_NOTE | TDF_DETAILS);
+      dump_printf (MSG_NOTE | TDF_DETAILS,
+		   ") to bb %i, new preheader is %i\n",
+		   e->src->index, e->dest->index);
     }
 
   gcc_assert (loop_preheader_edge (loop)->src == e->dest);
@@ -859,14 +883,17 @@ hoist_guard (struct loop *loop, edge guard)
 
   if (skip_count > e->count ())
     {
-      fprintf (dump_file, "  Capping count; expect profile inconsistency\n");
+      if (dump_enabled_p ())
+	dump_printf_loc (MSG_NOTE | TDF_DETAILS, cond_stmt,
+			 "  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");
+      dump_printf_loc (MSG_NOTE | TDF_DETAILS, cond_stmt,
+		       "  Estimated probability of skipping loop is ");
+      new_edge->probability.dump (MSG_NOTE | TDF_DETAILS);
+      dump_printf (MSG_NOTE | TDF_DETAILS, "\n");
     }
 
   /* Update profile after the transform:
@@ -885,19 +912,22 @@ hoist_guard (struct 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:");
+  if (dump_enabled_p ())
+    dump_printf_loc (MSG_NOTE | TDF_DETAILS, find_loop_location (loop),
+		     "  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 (MSG_NOTE | TDF_DETAILS, " %i", bb->index);
 	  if (e->probability.initialized_p ())
             scale_bbs_frequencies (&bb, 1, e->probability);
   	}
     }
+  if (dump_enabled_p ())
+    dump_printf (MSG_NOTE | TDF_DETAILS, "\n");
 
   if (fix_dom_of_exit)
     set_immediate_dominator (CDI_DOMINATORS, exit->dest, pre_header);
@@ -924,8 +954,9 @@ hoist_guard (struct 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_OPTIMIZED_LOCATIONS | TDF_DETAILS,
+		     cond_stmt, "  guard hoisted.\n");
 
   free (body);
 }
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index d26b0f8..14489ba 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -1436,7 +1436,6 @@ extern void vect_loop_versioning (loop_vec_info, unsigned int, bool,
 extern struct loop *vect_do_peeling (loop_vec_info, tree, tree,
 				     tree *, tree *, tree *, int, bool, bool);
 extern void vect_prepare_for_masked_peels (loop_vec_info);
-extern dump_user_location_t find_loop_location (struct loop *);
 extern bool vect_can_advance_ivs_p (loop_vec_info);
 
 /* In tree-vect-stmts.c.  */
-- 
1.8.5.3

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] tree-ssa-loop-unswitch.c: port to the dump_* API (PR tree-optimization/88763)
  2019-01-10  1:55 [PATCH] tree-ssa-loop-unswitch.c: port to the dump_* API (PR tree-optimization/88763) David Malcolm
@ 2019-04-26 12:30 ` Richard Biener
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2019-04-26 12:30 UTC (permalink / raw)
  To: David Malcolm; +Cc: GCC Patches, Richard Biener

On Thu, Jan 10, 2019 at 2:55 AM David Malcolm <dmalcolm@redhat.com> wrote:
>
> PR tree-optimization/88763 reports difficulties in getting useful
> information from the log of tree-ssa-loop-unswitch.c.
>
> As work towards improving this, this patch eliminates all uses of
> dump_file from that source file, in favor of the dump API (to
> support -fopt-info* and -fsave-optimization-record).
>
> Doing so required adding a way to dump profile_probability instances,
> so the patch adds a profile_probability::dump overload for this.
>
> Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
>
> OK for next stage 1?

OK.

Thanks,
Richard.

> gcc/ChangeLog:
>         PR tree-optimization/88763
>         * cfgloop.h (find_loop_location): Move decl to here.
>         * profile-count.c (profile_probability::dump): Reimplement in
>         terms of...
>         (profile_probability::print): ...this new function, moving the
>         body here, and porting from FILE * to pretty_printer *.
>         (profile_probability::dump): New function.
>         * profile-count.h (class dump_metadata_t): New forward decl.
>         (profile_probability::print): New decl.
>         (profile_probability::dump): New overloaded decl.
>         * tree-ssa-loop-unswitch.c (tree_unswitch_single_loop): Port from
>         fprintf to the dump_* API.
>         (tree_unswitch_outer_loop): Likewise.
>         (find_loop_guard): Likewise.
>         (hoist_guard): Likewise.
>         * tree-vectorizer.h (find_loop_location): Move from here to
>         cfgloop.h.
> ---
>  gcc/cfgloop.h                |   3 +
>  gcc/profile-count.c          |  34 ++++++++---
>  gcc/profile-count.h          |   7 +++
>  gcc/tree-ssa-loop-unswitch.c | 135 ++++++++++++++++++++++++++-----------------
>  gcc/tree-vectorizer.h        |   1 -
>  5 files changed, 120 insertions(+), 60 deletions(-)
>
> diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h
> index 2e93af3..c175dcb 100644
> --- a/gcc/cfgloop.h
> +++ b/gcc/cfgloop.h
> @@ -870,4 +870,7 @@ gcov_type_to_wide_int (gcov_type val)
>
>    return widest_int::from_array (a, 2);
>  }
> +
> +extern dump_user_location_t find_loop_location (struct loop *);
> +
>  #endif /* GCC_CFGLOOP_H */
> diff --git a/gcc/profile-count.c b/gcc/profile-count.c
> index 8c58f86..eaad18d 100644
> --- a/gcc/profile-count.c
> +++ b/gcc/profile-count.c
> @@ -148,27 +148,47 @@ profile_count::stream_out (struct lto_output_stream *ob)
>  void
>  profile_probability::dump (FILE *f) const
>  {
> +  pretty_printer pp;
> +  print (&pp);
> +  fprintf (f, "%s", pp_formatted_text (&pp));
> +}
> +
> +/* Print THIS to the PP.  */
> +
> +void
> +profile_probability::print (pretty_printer *pp) const
> +{
>    if (!initialized_p ())
> -    fprintf (f, "uninitialized");
> +    pp_string (pp, "uninitialized");
>    else
>      {
>        /* Make difference between 0.00 as a roundoff error and actual 0.
>          Similarly for 1.  */
>        if (m_val == 0)
> -        fprintf (f, "never");
> +        pp_string (pp, "never");
>        else if (m_val == max_probability)
> -        fprintf (f, "always");
> +        pp_string (pp, "always");
>        else
> -        fprintf (f, "%3.1f%%", (double)m_val * 100 / max_probability);
> +       pp_scalar (pp, "%3.1f%%", (double)m_val * 100 / max_probability);
>        if (m_quality == profile_adjusted)
> -       fprintf (f, " (adjusted)");
> +       pp_string (pp, " (adjusted)");
>        else if (m_quality == profile_afdo)
> -       fprintf (f, " (auto FDO)");
> +       pp_string (pp, " (auto FDO)");
>        else if (m_quality == profile_guessed)
> -       fprintf (f, " (guessed)");
> +       pp_string (pp, " (guessed)");
>      }
>  }
>
> +/* Dump THIS to the active dump destinations.  */
> +
> +void
> +profile_probability::dump (const dump_metadata_t &metadata) const
> +{
> +  pretty_printer pp;
> +  print (&pp);
> +  dump_printf (metadata, "%s", pp_formatted_text (&pp));
> +}
> +
>  /* Dump THIS to stderr.  */
>
>  void
> diff --git a/gcc/profile-count.h b/gcc/profile-count.h
> index 96b7400..a761836 100644
> --- a/gcc/profile-count.h
> +++ b/gcc/profile-count.h
> @@ -23,6 +23,7 @@ along with GCC; see the file COPYING3.  If not see
>
>  struct function;
>  class profile_count;
> +class dump_metadata_t;
>
>  /* Quality of the profile count.  Because gengtype does not support enums
>     inside of classes, this is in global namespace.  */
> @@ -561,6 +562,12 @@ public:
>    /* Output THIS to F.  */
>    void dump (FILE *f) const;
>
> +  /* Output THIS to the active dump destinations.  */
> +  void dump (const dump_metadata_t &) const;
> +
> +  /* Write THIS to PP.  */
> +  void print (pretty_printer *pp) const;
> +
>    /* Print THIS to stderr.  */
>    void debug () const;
>
> diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c
> index 30a2a9d..3fdbc57 100644
> --- a/gcc/tree-ssa-loop-unswitch.c
> +++ b/gcc/tree-ssa-loop-unswitch.c
> @@ -281,8 +281,10 @@ tree_unswitch_single_loop (struct loop *loop, int num)
>        /* 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 | TDF_DETAILS,
> +                            find_loop_location (loop),
> +                            ";; Not unswitching cold loops\n");
>           return false;
>         }
>
> @@ -290,8 +292,10 @@ tree_unswitch_single_loop (struct loop *loop, int num)
>        if (tree_num_loop_insns (loop, &eni_size_weights)
>           > (unsigned) PARAM_VALUE (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 | TDF_DETAILS,
> +                            find_loop_location (loop),
> +                            ";; Not unswitching, loop too big\n");
>           return false;
>         }
>
> @@ -302,9 +306,11 @@ tree_unswitch_single_loop (struct 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 | TDF_DETAILS,
> +                            find_loop_location (loop),
> +                            ";; Not unswitching, loop is not expected"
> +                            " to iterate\n");
>           return false;
>         }
>      }
> @@ -322,10 +328,11 @@ tree_unswitch_single_loop (struct loop *loop, int num)
>
>        if (i == loop->num_nodes)
>         {
> -         if (dump_file
> -             && num > PARAM_VALUE (PARAM_MAX_UNSWITCH_LEVEL)
> -             && (dump_flags & TDF_DETAILS))
> -           fprintf (dump_file, ";; Not unswitching anymore, hit max level\n");
> +         if (dump_enabled_p ())
> +           if (num > PARAM_VALUE (PARAM_MAX_UNSWITCH_LEVEL))
> +             dump_printf_loc (MSG_MISSED_OPTIMIZATION | TDF_DETAILS,
> +                              find_loop_location (loop),
> +                              ";; Not unswitching anymore, hit max level\n");
>
>           if (found == loop->num_nodes)
>             {
> @@ -447,8 +454,10 @@ tree_unswitch_single_loop (struct 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 | TDF_DETAILS,
> +                    find_loop_location (loop),
> +                    ";; Unswitching loop\n");
>
>    initialize_original_copy_tables ();
>    /* Unswitch the loop on this condition.  */
> @@ -522,9 +531,11 @@ tree_unswitch_outer_loop (struct 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_printf_loc (MSG_MISSED_OPTIMIZATION | TDF_DETAILS,
> +                        find_loop_location (loop),
> +                        ";; Not unswitching, loop is not expected"
> +                        " to iterate\n");
>        return false;
>      }
>
> @@ -629,22 +640,27 @@ find_loop_guard (struct loop *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 | TDF_DETAILS,
> +                        find_loop_location (loop),
> +                        "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 | TDF_DETAILS,
> +                        find_loop_location (loop),
> +                        "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 | TDF_DETAILS, find_loop_location (loop),
> +                    "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)
> @@ -654,9 +670,10 @@ find_loop_guard (struct 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_MISSED_OPTIMIZATION | TDF_DETAILS, def,
> +                            "  guard operands have definitions"
> +                            " inside loop\n");
>           return NULL;
>         }
>      }
> @@ -669,23 +686,28 @@ find_loop_guard (struct 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 | TDF_DETAILS,
> +                            find_loop_location (loop),
> +                            "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 | TDF_DETAILS,
> +                            find_loop_location (loop),
> +                            "  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_NOTE | TDF_DETAILS, find_loop_location (loop),
> +                    "  suitable to hoist\n");
>  end:
>    if (body)
>      free (body);
> @@ -824,13 +846,15 @@ hoist_guard (struct 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))
> +  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);
> +      dump_printf_loc (MSG_NOTE | TDF_DETAILS, cond_stmt,
> +                      "  Moving guard %i->%i (prob ",
> +                      guard->src->index, guard->dest->index);
> +      guard->probability.dump (MSG_NOTE | TDF_DETAILS);
> +      dump_printf (MSG_NOTE | TDF_DETAILS,
> +                  ") to bb %i, new preheader is %i\n",
> +                  e->src->index, e->dest->index);
>      }
>
>    gcc_assert (loop_preheader_edge (loop)->src == e->dest);
> @@ -859,14 +883,17 @@ hoist_guard (struct loop *loop, edge guard)
>
>    if (skip_count > e->count ())
>      {
> -      fprintf (dump_file, "  Capping count; expect profile inconsistency\n");
> +      if (dump_enabled_p ())
> +       dump_printf_loc (MSG_NOTE | TDF_DETAILS, cond_stmt,
> +                        "  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");
> +      dump_printf_loc (MSG_NOTE | TDF_DETAILS, cond_stmt,
> +                      "  Estimated probability of skipping loop is ");
> +      new_edge->probability.dump (MSG_NOTE | TDF_DETAILS);
> +      dump_printf (MSG_NOTE | TDF_DETAILS, "\n");
>      }
>
>    /* Update profile after the transform:
> @@ -885,19 +912,22 @@ hoist_guard (struct 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:");
> +  if (dump_enabled_p ())
> +    dump_printf_loc (MSG_NOTE | TDF_DETAILS, find_loop_location (loop),
> +                    "  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 (MSG_NOTE | TDF_DETAILS, " %i", bb->index);
>           if (e->probability.initialized_p ())
>              scale_bbs_frequencies (&bb, 1, e->probability);
>         }
>      }
> +  if (dump_enabled_p ())
> +    dump_printf (MSG_NOTE | TDF_DETAILS, "\n");
>
>    if (fix_dom_of_exit)
>      set_immediate_dominator (CDI_DOMINATORS, exit->dest, pre_header);
> @@ -924,8 +954,9 @@ hoist_guard (struct 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_OPTIMIZED_LOCATIONS | TDF_DETAILS,
> +                    cond_stmt, "  guard hoisted.\n");
>
>    free (body);
>  }
> diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
> index d26b0f8..14489ba 100644
> --- a/gcc/tree-vectorizer.h
> +++ b/gcc/tree-vectorizer.h
> @@ -1436,7 +1436,6 @@ extern void vect_loop_versioning (loop_vec_info, unsigned int, bool,
>  extern struct loop *vect_do_peeling (loop_vec_info, tree, tree,
>                                      tree *, tree *, tree *, int, bool, bool);
>  extern void vect_prepare_for_masked_peels (loop_vec_info);
> -extern dump_user_location_t find_loop_location (struct loop *);
>  extern bool vect_can_advance_ivs_p (loop_vec_info);
>
>  /* In tree-vect-stmts.c.  */
> --
> 1.8.5.3
>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-04-26 12:26 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-10  1:55 [PATCH] tree-ssa-loop-unswitch.c: port to the dump_* API (PR tree-optimization/88763) David Malcolm
2019-04-26 12:30 ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).