Hi!

As discussed, e.g. gimplification of STATEMENT_LISTs can create extra
retval.N temporaries for -g and get the counts out of sync, similarly
the SAVE_EXPR change proposed in the fix for that PR could for decls
in the statement expressions or addresses thereof get the fancy names
counters out of sync.

The following patch marks the temporaries DECL_NAMELESS in addition to
DECL_IGNORED_P and in the dumps used for -fcompare-debug checking
prints those as D.xxxx rather than retval.234.

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

2018-03-06  Jakub Jelinek  <ja...@redhat.com>

        PR c++/84704
        * gimple-expr.c (create_tmp_var_raw): Set DECL_NAMELESS flag
        on tmp_var.
        * tree-pretty-print.c (dump_decl_name): For TDF_COMPARE_DEBUG,
        don't print names of DECL_NAMELESS DECL_IGNORED_P decls.

--- gcc/gimple-expr.c.jj        2018-01-14 17:16:55.693836137 +0100
+++ gcc/gimple-expr.c   2018-03-06 09:02:08.268188451 +0100
@@ -446,6 +446,9 @@ create_tmp_var_raw (tree type, const cha
   DECL_ARTIFICIAL (tmp_var) = 1;
   /* And we don't want debug info for it.  */
   DECL_IGNORED_P (tmp_var) = 1;
+  /* And we don't want even the fancy names of those printed in
+     -fdump-final-insns= dumps.  */
+  DECL_NAMELESS (tmp_var) = 1;
 
   /* Make the variable writable.  */
   TREE_READONLY (tmp_var) = 0;
--- gcc/tree-pretty-print.c.jj  2018-01-31 21:38:08.005050021 +0100
+++ gcc/tree-pretty-print.c     2018-03-06 09:13:08.026095230 +0100
@@ -247,21 +247,32 @@ dump_fancy_name (pretty_printer *pp, tre
 static void
 dump_decl_name (pretty_printer *pp, tree node, dump_flags_t flags)
 {
-  if (DECL_NAME (node))
+  tree name = DECL_NAME (node);
+  if (name)
     {
       if ((flags & TDF_ASMNAME)
          && HAS_DECL_ASSEMBLER_NAME_P (node)
          && DECL_ASSEMBLER_NAME_SET_P (node))
        pp_tree_identifier (pp, DECL_ASSEMBLER_NAME_RAW (node));
+      /* For -fcompare-debug don't dump DECL_NAMELESS names at all,
+        -g might have created more fancy names and their indexes
+        could get out of sync.  Usually those should be DECL_IGNORED_P
+        too, SRA can create even non-DECL_IGNORED_P DECL_NAMELESS fancy
+        names, let's hope those never get out of sync after doing the
+        dump_fancy_name sanitization.  */
+      else if ((flags & TDF_COMPARE_DEBUG)
+              && DECL_NAMELESS (node)
+              && DECL_IGNORED_P (node))
+       name = NULL_TREE;
       /* 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));
+       dump_fancy_name (pp, name);
       else
-       pp_tree_identifier (pp, DECL_NAME (node));
+       pp_tree_identifier (pp, name);
     }
   char uid_sep = (flags & TDF_GIMPLE) ? '_' : '.';
-  if ((flags & TDF_UID) || DECL_NAME (node) == NULL_TREE)
+  if ((flags & TDF_UID) || name == NULL_TREE)
     {
       if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1)
        pp_printf (pp, "L%c%d", uid_sep, (int) LABEL_DECL_UID (node));

        Jakub

Reply via email to