[PATCH] (v2) Tweaks to print_rtx_function

David Malcolm dmalcolm@redhat.com
Fri Oct 14 19:41:00 GMT 2016


On Thu, 2016-10-13 at 16:18 +0200, Bernd Schmidt wrote:
> On 10/13/2016 04:08 PM, David Malcolm wrote:
> > I thought it might be useful to brainstorm [1] some ideas on this,
> > so  here are various possible ways it could be printed for this use
> > -case:
> > 
> > * Offset by LAST_VIRTUAL_REGISTER + 1 (as in the patch), and
> > printed
> > just as a number, giving:
> > 
> >   (reg:SI 3)
> 
> Unambiguous in the compact format, nice low register numbers, but
> some
> potential for confusion with hard regs based on what people are used
> to.
> 
> > * Prefixed by a "sigil" character:
> 
>  >   (reg:SI %3)
> 
> Avoids the confusion issue and shouldn't overlap with hard register
> names. I think this is the one I prefer, followed by plain (reg:SI
> 3).
> 
> >   (reg:SI P3)
> 
> Can't use this, as there are machines with P3 registers.
> 
> > * Prefixed so it looks like a register name:
> > 
> >   (reg:SI pseudo-3)
> >   (reg:SI pseudo_3)
> >   (reg:SI pseudo+3)
> 
> Not too different from just a "%" prefix and probably too verbose.
> 
> > Looking at print_rtx_operand_code_r there are also things like
> > ORIGINAL_REGNO, REG_EXPR and REG_OFFSET which get printed after the
> > main regno, e.g.: >
> 
> >   (reg:SI 1 [ <retval> ])
> 
> That's the REG_EXPR here presumably? The interesting part comes when
> parsing this.

Indeed, but that seems like an issue for another patch...

Here's an updated version of the patch, which uses the '%' sigil for
non-virtual pseudos.

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

OK for trunk?

gcc/ChangeLog:
	* print-rtl-function.c (print_edge): Omit "(flags)" when none are
	set.
	(print_rtx_function): Update example in comment for...
	* print-rtl.c (print_rtx_operand_code_r): In compact mode, print
	non-virtual pseudos with a '%' sigil followed by the regno, offset
	by (LAST_VIRTUAL_REGISTER + 1), so that the first non-virtual
	pseudo is dumped as "%0".
---
 gcc/print-rtl-function.c | 29 ++++++++++++++++++-----------
 gcc/print-rtl.c          |  8 ++++++++
 2 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/gcc/print-rtl-function.c b/gcc/print-rtl-function.c
index 2abae84..f46304b 100644
--- a/gcc/print-rtl-function.c
+++ b/gcc/print-rtl-function.c
@@ -60,9 +60,11 @@ print_edge (FILE *outfile, edge e, bool from)
 
   /* Express edge flags as a string with " | " separator.
      e.g. (flags "FALLTHRU | DFS_BACK").  */
-  fprintf (outfile, " (flags \"");
-  bool seen_flag = false;
-#define DEF_EDGE_FLAG(NAME,IDX) \
+  if (e->flags)
+    {
+      fprintf (outfile, " (flags \"");
+      bool seen_flag = false;
+#define DEF_EDGE_FLAG(NAME,IDX)			\
   do {						\
     if (e->flags & EDGE_##NAME)			\
       {						\
@@ -75,7 +77,10 @@ print_edge (FILE *outfile, edge e, bool from)
 #include "cfg-flags.def"
 #undef DEF_EDGE_FLAG
 
-  fprintf (outfile, "\"))\n");
+      fprintf (outfile, "\")");
+    }
+
+  fprintf (outfile, ")\n");
 }
 
 /* If BB is non-NULL, print the start of a "(block)" directive for it
@@ -132,7 +137,9 @@ can_have_basic_block_p (const rtx_insn *insn)
    If COMPACT, then instructions are printed in a compact form:
    - INSN_UIDs are omitted, except for jumps and CODE_LABELs,
    - INSN_CODEs are omitted,
-   - register numbers are omitted for hard and virtual regs
+   - register numbers are omitted for hard and virtual regs, and
+     non-virtual pseudos are offset relative to the first such reg, and
+     printed with a '%' sigil e.g. "%0" for (LAST_VIRTUAL_REGISTER + 1),
    - insn names are prefixed with "c" (e.g. "cinsn", "cnote", etc)
 
    Example output (with COMPACT==true):
@@ -148,13 +155,13 @@ can_have_basic_block_p (const rtx_insn *insn)
 		       (reg:SI di [ i ])) "t.c":2
 		   (nil))
 	 (cnote NOTE_INSN_FUNCTION_BEG)
-	 (cinsn (set (reg:SI 89)
+	 (cinsn (set (reg:SI %2)
 		       (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars)
 			       (const_int -4)) [1 i+0 S4 A32])) "t.c":3
 		   (nil))
 	 (cinsn (parallel [
-			   (set (reg:SI 87 [ _2 ])
-			       (ashift:SI (reg:SI 89)
+			   (set (reg:SI %0 [ _2 ])
+			       (ashift:SI (reg:SI %2)
 				   (const_int 1)))
 			   (clobber (reg:CC flags))
 		       ]) "t.c":3
@@ -162,11 +169,11 @@ can_have_basic_block_p (const rtx_insn *insn)
 				   (const_int -4)) [1 i+0 S4 A32])
 			   (const_int 1))
 		       (nil)))
-	 (cinsn (set (reg:SI 88 [ <retval> ])
-		       (reg:SI 87 [ _2 ])) "t.c":3
+	 (cinsn (set (reg:SI %1 [ <retval> ])
+		       (reg:SI %0 [ _2 ])) "t.c":3
 		   (nil))
 	 (cinsn (set (reg/i:SI ax)
-		       (reg:SI 88 [ <retval> ])) "t.c":4
+		       (reg:SI %1 [ <retval> ])) "t.c":4
 		   (nil))
 	 (cinsn (use (reg/i:SI ax)) "t.c":4
 		   (nil))
diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c
index f114cb4..46f3c4d 100644
--- a/gcc/print-rtl.c
+++ b/gcc/print-rtl.c
@@ -400,6 +400,14 @@ print_rtx_operand_code_r (const_rtx in_rtx)
 #endif
     if (flag_dump_unnumbered && is_insn)
       fputc ('#', outfile);
+    else if (flag_compact)
+      {
+	/* In compact mode, print pseudos with a '%' sigil following
+	   by the regno, offset by (LAST_VIRTUAL_REGISTER + 1), so that the
+	   first non-virtual pseudo is dumped as "%0".  */
+	gcc_assert (regno > LAST_VIRTUAL_REGISTER);
+	fprintf (outfile, " %%%d", regno - (LAST_VIRTUAL_REGISTER + 1));
+      }
     else
       fprintf (outfile, " %d", regno);
 
-- 
1.8.5.3



More information about the Gcc-patches mailing list