diff mbox

Print 2 digits after decimal delimiter for BB frequencies

Message ID ddc73e22-cf78-ef7d-db3e-88979bd6b523@suse.cz
State New
Headers show

Commit Message

Martin Liška Dec. 8, 2016, 12:55 p.m. UTC
With the patch applied, one can distinguish between PROB_VERY_UNLIKELY and
real zero probability:

f ()
{
  int _1;

  <bb 2> [100.00%]:
  _1 = __builtin_sprintf (&d2, "%i", 12);
  if (_1 != 2)
    goto <bb 3>; [0.04%]
  else
    goto <bb 4>; [99.96%]

  <bb 3> [0.04%]:
  __builtin_abort ();

  <bb 4> [99.96%]:
  return;

} 

Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.

Ready to be installed?
Martin

Comments

Martin Sebor Dec. 8, 2016, 4:39 p.m. UTC | #1
On 12/08/2016 05:55 AM, Martin Liška wrote:
> With the patch applied, one can distinguish between PROB_VERY_UNLIKELY and
> real zero probability:

I tried to see if formatting the expression

   e->probability * 100.0 / REG_BR_PROB_BASE

with "%.2f" is guaranteed to output non-zero when e->probability
is non-zero.  If I got the values right then the smallest non-zero
e->probability can be as low as 1, and REG_BR_PROB_BASE is 10000.
That evaluates to 0.0099999999999999985 which Glibc formats as
0.01 because (AFAIK) its printf rounds to nearest.

If this is guaranteed then I think it's fine.  Otherwise, if there
is a chance that the printed result could be 0.00% for a non-zero
probability it might be worth to detect it and make sure it's at
least 0.01% to avoid the same confusion I had with the 0.00%.

FWIW, if GCC uses integers rather than floats internally to make
decisions (I don't know) then also printing integers would give
the most accurate results.  E.g., something like
   printf ("%2u.%u%%", e->probability / 100, e->probability % 100)

Thanks
Martin

>
> f ()
> {
>   int _1;
>
>   <bb 2> [100.00%]:
>   _1 = __builtin_sprintf (&d2, "%i", 12);
>   if (_1 != 2)
>     goto <bb 3>; [0.04%]
>   else
>     goto <bb 4>; [99.96%]
>
>   <bb 3> [0.04%]:
>   __builtin_abort ();
>
>   <bb 4> [99.96%]:
>   return;
>
> }
>
> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>
> Ready to be installed?
> Martin
>
Jeff Law Dec. 14, 2016, 8:50 a.m. UTC | #2
On 12/08/2016 05:55 AM, Martin Liška wrote:
> With the patch applied, one can distinguish between PROB_VERY_UNLIKELY and
> real zero probability:
>
> f ()
> {
>   int _1;
>
>   <bb 2> [100.00%]:
>   _1 = __builtin_sprintf (&d2, "%i", 12);
>   if (_1 != 2)
>     goto <bb 3>; [0.04%]
>   else
>     goto <bb 4>; [99.96%]
>
>   <bb 3> [0.04%]:
>   __builtin_abort ();
>
>   <bb 4> [99.96%]:
>   return;
>
> }
>
> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>
> Ready to be installed?
> Martin
>
>
> 0001-Print-2-digits-after-decimal-delimiter-for-BB-freque.patch
>
>
> From 18f0fa35f91db675f5abf6a0aa8cf3582e79c772 Mon Sep 17 00:00:00 2001
> From: marxin <mliska@suse.cz>
> Date: Thu, 1 Dec 2016 10:55:55 +0100
> Subject: [PATCH] Print 2 digits after decimal delimiter for BB frequencies
>
> gcc/ChangeLog:
>
> 2016-12-01  Martin Liska  <mliska@suse.cz>
>
> 	* gimple-pretty-print.c (dump_edge_probability): Use newly
> 	defined PROBABILITY_FORMAT.
> 	(dump_gimple_label): Likewise.
> 	(dump_gimple_bb_header): Likewise.
>
> gcc/testsuite/ChangeLog:
>
> 2016-12-02  Martin Liska  <mliska@suse.cz>
>
> 	* gcc.dg/tree-ssa/20040703-1.c: Update scanned pattern.
> 	* gcc.dg/tree-ssa/dump-2.c: Likewise.
OK.
jeff
diff mbox

Patch

From 18f0fa35f91db675f5abf6a0aa8cf3582e79c772 Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Thu, 1 Dec 2016 10:55:55 +0100
Subject: [PATCH] Print 2 digits after decimal delimiter for BB frequencies

gcc/ChangeLog:

2016-12-01  Martin Liska  <mliska@suse.cz>

	* gimple-pretty-print.c (dump_edge_probability): Use newly
	defined PROBABILITY_FORMAT.
	(dump_gimple_label): Likewise.
	(dump_gimple_bb_header): Likewise.

gcc/testsuite/ChangeLog:

2016-12-02  Martin Liska  <mliska@suse.cz>

	* gcc.dg/tree-ssa/20040703-1.c: Update scanned pattern.
	* gcc.dg/tree-ssa/dump-2.c: Likewise.
---
 gcc/gimple-pretty-print.c                  | 12 +++++++++---
 gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/dump-2.c     |  2 +-
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c
index b5e866d..de57e89 100644
--- a/gcc/gimple-pretty-print.c
+++ b/gcc/gimple-pretty-print.c
@@ -72,12 +72,17 @@  debug_gimple_stmt (gimple *gs)
   print_gimple_stmt (stderr, gs, 0, TDF_VOPS|TDF_MEMSYMS);
 }
 
