diff mbox

Don't include DECL_UIDs in tree-sra fancy names for -fdump-final-insns= (PR c++/70594)

Message ID 20160413143225.GO19207@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek April 13, 2016, 2:32 p.m. UTC
On Wed, Apr 13, 2016 at 09:25:56AM +0200, Richard Biener wrote:
> So if you think it's not acceptable to drop the relation between
> the artificial number used by SRA and the original UID then go
> with a hash-map unconditionally.  You still have to dump and lookup
> the actual relation though - there's no way around this unless you
> hack dump-final-insns to filter DECL names (maybe just make it
> strip all DECL_ARTIFICIAL names completely?)

Here is an alternative patch, keep the fancy names as before,
but in TDF_NOUID dumps sanitize them.  Most of the DECL_NAMELESS
decls other than ones with the SRA fancy names should not contain
anything that would be tweaked for the printout, and doing it this
way has the advantage that one can always just use flags without TDF_NOUID
to see the real fancy names.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2016-04-13  Jakub Jelinek  <jakub@redhat.com>

	PR c++/70594
	* tree-sra.c (create_access_replacement,
	get_replaced_param_substitute): Set DECL_NAMELESS on repl if it
	gets fancy name.
	* tree-pretty-print.c (dump_fancy_name): New function.
	(dump_decl_name, dump_generic_node): Use it.



	Jakub

Comments

Richard Biener April 13, 2016, 7:18 p.m. UTC | #1
On April 13, 2016 4:32:25 PM GMT+02:00, Jakub Jelinek <jakub@redhat.com> wrote:
>On Wed, Apr 13, 2016 at 09:25:56AM +0200, Richard Biener wrote:
>> So if you think it's not acceptable to drop the relation between
>> the artificial number used by SRA and the original UID then go
>> with a hash-map unconditionally.  You still have to dump and lookup
>> the actual relation though - there's no way around this unless you
>> hack dump-final-insns to filter DECL names (maybe just make it
>> strip all DECL_ARTIFICIAL names completely?)
>
>Here is an alternative patch, keep the fancy names as before,
>but in TDF_NOUID dumps sanitize them.  Most of the DECL_NAMELESS
>decls other than ones with the SRA fancy names should not contain
>anything that would be tweaked for the printout, and doing it this
>way has the advantage that one can always just use flags without
>TDF_NOUID
>to see the real fancy names.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

