Use -fopt-info in unswitch pass.
Commit Message
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(-)
Comments
On December 8, 2021 10:32:20 AM GMT+01:00, "Martin Liška" <mliska@suse.cz> wrote:
>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));
Can you please use loop_location as I told you elsewhere?
> /* 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");
That's going to be very noisy even for loops that have no unsiwtchung candidate. Please use MGS_NOTE because of that.
> 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");
Likewise.
> 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");
Likewise.
Otherwise looks OK.
Richard.
> 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);
> }
On 12/8/21 16:23, Richard Biener wrote:
> Likewise.
>
> Otherwise looks OK.
Fine, I fixed all the notes and installed the patch as df704591a2cad3526456aa77be403d21c822724d.
Cheers,
Martin
@@ -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
@@ -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;
@@ -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" } } */
@@ -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" } } */
-
@@ -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" } } */
@@ -49,4 +49,3 @@ int main()
return 0;
}
-
@@ -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. */
@@ -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);
}