+/* Print format used for displaying probability of an edge or frequency
+   of a basic block.  */
+
+#define PROBABILITY_FORMAT "[%.2f%%]"
+
 /* Dump E probability to BUFFER.  */
 
 static void
 dump_edge_probability (pretty_printer *buffer, edge e)
 {
-  pp_scalar (buffer, " [%.1f%%]",
+  pp_scalar (buffer, " " PROBABILITY_FORMAT,
 	     e->probability * 100.0 / REG_BR_PROB_BASE);
 }
 
@@ -1023,7 +1028,7 @@  dump_gimple_label (pretty_printer *buffer, glabel *gs, int spc, int flags)
       dump_generic_node (buffer, label, spc, flags, false);
       basic_block bb = gimple_bb (gs);
       if (bb && !(flags & TDF_GIMPLE))
-	pp_scalar (buffer, " [%.1f%%]",
+	pp_scalar (buffer, " " PROBABILITY_FORMAT,
 		   bb->frequency * 100.0 / REG_BR_PROB_BASE);
       pp_colon (buffer);
     }
@@ -2590,7 +2595,8 @@  dump_gimple_bb_header (FILE *outf, basic_block bb, int indent, int flags)
 	  if (flags & TDF_GIMPLE)
 	    fprintf (outf, "%*sbb_%d:\n", indent, "", bb->index);
 	  else
-	    fprintf (outf, "%*s<bb %d> [%.1f%%]:\n", indent, "", bb->index,
+	    fprintf (outf, "%*s<bb %d> " PROBABILITY_FORMAT ":\n",
+		     indent, "", bb->index,
 		     bb->frequency * 100.0 / REG_BR_PROB_BASE);
 	}
     }
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c
index 2980047..eb9fb56 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20040703-1.c
@@ -9,4 +9,4 @@  float foo(float x)
 }
 
 /* We should *not* fold the arithmetic.  */
-/* { dg-final { scan-tree-dump-times "0\\.0\[^%\]" 0 "dom2"} } */
+/* { dg-final { scan-tree-dump-times "0\\.0\[^%0\]" 0 "dom2"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dump-2.c b/gcc/testsuite/gcc.dg/tree-ssa/dump-2.c
index 11cde92..8a63af4 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\\\.0%\\\]:" "optimized" } } */
+/* { dg-final { scan-tree-dump "<bb \[0-9\]> \\\[100\\\.00%\\\]:" "optimized" } } */
-- 
2.10.2