>2016-04-13  Jakub Jelinek  <jakub@redhat.com>
>
>	PR c++/70594
>	* tree-sra.c (create_access_replacement,
>	get_replaced_param_substitute): Set DECL_NAMELESS on repl if it
>	gets fancy name.
>	* tree-pretty-print.c (dump_fancy_name): New function.
>	(dump_decl_name, dump_generic_node): Use it.
>
>--- gcc/tree-sra.c.jj	2016-04-12 19:12:34.000000000 +0200
>+++ gcc/tree-sra.c	2016-04-13 13:52:28.329925560 +0200
>@@ -2132,6 +2132,7 @@ create_access_replacement (struct access
>       bool fail = false;
> 
>       DECL_NAME (repl) = get_identifier (pretty_name);
>+      DECL_NAMELESS (repl) = 1;
>       obstack_free (&name_obstack, pretty_name);
> 
>       /* Get rid of any SSA_NAMEs embedded in debug_expr,
>@@ -4704,6 +4705,7 @@ get_replaced_param_substitute (struct ip
> 
>       repl = create_tmp_reg (TREE_TYPE (adj->base), "ISR");
>       DECL_NAME (repl) = get_identifier (pretty_name);
>+      DECL_NAMELESS (repl) = 1;
>       obstack_free (&name_obstack, pretty_name);
> 
>       adj->new_ssa_base = repl;
>--- gcc/tree-pretty-print.c.jj	2016-03-17 16:54:44.000000000 +0100
>+++ gcc/tree-pretty-print.c	2016-04-13 14:10:59.667085487 +0200
>@@ -161,6 +161,85 @@ print_generic_expr (FILE *file, tree t,
>   pp_flush (tree_pp);
> }
> 
>+/* Dump NAME, an IDENTIFIER_POINTER, sanitized so that D<num>
>sequences
>+   in it are replaced with Dxxxx, as long as they are at the start or
>+   preceded by $ and at the end or followed by $.  See make_fancy_name
>+   in tree-sra.c.  */
>+
>+static void
>+dump_fancy_name (pretty_printer *pp, tree name)
>+{
>+  int cnt = 0;
>+  int length = IDENTIFIER_LENGTH (name);
>+  const char *n = IDENTIFIER_POINTER (name);
>+  do
>+    {
>+      n = strchr (n, 'D');
>+      if (n == NULL)
>+	break;
>+      if (ISDIGIT (n[1])
>+	  && (n == IDENTIFIER_POINTER (name) || n[-1] == '$'))
>+	{
>+	  int l = 2;
>+	  while (ISDIGIT (n[l]))
>+	    l++;
>+	  if (n[l] == '\0' || n[l] == '$')
>+	    {
>+	      cnt++;
>+	      length += 5 - l;
>+	    }
>+	  n += l;
>+	}
>+      else
>+	n++;
>+    }
>+  while (1);
>+  if (cnt == 0)
>+    {
>+      pp_tree_identifier (pp, name);
>+      return;
>+    }
>+
>+  char *str = XNEWVEC (char, length + 1);
>+  char *p = str;
>+  const char *q;
>+  q = n = IDENTIFIER_POINTER (name);
>+  do
>+    {
>+      q = strchr (q, 'D');
>+      if (q == NULL)
>+	break;
>+      if (ISDIGIT (q[1])
>+	  && (q == IDENTIFIER_POINTER (name) || q[-1] == '$'))
>+	{
>+	  int l = 2;
>+	  while (ISDIGIT (q[l]))
>+	    l++;
>+	  if (q[l] == '\0' || q[l] == '$')
>+	    {
>+	      memcpy (p, n, q - n);
>+	      memcpy (p + (q - n), "Dxxxx", 5);
>+	      p += (q - n) + 5;
>+	      n = q + l;
>+	    }
>+	  q += l;
>+	}
>+      else
>+	q++;
>+    }
>+  while (1);
>+  memcpy (p, n, IDENTIFIER_LENGTH (name) - (n - IDENTIFIER_POINTER
>(name)));
>+  str[length] = '\0';
>+  if (pp_translate_identifiers (pp))
>+    {
>+      const char *text = identifier_to_locale (str);
>+      pp_append_text (pp, text, text + strlen (text));
>+    }
>+  else
>+    pp_append_text (pp, str, str + length);
>+  XDELETEVEC (str);
>+}
>+
> /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
>    in FLAGS.  */
> 
>@@ -171,6 +250,10 @@ dump_decl_name (pretty_printer *pp, tree
>     {
>       if ((flags & TDF_ASMNAME) && DECL_ASSEMBLER_NAME_SET_P (node))
> 	pp_tree_identifier (pp, DECL_ASSEMBLER_NAME (node));
>+      /* For DECL_NAMELESS names look for embedded uids in the
>+	 names and sanitize them for TDF_NOUID.  */
>+      else if ((flags & TDF_NOUID) && DECL_NAMELESS (node))
>+	dump_fancy_name (pp, DECL_NAME (node));
>       else
> 	pp_tree_identifier (pp, DECL_NAME (node));
>     }
>@@ -2593,8 +2676,15 @@ dump_generic_node (pretty_printer *pp, t
> 
>     case SSA_NAME:
>       if (SSA_NAME_IDENTIFIER (node))
>-	dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
>-			   spc, flags, false);
>+	{
>+	  if ((flags & TDF_NOUID)
>+	      && SSA_NAME_VAR (node)
>+	      && DECL_NAMELESS (SSA_NAME_VAR (node)))
>+	    dump_fancy_name (pp, SSA_NAME_IDENTIFIER (node));
>+	  else
>+	    dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
>+			       spc, flags, false);
>+	}
>       pp_underscore (pp);
>       pp_decimal_int (pp, SSA_NAME_VERSION (node));
>       if (SSA_NAME_IS_DEFAULT_DEF (node))
>
>
>	Jakub
diff mbox

Patch

--- gcc/tree-sra.c.jj	2016-04-12 19:12:34.000000000 +0200
+++ gcc/tree-sra.c	2016-04-13 13:52:28.329925560 +0200
@@ -2132,6 +2132,7 @@  create_access_replacement (struct access
       bool fail = false;
 
       DECL_NAME (repl) = get_identifier (pretty_name);
+      DECL_NAMELESS (repl) = 1;
       obstack_free (&name_obstack, pretty_name);
 
       /* Get rid of any SSA_NAMEs embedded in debug_expr,
@@ -4704,6 +4705,7 @@  get_replaced_param_substitute (struct ip
 
       repl = create_tmp_reg (TREE_TYPE (adj->base), "ISR");
       DECL_NAME (repl) = get_identifier (pretty_name);
+      DECL_NAMELESS (repl) = 1;
       obstack_free (&name_obstack, pretty_name);
 
       adj->new_ssa_base = repl;
--- gcc/tree-pretty-print.c.jj	2016-03-17 16:54:44.000000000 +0100
+++ gcc/tree-pretty-print.c	2016-04-13 14:10:59.667085487 +0200
@@ -161,6 +161,85 @@  print_generic_expr (FILE *file, tree t,
   pp_flush (tree_pp);
 }
 
+/* Dump NAME, an IDENTIFIER_POINTER, sanitized so that D<num> sequences
+   in it are replaced with Dxxxx, as long as they are at the start or
+   preceded by $ and at the end or followed by $.  See make_fancy_name
+   in tree-sra.c.  */
+
+static void
+dump_fancy_name (pretty_printer *pp, tree name)
+{
+  int cnt = 0;
+  int length = IDENTIFIER_LENGTH (name);
+  const char *n = IDENTIFIER_POINTER (name);
+  do
+    {
+      n = strchr (n, 'D');
+      if (n == NULL)
+	break;
+      if (ISDIGIT (n[1])
+	  && (n == IDENTIFIER_POINTER (name) || n[-1] == '$'))
+	{
+	  int l = 2;
+	  while (ISDIGIT (n[l]))
+	    l++;
+	  if (n[l] == '\0' || n[l] == '$')
+	    {
+	      cnt++;
+	      length += 5 - l;
+	    }
+	  n += l;
+	}
+      else
+	n++;
+    }
+  while (1);
+  if (cnt == 0)
+    {
+      pp_tree_identifier (pp, name);
+      return;
+    }
+
+  char *str = XNEWVEC (char, length + 1);
+  char *p = str;
+  const char *q;
+  q = n = IDENTIFIER_POINTER (name);
+  do
+    {
+      q = strchr (q, 'D');
+      if (q == NULL)
+	break;
+      if (ISDIGIT (q[1])
+	  && (q == IDENTIFIER_POINTER (name) || q[-1] == '$'))
+	{
+	  int l = 2;
+	  while (ISDIGIT (q[l]))
+	    l++;
+	  if (q[l] == '\0' || q[l] == '$')
+	    {
+	      memcpy (p, n, q - n);
+	      memcpy (p + (q - n), "Dxxxx", 5);
+	      p += (q - n) + 5;
+	      n = q + l;
+	    }
+	  q += l;
+	}
+      else
+	q++;
+    }
+  while (1);
+  memcpy (p, n, IDENTIFIER_LENGTH (name) - (n - IDENTIFIER_POINTER (name)));
+  str[length] = '\0';
+  if (pp_translate_identifiers (pp))
+    {
+      const char *text = identifier_to_locale (str);
+      pp_append_text (pp, text, text + strlen (text));
+    }
+  else
+    pp_append_text (pp, str, str + length);
+  XDELETEVEC (str);
+}
+
 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
    in FLAGS.  */
 
@@ -171,6 +250,10 @@  dump_decl_name (pretty_printer *pp, tree
     {
       if ((flags & TDF_ASMNAME) && DECL_ASSEMBLER_NAME_SET_P (node))
 	pp_tree_identifier (pp, DECL_ASSEMBLER_NAME (node));
+      /* For DECL_NAMELESS names look for embedded uids in the
+	 names and sanitize them for TDF_NOUID.  */
+      else if ((flags & TDF_NOUID) && DECL_NAMELESS (node))
+	dump_fancy_name (pp, DECL_NAME (node));
       else
 	pp_tree_identifier (pp, DECL_NAME (node));
     }
@@ -2593,8 +2676,15 @@  dump_generic_node (pretty_printer *pp, t
 
     case SSA_NAME:
       if (SSA_NAME_IDENTIFIER (node))
-	dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
-			   spc, flags, false);
+	{
+	  if ((flags & TDF_NOUID)
+	      && SSA_NAME_VAR (node)
+	      && DECL_NAMELESS (SSA_NAME_VAR (node)))
+	    dump_fancy_name (pp, SSA_NAME_IDENTIFIER (node));
+	  else
+	    dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
+			       spc, flags, false);
+	}
       pp_underscore (pp);
       pp_decimal_int (pp, SSA_NAME_VERSION (node));
       if (SSA_NAME_IS_DEFAULT_DEF (node))