re PR c++/84704 (internal compiler error: gimplification failed)
authorJakub Jelinek <jakub@redhat.com>
Wed, 7 Mar 2018 09:19:36 +0000 (10:19 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 7 Mar 2018 09:19:36 +0000 (10:19 +0100)
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.

From-SVN: r258317

gcc/ChangeLog
gcc/gimple-expr.c
gcc/tree-pretty-print.c

index 078a909..38d5535 100644 (file)
@@ -1,5 +1,11 @@
 2018-03-07  Jakub Jelinek  <jakub@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.
+
        PR middle-end/84723
        * multiple_target.c: Include tree-inline.h and intl.h.
        (expand_target_clones): Diagnose and fail if node->definition and
index 56caaca..d07c89b 100644 (file)
@@ -446,6 +446,9 @@ create_tmp_var_raw (tree type, const char *prefix)
   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;
index 73eb27c..276ad00 100644 (file)
@@ -247,21 +247,32 @@ dump_fancy_name (pretty_printer *pp, tree name)
 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));