> Hi.
>
> This is pre-approved patch that displays edge counts in dump files:
>
> ...
> _85 = _83 + _84;
> len_86 = SQRT (_85);
> if (_85 u>= 0.0)
> goto <bb 6>; [99.00%] [count: 778568]
> else
> goto <bb 5>; [1.00%] [count: 7864]
>
> <bb 5> [0.01%] [count: 7864]:
> sqrt (_85);
> ...
>
> That makes it possible to understand why a profile mismatch happens.
> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>
> Martin
>
> gcc/ChangeLog:
>
> 2017-06-12 Martin Liska <[email protected]>
>
> * gimple-pretty-print.c (dump_probability): Add new argument.
> (dump_edge_probability): Dump both probability and count.
> (dump_gimple_label): Likewise.
> (dump_gimple_bb_header): Likewise.
>
> gcc/testsuite/ChangeLog:
>
> 2017-06-12 Martin Liska <[email protected]>
>
> * gcc.dg/tree-ssa/builtin-sprintf-2.c: Adjust scanned pattern.
> * gcc.dg/tree-ssa/dump-2.c: Likewise.
> * gcc.dg/tree-ssa/vrp101.c: Likewise.
OK
Honza
> ---
> gcc/gimple-pretty-print.c | 22 ++++++++++++++--------
> gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c | 4 ++--
> gcc/testsuite/gcc.dg/tree-ssa/dump-2.c | 2 +-
> gcc/testsuite/gcc.dg/tree-ssa/vrp101.c | 2 +-
> 4 files changed, 18 insertions(+), 12 deletions(-)
>
>
> diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c
> index 5ff63a167a1..447921be036 100644
> --- a/gcc/gimple-pretty-print.c
> +++ b/gcc/gimple-pretty-print.c
> @@ -80,17 +80,22 @@ debug_gimple_stmt (gimple *gs)
> by xstrdup_for_dump. */
>
> static const char *
> -dump_probability (int value)
> +dump_probability (int frequency, profile_count &count)
> {
> float minimum = 0.01f;
>
> - gcc_assert (0 <= value && value <= REG_BR_PROB_BASE);
> - float fvalue = value * 100.0f / REG_BR_PROB_BASE;
> - if (fvalue < minimum && value > 0)
> + gcc_assert (0 <= frequency && frequency <= REG_BR_PROB_BASE);
> + float fvalue = frequency * 100.0f / REG_BR_PROB_BASE;
> + if (fvalue < minimum && frequency > 0)
> return "[0.01%]";
>
> char *buf;
> - asprintf (&buf, "[%.2f%%]", fvalue);
> + if (count.initialized_p ())
> + asprintf (&buf, "[%.2f%%] [count: %" PRId64 "]", fvalue,
> + count.to_gcov_type ());
> + else
> + asprintf (&buf, "[%.2f%%] [count: INV]", fvalue);
> +
> const char *ret = xstrdup_for_dump (buf);
> free (buf);
>
> @@ -102,7 +107,7 @@ dump_probability (int value)
> static void
> dump_edge_probability (pretty_printer *buffer, edge e)
> {
> - pp_scalar (buffer, " %s", dump_probability (e->probability));
> + pp_scalar (buffer, " %s", dump_probability (e->probability, e->count));
> }
>
> /* Print GIMPLE statement G to FILE using SPC indentation spaces and
> @@ -1085,7 +1090,7 @@ dump_gimple_label (pretty_printer *buffer, glabel *gs,
> int spc,
> dump_generic_node (buffer, label, spc, flags, false);
> basic_block bb = gimple_bb (gs);
> if (bb && !(flags & TDF_GIMPLE))
> - pp_scalar (buffer, " %s", dump_probability (bb->frequency));
> + pp_scalar (buffer, " %s", dump_probability (bb->frequency, bb->count));
> pp_colon (buffer);
> }
> if (flags & TDF_GIMPLE)
> @@ -2665,7 +2670,8 @@ dump_gimple_bb_header (FILE *outf, basic_block bb, int
> indent,
> fprintf (outf, "%*sbb_%d:\n", indent, "", bb->index);
> else
> fprintf (outf, "%*s<bb %d> %s:\n",
> - indent, "", bb->index, dump_probability (bb->frequency));
> + indent, "", bb->index, dump_probability (bb->frequency,
> + bb->count));
> }
> }
> }
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c
> b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c
> index 8a13f33d2a1..e15d88b7341 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-2.c
> @@ -290,7 +290,7 @@ RNG (0, 6, 8, "%s%ls", "1", L"2");
>
> /* Only conditional calls to must_not_eliminate must be made (with
> any probability):
> - { dg-final { scan-tree-dump-times "> \\\[\[0-9.\]+%\\\]:\n
> *must_not_eliminate" 127 "optimized" { target { ilp32 || lp64 } } } }
> - { dg-final { scan-tree-dump-times "> \\\[\[0-9.\]+%\\\]:\n
> *must_not_eliminate" 96 "optimized" { target { { ! ilp32 } && { ! lp64 } } }
> } }
> + { dg-final { scan-tree-dump-times "> \\\[\[0-9.\]+%\\\]\\
> \\\[count:\\[^:\\]*\\\]:\n *must_not_eliminate" 127 "optimized" { target {
> ilp32 || lp64 } } } }
> + { dg-final { scan-tree-dump-times "> \\\[\[0-9.\]+%\\\]\\
> \\\[count:\\[^:\\]*\\\]:\n *must_not_eliminate" 96 "optimized" { target { { !
> ilp32 } && { ! lp64 } } } } }
> No unconditional calls to abort should be made:
> { dg-final { scan-tree-dump-not ";\n *must_not_eliminate" "optimized" }
> } */
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dump-2.c
> b/gcc/testsuite/gcc.dg/tree-ssa/dump-2.c
> index 8a63af4e0ef..6ae2ef5bf39 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/dump-2.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/dump-2.c
> @@ -6,4 +6,4 @@ int f(void)
> return 0;
> }
>
> -/* { dg-final { scan-tree-dump "<bb \[0-9\]> \\\[100\\\.00%\\\]:"
> "optimized" } } */
> +/* { dg-final { scan-tree-dump "<bb \[0-9\]> \\\[100\\\.00%\\\] \\\[count:
> INV\\\]:" "optimized" } } */
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c
> b/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c
> index bf4109f7156..e7cad289763 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp101.c
> @@ -10,4 +10,4 @@ int main ()
> return 0;
> }
>
> -/* { dg-final { scan-tree-dump "<bb 2> \\\[\[0-9.\]+%\\\]:\[\n\r \]*return
> 0;" "optimized" } } */
> +/* { dg-final { scan-tree-dump "<bb 2> \\\[\[0-9.\]+%\\\] \\\[count:
> \\[^:\\]*\\\]:\[\n\r \]*return 0;" "optimized" } } */
>