OSDN Git Service

* gcc.target/i386/sse-13.c: Include <mm_malloc.h>
[pf3gnuchains/gcc-fork.git] / gcc / tree-pretty-print.c
index d1479e4..8b5f847 100644 (file)
@@ -1,12 +1,13 @@
 /* Pretty formatting of GENERIC trees in C syntax.
 /* Pretty formatting of GENERIC trees in C syntax.
-   Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+   Free Software Foundation, Inc.
    Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
    Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,16 +16,15 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
-#include "errors.h"
 #include "tree.h"
 #include "tree.h"
+#include "output.h"
 #include "diagnostic.h"
 #include "real.h"
 #include "hashtab.h"
 #include "diagnostic.h"
 #include "real.h"
 #include "hashtab.h"
@@ -32,17 +32,21 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "langhooks.h"
 #include "tree-iterator.h"
 #include "tree-chrec.h"
 #include "langhooks.h"
 #include "tree-iterator.h"
 #include "tree-chrec.h"
+#include "tree-pass.h"
+#include "fixed-value.h"
+#include "value-prof.h"
+#include "predict.h"
 
 /* Local functions, macros and variables.  */
 
 /* Local functions, macros and variables.  */
-static int op_prio (tree);
-static const char *op_symbol (tree);
+static int op_prio (const_tree);
+static const char *op_symbol (const_tree);
 static void pretty_print_string (pretty_printer *, const char*);
 static void pretty_print_string (pretty_printer *, const char*);
-static void print_call_name (pretty_printer *, tree);
+static void print_call_name (pretty_printer *, const_tree);
 static void newline_and_indent (pretty_printer *, int);
 static void maybe_init_pretty_print (FILE *);
 static void print_declaration (pretty_printer *, tree, int, int);
 static void newline_and_indent (pretty_printer *, int);
 static void maybe_init_pretty_print (FILE *);
 static void print_declaration (pretty_printer *, tree, int, int);
-static void print_struct_decl (pretty_printer *, tree, int, int);
-static void do_niy (pretty_printer *, tree);
+static void print_struct_decl (pretty_printer *, const_tree, int, int);
+static void do_niy (pretty_printer *, const_tree);
 static void dump_vops (pretty_printer *, tree, int, int);
 static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int);
 
 static void dump_vops (pretty_printer *, tree, int, int);
 static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int);
 
@@ -58,21 +62,20 @@ static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int);
 
 static pretty_printer buffer;
 static int initialized = 0;
 
 static pretty_printer buffer;
 static int initialized = 0;
-static bool dumping_stmts;
 
 /* Try to print something for an unknown tree code.  */
 
 static void
 
 /* Try to print something for an unknown tree code.  */
 
 static void
-do_niy (pretty_printer *buffer, tree node)
+do_niy (pretty_printer *buffer, const_tree node)
 {
   int i, len;
 
   pp_string (buffer, "<<< Unknown tree: ");
   pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
 
 {
   int i, len;
 
   pp_string (buffer, "<<< Unknown tree: ");
   pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
 
-  if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
+  if (EXPR_P (node))
     {
     {
-      len = first_rtl_op (TREE_CODE (node));
+      len = TREE_OPERAND_LENGTH (node);
       for (i = 0; i < len; ++i)
        {
          newline_and_indent (buffer, 2);
       for (i = 0; i < len; ++i)
        {
          newline_and_indent (buffer, 2);
@@ -83,17 +86,35 @@ do_niy (pretty_printer *buffer, tree node)
   pp_string (buffer, " >>>\n");
 }
 
   pp_string (buffer, " >>>\n");
 }
 
+/* Debugging function to print out a generic expression.  */
+
 void
 debug_generic_expr (tree t)
 {
 void
 debug_generic_expr (tree t)
 {
-  print_generic_expr (stderr, t, TDF_VOPS|TDF_UID);
+  print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
   fprintf (stderr, "\n");
 }
 
   fprintf (stderr, "\n");
 }
 
+/* Debugging function to print out a generic statement.  */
+
 void
 debug_generic_stmt (tree t)
 {
 void
 debug_generic_stmt (tree t)
 {
-  print_generic_stmt (stderr, t, TDF_VOPS|TDF_UID);
+  print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
+  fprintf (stderr, "\n");
+}
+
+/* Debugging function to print out a chain of trees .  */
+
+void
+debug_tree_chain (tree t)
+{
+  while (t)
+  {
+    print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
+    fprintf(stderr, " ");
+    t = TREE_CHAIN (t);
+  }
   fprintf (stderr, "\n");
 }
 
   fprintf (stderr, "\n");
 }
 
@@ -102,25 +123,23 @@ void
 print_generic_decl (FILE *file, tree decl, int flags)
 {
   maybe_init_pretty_print (file);
 print_generic_decl (FILE *file, tree decl, int flags)
 {
   maybe_init_pretty_print (file);
-  dumping_stmts = true;
   print_declaration (&buffer, decl, 2, flags);
   pp_write_text_to_stream (&buffer);
 }
 
 /* Print tree T, and its successors, on file FILE.  FLAGS specifies details
   print_declaration (&buffer, decl, 2, flags);
   pp_write_text_to_stream (&buffer);
 }
 
 /* Print tree T, and its successors, on file FILE.  FLAGS specifies details
-   to show in the dump.  See TDF_* in tree.h.  */
+   to show in the dump.  See TDF_* in tree-pass.h.  */
 
 void
 print_generic_stmt (FILE *file, tree t, int flags)
 {
   maybe_init_pretty_print (file);
 
 void
 print_generic_stmt (FILE *file, tree t, int flags)
 {
   maybe_init_pretty_print (file);
-  dumping_stmts = true;
   dump_generic_node (&buffer, t, 0, flags, true);
   pp_flush (&buffer);
 }
 
 /* Print tree T, and its successors, on file FILE.  FLAGS specifies details
   dump_generic_node (&buffer, t, 0, flags, true);
   pp_flush (&buffer);
 }
 
 /* Print tree T, and its successors, on file FILE.  FLAGS specifies details
-   to show in the dump.  See TDF_* in tree.h.  The output is indented by
+   to show in the dump.  See TDF_* in tree-pass.h.  The output is indented by
    INDENT spaces.  */
 
 void
    INDENT spaces.  */
 
 void
@@ -129,7 +148,6 @@ print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
   int i;
 
   maybe_init_pretty_print (file);
   int i;
 
   maybe_init_pretty_print (file);
-  dumping_stmts = true;
 
   for (i = 0; i < indent; i++)
     pp_space (&buffer);
 
   for (i = 0; i < indent; i++)
     pp_space (&buffer);
@@ -138,13 +156,12 @@ print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
 }
 
 /* Print a single expression T on file FILE.  FLAGS specifies details to show
 }
 
 /* Print a single expression T on file FILE.  FLAGS specifies details to show
-   in the dump.  See TDF_* in tree.h.  */
+   in the dump.  See TDF_* in tree-pass.h.  */
 
 void
 print_generic_expr (FILE *file, tree t, int flags)
 {
   maybe_init_pretty_print (file);
 
 void
 print_generic_expr (FILE *file, tree t, int flags)
 {
   maybe_init_pretty_print (file);
-  dumping_stmts = false;
   dump_generic_node (&buffer, t, 0, flags, false);
 }
 
   dump_generic_node (&buffer, t, 0, flags, false);
 }
 
@@ -154,21 +171,35 @@ print_generic_expr (FILE *file, tree t, int flags)
 static void
 dump_decl_name (pretty_printer *buffer, tree node, int flags)
 {
 static void
 dump_decl_name (pretty_printer *buffer, tree node, int flags)
 {
-  if (DECL_NAME (node))
-    pp_tree_identifier (buffer, DECL_NAME (node));
+  tree t = node;
 
 
+  if (DECL_NAME (t))
+    pp_tree_identifier (buffer, DECL_NAME (t));
   if ((flags & TDF_UID)
   if ((flags & TDF_UID)
-      || DECL_NAME (node) == NULL_TREE)
+      || DECL_NAME (t) == NULL_TREE)
     {
     {
-      if (TREE_CODE (node) == LABEL_DECL
-         && LABEL_DECL_UID (node) != -1)
-       pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
-                  LABEL_DECL_UID (node));
+      if (TREE_CODE (t) == LABEL_DECL
+          && LABEL_DECL_UID (t) != -1)
+        pp_printf (buffer, "L.%d", (int) LABEL_DECL_UID (t));
       else
       else
-       pp_printf (buffer, "<D%u>", DECL_UID (node));
+       {
+         char c = TREE_CODE (t) == CONST_DECL ? 'C' : 'D';
+         pp_printf (buffer, "%c.%u", c, DECL_UID (t));
+       }
     }
 }
 
     }
 }
 
+/* Like the above, but used for pretty printing function calls.  */
+
+static void
+dump_function_name (pretty_printer *buffer, tree node)
+{
+  if (DECL_NAME (node))
+    PRINT_FUNCTION_NAME (node);
+  else
+    dump_decl_name (buffer, node, 0);
+}
+
 /* Dump a function declaration.  NODE is the FUNCTION_TYPE.  BUFFER, SPC and
    FLAGS are as in dump_generic_node.  */
 
 /* Dump a function declaration.  NODE is the FUNCTION_TYPE.  BUFFER, SPC and
    FLAGS are as in dump_generic_node.  */
 
@@ -203,9 +234,211 @@ dump_function_declaration (pretty_printer *buffer, tree node,
   pp_character (buffer, ')');
 }
 
   pp_character (buffer, ')');
 }
 
+/* Dump the domain associated with an array.  */
+
+static void
+dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
+{
+  pp_character (buffer, '[');
+  if (domain)
+    {
+      tree min = TYPE_MIN_VALUE (domain);
+      tree max = TYPE_MAX_VALUE (domain);
+
+      if (min && max
+         && integer_zerop (min)
+         && host_integerp (max, 0))
+       pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1);
+      else
+       {
+         if (min)
+           dump_generic_node (buffer, min, spc, flags, false);
+         pp_character (buffer, ':');
+         if (max)
+           dump_generic_node (buffer, max, spc, flags, false);
+       }
+    }
+  else
+    pp_string (buffer, "<unknown>");
+  pp_character (buffer, ']');
+}
+
+
+/* Dump OpenMP clause CLAUSE.  BUFFER, CLAUSE, SPC and FLAGS are as in
+   dump_generic_node.  */
+
+static void
+dump_omp_clause (pretty_printer *buffer, tree clause, int spc, int flags)
+{
+  const char *name;
+
+  switch (OMP_CLAUSE_CODE (clause))
+    {
+    case OMP_CLAUSE_PRIVATE:
+      name = "private";
+      goto print_remap;
+    case OMP_CLAUSE_SHARED:
+      name = "shared";
+      goto print_remap;
+    case OMP_CLAUSE_FIRSTPRIVATE:
+      name = "firstprivate";
+      goto print_remap;
+    case OMP_CLAUSE_LASTPRIVATE:
+      name = "lastprivate";
+      goto print_remap;
+    case OMP_CLAUSE_COPYIN:
+      name = "copyin";
+      goto print_remap;
+    case OMP_CLAUSE_COPYPRIVATE:
+      name = "copyprivate";
+      goto print_remap;
+  print_remap:
+      pp_string (buffer, name);
+      pp_character (buffer, '(');
+      dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
+         spc, flags, false);
+      pp_character (buffer, ')');
+      break;
+
+    case OMP_CLAUSE_REDUCTION:
+      pp_string (buffer, "reduction(");
+      pp_string (buffer, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
+      pp_character (buffer, ':');
+      dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
+         spc, flags, false);
+      pp_character (buffer, ')');
+      break;
+
+    case OMP_CLAUSE_IF:
+      pp_string (buffer, "if(");
+      dump_generic_node (buffer, OMP_CLAUSE_IF_EXPR (clause),
+         spc, flags, false);
+      pp_character (buffer, ')');
+      break;
+
+    case OMP_CLAUSE_NUM_THREADS:
+      pp_string (buffer, "num_threads(");
+      dump_generic_node (buffer, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
+         spc, flags, false);
+      pp_character (buffer, ')');
+      break;
+
+    case OMP_CLAUSE_NOWAIT:
+      pp_string (buffer, "nowait");
+      break;
+    case OMP_CLAUSE_ORDERED:
+      pp_string (buffer, "ordered");
+      break;
+
+    case OMP_CLAUSE_DEFAULT:
+      pp_string (buffer, "default(");
+      switch (OMP_CLAUSE_DEFAULT_KIND (clause))
+       {
+      case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
+       break;
+      case OMP_CLAUSE_DEFAULT_SHARED:
+       pp_string (buffer, "shared");
+       break;
+      case OMP_CLAUSE_DEFAULT_NONE:
+       pp_string (buffer, "none");
+       break;
+      case OMP_CLAUSE_DEFAULT_PRIVATE:
+       pp_string (buffer, "private");
+       break;
+      default:
+       gcc_unreachable ();
+       }
+      pp_character (buffer, ')');
+      break;
+
+    case OMP_CLAUSE_SCHEDULE:
+      pp_string (buffer, "schedule(");
+      switch (OMP_CLAUSE_SCHEDULE_KIND (clause))
+       {
+      case OMP_CLAUSE_SCHEDULE_STATIC:
+       pp_string (buffer, "static");
+       break;
+      case OMP_CLAUSE_SCHEDULE_DYNAMIC:
+       pp_string (buffer, "dynamic");
+       break;
+      case OMP_CLAUSE_SCHEDULE_GUIDED:
+       pp_string (buffer, "guided");
+       break;
+      case OMP_CLAUSE_SCHEDULE_RUNTIME:
+       pp_string (buffer, "runtime");
+       break;
+      default:
+       gcc_unreachable ();
+       }
+      if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
+       {
+         pp_character (buffer, ',');
+         dump_generic_node (buffer,
+             OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
+             spc, flags, false);
+       }
+      pp_character (buffer, ')');
+      break;
+
+    default:
+      /* Should never happen.  */
+      dump_generic_node (buffer, clause, spc, flags, false);
+      break;
+    }
+}
+
+
+/* Dump the list of OpenMP clauses.  BUFFER, SPC and FLAGS are as in
+   dump_generic_node.  */
+
+static void
+dump_omp_clauses (pretty_printer *buffer, tree clause, int spc, int flags)
+{
+  if (clause == NULL)
+    return;
+
+  pp_space (buffer);
+  while (1)
+    {
+      dump_omp_clause (buffer, clause, spc, flags);
+      clause = OMP_CLAUSE_CHAIN (clause);
+      if (clause == NULL)
+       return;
+      pp_space (buffer);
+    }
+}
+
+
+/* Dump the set of decls SYMS.  BUFFER, SPC and FLAGS are as in
+   dump_generic_node.  */
+
+static void
+dump_symbols (pretty_printer *buffer, bitmap syms, int flags)
+{
+  unsigned i;
+  bitmap_iterator bi;
+
+  if (syms == NULL)
+    pp_string (buffer, "NIL");
+  else
+    {
+      pp_string (buffer, " { ");
+
+      EXECUTE_IF_SET_IN_BITMAP (syms, 0, i, bi)
+       {
+         tree sym = referenced_var_lookup (i);
+         dump_generic_node (buffer, sym, 0, flags, false);
+         pp_string (buffer, " ");
+       }
+
+      pp_string (buffer, "}");
+    }
+}
+
+
 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
-   FLAGS specifies details to show in the dump (see TDF_* in tree.h).  If
-   IS_STMT is true, the object printed is considered to be a statement
+   FLAGS specifies details to show in the dump (see TDF_* in tree-pass.h).
+   If IS_STMT is true, the object printed is considered to be a statement
    and it is terminated by ';' if appropriate.  */
 
 int
    and it is terminated by ';' if appropriate.  */
 
 int
@@ -220,17 +453,23 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
   if (node == NULL_TREE)
     return spc;
 
   if (node == NULL_TREE)
     return spc;
 
-  is_expr = EXPR_P (node);
+  is_expr = EXPR_P (node) || GIMPLE_STMT_P (node);
 
 
+  /* We use has_stmt_ann because CALL_EXPR can be both an expression
+     and a statement, and we have no guarantee that it will have a
+     stmt_ann when it is used as an RHS expression.  stmt_ann will assert
+     if you call it on something with a non-stmt annotation attached.  */
   if (TREE_CODE (node) != ERROR_MARK
       && is_gimple_stmt (node)
   if (TREE_CODE (node) != ERROR_MARK
       && is_gimple_stmt (node)
-      && (flags & TDF_VOPS)
-      && stmt_ann (node))
+      && (flags & (TDF_VOPS|TDF_MEMSYMS))
+      && has_stmt_ann (node)
+      && TREE_CODE (node) != PHI_NODE)
     dump_vops (buffer, node, spc, flags);
 
     dump_vops (buffer, node, spc, flags);
 
-  if (dumping_stmts
-      && (flags & TDF_LINENO)
-      && EXPR_HAS_LOCATION (node))
+  if (is_stmt && (flags & TDF_STMTADDR))
+    pp_printf (buffer, "<&%p> ", (void *)node);
+
+  if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
     {
       expanded_location xloc = expand_location (EXPR_LOCATION (node));
       pp_character (buffer, '[');
     {
       expanded_location xloc = expand_location (EXPR_LOCATION (node));
       pp_character (buffer, '[');
@@ -271,25 +510,39 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        }
       break;
 
        }
       break;
 
-    case TREE_VEC:
+    case TREE_BINFO:
       dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
       dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
-      break;
 
 
-    case BLOCK:
-      NIY;
+    case TREE_VEC:
+      {
+       size_t i;
+       if (TREE_VEC_LENGTH (node) > 0)
+         {
+           size_t len = TREE_VEC_LENGTH (node);
+           for (i = 0; i < len - 1; i++)
+             {     
+               dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
+                                  false);
+               pp_character (buffer, ',');
+               pp_space (buffer);
+             }
+           dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc, 
+                              flags, false);
+         }
+      }
       break;
 
     case VOID_TYPE:
     case INTEGER_TYPE:
     case REAL_TYPE:
       break;
 
     case VOID_TYPE:
     case INTEGER_TYPE:
     case REAL_TYPE:
+    case FIXED_POINT_TYPE:
     case COMPLEX_TYPE:
     case VECTOR_TYPE:
     case ENUMERAL_TYPE:
     case BOOLEAN_TYPE:
     case COMPLEX_TYPE:
     case VECTOR_TYPE:
     case ENUMERAL_TYPE:
     case BOOLEAN_TYPE:
-    case CHAR_TYPE:
       {
        unsigned int quals = TYPE_QUALS (node);
       {
        unsigned int quals = TYPE_QUALS (node);
-       char class;
+       enum tree_code_class class;
 
        if (quals & TYPE_QUAL_CONST)
          pp_string (buffer, "const ");
 
        if (quals & TYPE_QUAL_CONST)
          pp_string (buffer, "const ");
@@ -300,14 +553,14 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
        class = TREE_CODE_CLASS (TREE_CODE (node));
 
 
        class = TREE_CODE_CLASS (TREE_CODE (node));
 
-       if (class == 'd')
+       if (class == tcc_declaration)
          {
            if (DECL_NAME (node))
              dump_decl_name (buffer, node, flags);
            else
               pp_string (buffer, "<unnamed type decl>");
          }
          {
            if (DECL_NAME (node))
              dump_decl_name (buffer, node, flags);
            else
               pp_string (buffer, "<unnamed type decl>");
          }
-       else if (class == 't')
+       else if (class == tcc_type)
          {
            if (TYPE_NAME (node))
              {
          {
            if (TYPE_NAME (node))
              {
@@ -317,7 +570,21 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
                         && DECL_NAME (TYPE_NAME (node)))
                  dump_decl_name (buffer, TYPE_NAME (node), flags);
                else
                         && DECL_NAME (TYPE_NAME (node)))
                  dump_decl_name (buffer, TYPE_NAME (node), flags);
                else
-                  pp_string (buffer, "<unnamed type>");
+                 pp_string (buffer, "<unnamed type>");
+             }
+           else if (TREE_CODE (node) == VECTOR_TYPE)
+             {
+               pp_string (buffer, "vector ");
+               dump_generic_node (buffer, TREE_TYPE (node), 
+                                  spc, flags, false);
+             }
+           else if (TREE_CODE (node) == INTEGER_TYPE)
+             {
+               pp_string (buffer, (TYPE_UNSIGNED (node)
+                                   ? "<unnamed-unsigned:"
+                                   : "<unnamed-signed:"));
+               pp_decimal_int (buffer, TYPE_PRECISION (node));
+               pp_string (buffer, ">");
              }
            else
               pp_string (buffer, "<unnamed type>");
              }
            else
               pp_string (buffer, "<unnamed type>");
@@ -355,10 +622,13 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
          if (quals & TYPE_QUAL_CONST)
            pp_string (buffer, " const");
 
          if (quals & TYPE_QUAL_CONST)
            pp_string (buffer, " const");
-         else if (quals & TYPE_QUAL_VOLATILE)
-           pp_string (buffer,  "volatile");
-         else if (quals & TYPE_QUAL_RESTRICT)
+         if (quals & TYPE_QUAL_VOLATILE)
+           pp_string (buffer, volatile");
+         if (quals & TYPE_QUAL_RESTRICT)
            pp_string (buffer, " restrict");
            pp_string (buffer, " restrict");
+
+         if (TYPE_REF_CAN_ALIAS_ALL (node))
+           pp_string (buffer, " {ref-all}");
        }
       break;
 
        }
       break;
 
@@ -371,8 +641,62 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       pp_string (buffer, "::");
       break;
 
       pp_string (buffer, "::");
       break;
 
-    case FILE_TYPE:
-      NIY;
+    case TARGET_MEM_REF:
+      {
+       const char *sep = "";
+       tree tmp;
+
+       pp_string (buffer, "MEM[");
+
+       tmp = TMR_SYMBOL (node);
+       if (tmp)
+         {
+           pp_string (buffer, sep);
+           sep = ", ";
+           pp_string (buffer, "symbol: ");
+           dump_generic_node (buffer, tmp, spc, flags, false);
+         }
+       tmp = TMR_BASE (node);
+       if (tmp)
+         {
+           pp_string (buffer, sep);
+           sep = ", ";
+           pp_string (buffer, "base: ");
+           dump_generic_node (buffer, tmp, spc, flags, false);
+         }
+       tmp = TMR_INDEX (node);
+       if (tmp)
+         {
+           pp_string (buffer, sep);
+           sep = ", ";
+           pp_string (buffer, "index: ");
+           dump_generic_node (buffer, tmp, spc, flags, false);
+         }
+       tmp = TMR_STEP (node);
+       if (tmp)
+         {
+           pp_string (buffer, sep);
+           sep = ", ";
+           pp_string (buffer, "step: ");
+           dump_generic_node (buffer, tmp, spc, flags, false);
+         }
+       tmp = TMR_OFFSET (node);
+       if (tmp)
+         {
+           pp_string (buffer, sep);
+           sep = ", ";
+           pp_string (buffer, "offset: ");
+           dump_generic_node (buffer, tmp, spc, flags, false);
+         }
+       pp_string (buffer, "]");
+       if (flags & TDF_DETAILS)
+         {
+           pp_string (buffer, "{");
+           dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
+                              false);
+           pp_string (buffer, "}");
+         }
+      }
       break;
 
     case ARRAY_TYPE:
       break;
 
     case ARRAY_TYPE:
@@ -386,52 +710,34 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        dump_generic_node (buffer, tmp, spc, flags, false);
 
        /* Print the dimensions.  */
        dump_generic_node (buffer, tmp, spc, flags, false);
 
        /* Print the dimensions.  */
-       for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE;
-            tmp = TREE_TYPE (tmp))
-         {
-           tree domain = TYPE_DOMAIN (tmp);
-
-           pp_character (buffer, '[');
-           if (domain)
-             {
-               if (TYPE_MIN_VALUE (domain)
-                   && !integer_zerop (TYPE_MIN_VALUE (domain)))
-                 {
-                   dump_generic_node (buffer, TYPE_MIN_VALUE (domain),
-                                      spc, flags, false);
-                   pp_string (buffer, " .. ");
-                 }
-
-               if (TYPE_MAX_VALUE (domain))
-                 dump_generic_node (buffer, TYPE_MAX_VALUE (domain),
-                                    spc, flags, false);
-             }
-           else
-             pp_string (buffer, "<unknown>");
-
-           pp_character (buffer, ']');
-         }
+       for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
+         dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
        break;
       }
 
        break;
       }
 
-    case SET_TYPE:
-      NIY;
-      break;
-
     case RECORD_TYPE:
     case UNION_TYPE:
     case QUAL_UNION_TYPE:
     case RECORD_TYPE:
     case UNION_TYPE:
     case QUAL_UNION_TYPE:
-      /* Print the name of the structure.  */
-      if (TREE_CODE (node) == RECORD_TYPE)
-       pp_string (buffer, "struct ");
-      else if (TREE_CODE (node) == UNION_TYPE)
-       pp_string (buffer, "union ");
+      {
+       unsigned int quals = TYPE_QUALS (node);
 
 
-      if (TYPE_NAME (node))
-       dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
-      else
-       print_struct_decl (buffer, node, spc, flags);
-      break;
+       if (quals & TYPE_QUAL_CONST)
+         pp_string (buffer, "const ");
+       if (quals & TYPE_QUAL_VOLATILE)
+         pp_string (buffer, "volatile ");
+
+        /* Print the name of the structure.  */
+        if (TREE_CODE (node) == RECORD_TYPE)
+         pp_string (buffer, "struct ");
+        else if (TREE_CODE (node) == UNION_TYPE)
+         pp_string (buffer, "union ");
+
+        if (TYPE_NAME (node))
+         dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
+        else
+         print_struct_decl (buffer, node, spc, flags);
+        break;
+      }
 
     case LANG_TYPE:
       NIY;
 
     case LANG_TYPE:
       NIY;
@@ -466,25 +772,20 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       else if (! host_integerp (node, 0))
        {
          tree val = node;
       else if (! host_integerp (node, 0))
        {
          tree val = node;
+         unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (val);
+         HOST_WIDE_INT high = TREE_INT_CST_HIGH (val);
 
          if (tree_int_cst_sgn (val) < 0)
            {
              pp_character (buffer, '-');
 
          if (tree_int_cst_sgn (val) < 0)
            {
              pp_character (buffer, '-');
-             val = build_int_2 (-TREE_INT_CST_LOW (val),
-                                ~TREE_INT_CST_HIGH (val)
-                                + !TREE_INT_CST_LOW (val));
+             high = ~high + !low;
+             low = -low;
            }
          /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
             systems?  */
            }
          /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
             systems?  */
-         {
-           static char format[10]; /* "%x%09999x\0" */
-           if (!format[0])
-             sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
-           sprintf (pp_buffer (buffer)->digit_buffer, format,
-                    TREE_INT_CST_HIGH (val),
-                    TREE_INT_CST_LOW (val));
-           pp_string (buffer, pp_buffer (buffer)->digit_buffer);
-         }
+         sprintf (pp_buffer (buffer)->digit_buffer,
+                  HOST_WIDE_INT_PRINT_DOUBLE_HEX, high, low);
+         pp_string (buffer, pp_buffer (buffer)->digit_buffer);
        }
       else
        pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
        }
       else
        pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
@@ -500,7 +801,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
        d = TREE_REAL_CST (node);
        if (REAL_VALUE_ISINF (d))
 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
        d = TREE_REAL_CST (node);
        if (REAL_VALUE_ISINF (d))
-         pp_string (buffer, " Inf");
+         pp_string (buffer, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
        else if (REAL_VALUE_ISNAN (d))
          pp_string (buffer, " Nan");
        else
        else if (REAL_VALUE_ISNAN (d))
          pp_string (buffer, " Nan");
        else
@@ -521,6 +822,14 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        break;
       }
 
        break;
       }
 
+    case FIXED_CST:
+      {
+       char string[100];
+       fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
+       pp_string (buffer, string);
+       break;
+      }
+
     case COMPLEX_CST:
       pp_string (buffer, "__complex__ (");
       dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
     case COMPLEX_CST:
       pp_string (buffer, "__complex__ (");
       dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
@@ -561,10 +870,9 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       if (DECL_NAME (node))
        dump_decl_name (buffer, node, flags);
       else if (LABEL_DECL_UID (node) != -1)
       if (DECL_NAME (node))
        dump_decl_name (buffer, node, flags);
       else if (LABEL_DECL_UID (node) != -1)
-        pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
-                  LABEL_DECL_UID (node));
+        pp_printf (buffer, "<L%d>", (int) LABEL_DECL_UID (node));
       else
       else
-        pp_printf (buffer, "<D%u>", DECL_UID (node));
+        pp_printf (buffer, "<D.%u>", DECL_UID (node));
       break;
 
     case TYPE_DECL:
       break;
 
     case TYPE_DECL:
@@ -596,10 +904,14 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        }
       break;
 
        }
       break;
 
+    case SYMBOL_MEMORY_TAG:
+    case NAME_MEMORY_TAG:
+    case STRUCT_FIELD_TAG:
     case VAR_DECL:
     case PARM_DECL:
     case FIELD_DECL:
     case NAMESPACE_DECL:
     case VAR_DECL:
     case PARM_DECL:
     case FIELD_DECL:
     case NAMESPACE_DECL:
+    case MEMORY_PARTITION_TAG:
       dump_decl_name (buffer, node, flags);
       break;
 
       dump_decl_name (buffer, node, flags);
       break;
 
@@ -623,12 +935,15 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       pp_string (buffer, str);
       dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
 
       pp_string (buffer, str);
       dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
 
-      op0 = component_ref_field_offset (node);
-      if (op0 && TREE_CODE (op0) != INTEGER_CST)
+      if (TREE_CODE (op0) != VALUE_HANDLE)
        {
        {
-         pp_string (buffer, "{off: ");
-         dump_generic_node (buffer, op0, spc, flags, false);
-         pp_character (buffer, '}');
+         op0 = component_ref_field_offset (node);
+         if (op0 && TREE_CODE (op0) != INTEGER_CST)
+           {
+             pp_string (buffer, "{off: ");
+             dump_generic_node (buffer, op0, spc, flags, false);
+             pp_character (buffer, '}');
+           }
        }
       break;
 
        }
       break;
 
@@ -660,8 +975,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       op1 = array_ref_element_size (node);
 
       if (!integer_zerop (op0)
       op1 = array_ref_element_size (node);
 
       if (!integer_zerop (op0)
-         || (TYPE_SIZE_UNIT (TREE_TYPE (node))
-             && !operand_equal_p (op1, TYPE_SIZE_UNIT (TREE_TYPE (node)), 0)))
+         || TREE_OPERAND (node, 2)
+         || TREE_OPERAND (node, 3))
        {
          pp_string (buffer, "{lb: ");
          dump_generic_node (buffer, op0, spc, flags, false);
        {
          pp_string (buffer, "{lb: ");
          dump_generic_node (buffer, op0, spc, flags, false);
@@ -673,36 +988,29 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
     case CONSTRUCTOR:
       {
 
     case CONSTRUCTOR:
       {
-       tree lnode;
+       unsigned HOST_WIDE_INT ix;
+       tree field, val;
        bool is_struct_init = FALSE;
        pp_character (buffer, '{');
        bool is_struct_init = FALSE;
        pp_character (buffer, '{');
-       lnode = CONSTRUCTOR_ELTS (node);
        if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
            || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
          is_struct_init = TRUE;
        if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
            || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
          is_struct_init = TRUE;
-       while (lnode && lnode != error_mark_node)
+       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
          {
          {
-           tree val;
-           if (TREE_PURPOSE (lnode) && is_struct_init)
+           if (field && is_struct_init)
              {
                pp_character (buffer, '.');
              {
                pp_character (buffer, '.');
-               dump_generic_node (buffer, TREE_PURPOSE (lnode), spc, flags, false);
+               dump_generic_node (buffer, field, spc, flags, false);
                pp_string (buffer, "=");
              }
                pp_string (buffer, "=");
              }
-           val = TREE_VALUE (lnode);
            if (val && TREE_CODE (val) == ADDR_EXPR)
              if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
                val = TREE_OPERAND (val, 0);
            if (val && TREE_CODE (val) == FUNCTION_DECL)
            if (val && TREE_CODE (val) == ADDR_EXPR)
              if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
                val = TREE_OPERAND (val, 0);
            if (val && TREE_CODE (val) == FUNCTION_DECL)
-             {
                dump_decl_name (buffer, val, flags);
                dump_decl_name (buffer, val, flags);
-             }
            else
            else
-             {
-               dump_generic_node (buffer, TREE_VALUE (lnode), spc, flags, false);
-             }
-           lnode = TREE_CHAIN (lnode);
-           if (lnode && TREE_CODE (lnode) == TREE_LIST)
+               dump_generic_node (buffer, val, spc, flags, false);
+           if (ix != VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node)) - 1)
              {
                pp_character (buffer, ',');
                pp_space (buffer);
              {
                pp_character (buffer, ',');
                pp_space (buffer);
@@ -722,8 +1030,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
          }
 
        dump_generic_node (buffer, TREE_OPERAND (node, 0),
          }
 
        dump_generic_node (buffer, TREE_OPERAND (node, 0),
-                          spc, flags, dumping_stmts);
-       if (dumping_stmts)
+                          spc, flags, !(flags & TDF_SLIM));
+       if (flags & TDF_SLIM)
          newline_and_indent (buffer, spc);
        else
          {
          newline_and_indent (buffer, spc);
        else
          {
@@ -736,8 +1044,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
             tp = &TREE_OPERAND (*tp, 1))
          {
            dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
             tp = &TREE_OPERAND (*tp, 1))
          {
            dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
-                              spc, flags, dumping_stmts);
-           if (dumping_stmts)
+                              spc, flags, !(flags & TDF_SLIM));
+           if (flags & TDF_SLIM)
              newline_and_indent (buffer, spc);
            else
              {
              newline_and_indent (buffer, spc);
            else
              {
@@ -746,7 +1054,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
              }
          }
 
              }
          }
 
-       dump_generic_node (buffer, *tp, spc, flags, dumping_stmts);
+       dump_generic_node (buffer, *tp, spc, flags, !(flags & TDF_SLIM));
       }
       break;
 
       }
       break;
 
@@ -755,7 +1063,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        tree_stmt_iterator si;
        bool first = true;
 
        tree_stmt_iterator si;
        bool first = true;
 
-       if ((flags & TDF_SLIM) || !dumping_stmts)
+       if (flags & TDF_SLIM)
          {
            pp_string (buffer, "<STATEMENT_LIST>");
            break;
          {
            pp_string (buffer, "<STATEMENT_LIST>");
            break;
@@ -773,12 +1081,25 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       break;
 
     case MODIFY_EXPR:
       break;
 
     case MODIFY_EXPR:
+    case GIMPLE_MODIFY_STMT:
     case INIT_EXPR:
     case INIT_EXPR:
-      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 0), spc, flags,
+                        false);
       pp_space (buffer);
       pp_character (buffer, '=');
       pp_space (buffer);
       pp_character (buffer, '=');
+      if (TREE_CODE (node) == GIMPLE_MODIFY_STMT
+         && MOVE_NONTEMPORAL (node))
+       pp_string (buffer, "{nt}");
+      if (TREE_CODE (node) == GIMPLE_MODIFY_STMT)
+       {
+       stmt_ann_t ann;
+        if ((ann = stmt_ann (node))
+           && ann->has_volatile_ops)
+         pp_string (buffer, "{v}");
+        }
       pp_space (buffer);
       pp_space (buffer);
-      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 1), spc, flags,
+                        false);
       break;
 
     case TARGET_EXPR:
       break;
 
     case TARGET_EXPR:
@@ -803,14 +1124,21 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
          pp_character (buffer, ')');
          /* The lowered cond_exprs should always be printed in full.  */
          if (COND_EXPR_THEN (node)
          pp_character (buffer, ')');
          /* The lowered cond_exprs should always be printed in full.  */
          if (COND_EXPR_THEN (node)
-             && TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR
+             && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
+                 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
              && COND_EXPR_ELSE (node)
              && COND_EXPR_ELSE (node)
-             && TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR)
+             && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
+                 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
            {
              pp_space (buffer);
            {
              pp_space (buffer);
-             dump_generic_node (buffer, COND_EXPR_THEN (node), 0, flags, true);
-             pp_string (buffer, " else ");
-             dump_generic_node (buffer, COND_EXPR_ELSE (node), 0, flags, true);
+             dump_generic_node (buffer, COND_EXPR_THEN (node),
+                                0, flags, true);
+             if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
+               {
+                 pp_string (buffer, " else ");
+                 dump_generic_node (buffer, COND_EXPR_ELSE (node),
+                                    0, flags, true);
+               }
            }
          else if (!(flags & TDF_SLIM))
            {
            }
          else if (!(flags & TDF_SLIM))
            {
@@ -827,7 +1155,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
                }
 
              /* Output COND_EXPR_ELSE.  */
                }
 
              /* Output COND_EXPR_ELSE.  */
-             if (COND_EXPR_ELSE (node))
+             if (COND_EXPR_ELSE (node)
+                 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
                {
                  newline_and_indent (buffer, spc);
                  pp_string (buffer, "else");
                {
                  newline_and_indent (buffer, spc);
                  pp_string (buffer, "else");
@@ -885,12 +1214,31 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       /* Print parameters.  */
       pp_space (buffer);
       pp_character (buffer, '(');
       /* Print parameters.  */
       pp_space (buffer);
       pp_character (buffer, '(');
-      op1 = TREE_OPERAND (node, 1);
-      if (op1)
-       dump_generic_node (buffer, op1, spc, flags, false);
+      {
+       tree arg;
+       call_expr_arg_iterator iter;
+       FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
+         {
+           dump_generic_node (buffer, arg, spc, flags, false);
+           if (more_call_expr_args_p (&iter))
+             {
+               pp_character (buffer, ',');
+               pp_space (buffer);
+             }
+         }
+      }
+      if (CALL_EXPR_VA_ARG_PACK (node))
+       {
+         if (call_expr_nargs (node) > 0)
+           {
+             pp_character (buffer, ',');
+             pp_space (buffer);
+           }
+         pp_string (buffer, "__builtin_va_arg_pack ()");
+       }
       pp_character (buffer, ')');
 
       pp_character (buffer, ')');
 
-      op1 = TREE_OPERAND (node, 2);
+      op1 = CALL_EXPR_STATIC_CHAIN (node);
       if (op1)
        {
          pp_string (buffer, " [static-chain: ");
       if (op1)
        {
          pp_string (buffer, " [static-chain: ");
@@ -898,8 +1246,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
          pp_character (buffer, ']');
        }
 
          pp_character (buffer, ']');
        }
 
-      if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (node))
-       pp_string (buffer, " [return slot addr]");
+      if (CALL_EXPR_RETURN_SLOT_OPT (node))
+       pp_string (buffer, " [return slot optimization]");
       if (CALL_EXPR_TAILCALL (node))
        pp_string (buffer, " [tail call]");
       break;
       if (CALL_EXPR_TAILCALL (node))
        pp_string (buffer, " [tail call]");
       break;
@@ -921,8 +1269,11 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       break;
 
       /* Binary arithmetic and logic expressions.  */
       break;
 
       /* Binary arithmetic and logic expressions.  */
+    case WIDEN_SUM_EXPR:
+    case WIDEN_MULT_EXPR:
     case MULT_EXPR:
     case PLUS_EXPR:
     case MULT_EXPR:
     case PLUS_EXPR:
+    case POINTER_PLUS_EXPR:
     case MINUS_EXPR:
     case TRUNC_DIV_EXPR:
     case CEIL_DIV_EXPR:
     case MINUS_EXPR:
     case TRUNC_DIV_EXPR:
     case CEIL_DIV_EXPR:
@@ -938,6 +1289,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
     case RSHIFT_EXPR:
     case LROTATE_EXPR:
     case RROTATE_EXPR:
     case RSHIFT_EXPR:
     case LROTATE_EXPR:
     case RROTATE_EXPR:
+    case VEC_LSHIFT_EXPR:
+    case VEC_RSHIFT_EXPR:
     case BIT_IOR_EXPR:
     case BIT_XOR_EXPR:
     case BIT_AND_EXPR:
     case BIT_IOR_EXPR:
     case BIT_XOR_EXPR:
     case BIT_AND_EXPR:
@@ -967,7 +1320,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
        /* When the operands are expressions with less priority,
           keep semantics of the tree representation.  */
 
        /* When the operands are expressions with less priority,
           keep semantics of the tree representation.  */
-       if (op_prio (op0) < op_prio (node))
+       if (op_prio (op0) <= op_prio (node))
          {
            pp_character (buffer, '(');
            dump_generic_node (buffer, op0, spc, flags, false);
          {
            pp_character (buffer, '(');
            dump_generic_node (buffer, op0, spc, flags, false);
@@ -982,7 +1335,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
        /* When the operands are expressions with less priority,
           keep semantics of the tree representation.  */
 
        /* When the operands are expressions with less priority,
           keep semantics of the tree representation.  */
-       if (op_prio (op1) < op_prio (node))
+       if (op_prio (op1) <= op_prio (node))
          {
            pp_character (buffer, '(');
            dump_generic_node (buffer, op1, spc, flags, false);
          {
            pp_character (buffer, '(');
            dump_generic_node (buffer, op1, spc, flags, false);
@@ -1000,6 +1353,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
     case ADDR_EXPR:
     case PREDECREMENT_EXPR:
     case PREINCREMENT_EXPR:
     case ADDR_EXPR:
     case PREDECREMENT_EXPR:
     case PREINCREMENT_EXPR:
+    case ALIGN_INDIRECT_REF:
+    case MISALIGNED_INDIRECT_REF:
     case INDIRECT_REF:
       if (TREE_CODE (node) == ADDR_EXPR
          && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
     case INDIRECT_REF:
       if (TREE_CODE (node) == ADDR_EXPR
          && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
@@ -1016,6 +1371,13 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        }
       else
        dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
        }
       else
        dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+
+      if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
+        {
+          pp_string (buffer, "{misalignment: ");
+          dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+          pp_character (buffer, '}');
+        }
       break;
 
     case POSTDECREMENT_EXPR:
       break;
 
     case POSTDECREMENT_EXPR:
@@ -1057,10 +1419,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       NIY;
       break;
 
       NIY;
       break;
 
+    case FIXED_CONVERT_EXPR:
     case FIX_TRUNC_EXPR:
     case FIX_TRUNC_EXPR:
-    case FIX_CEIL_EXPR:
-    case FIX_FLOOR_EXPR:
-    case FIX_ROUND_EXPR:
     case FLOAT_EXPR:
     case CONVERT_EXPR:
     case NOP_EXPR:
     case FLOAT_EXPR:
     case CONVERT_EXPR:
     case NOP_EXPR:
@@ -1070,7 +1430,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        {
          pp_character (buffer, '(');
          dump_generic_node (buffer, type, spc, flags, false);
        {
          pp_character (buffer, '(');
          dump_generic_node (buffer, type, spc, flags, false);
-         pp_string (buffer, ")");
+         pp_string (buffer, ") ");
        }
       if (op_prio (op0) < op_prio (node))
        pp_character (buffer, '(');
        }
       if (op_prio (op0) < op_prio (node))
        pp_character (buffer, '(');
@@ -1087,6 +1447,12 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       pp_character (buffer, ')');
       break;
 
       pp_character (buffer, ')');
       break;
 
+    case PAREN_EXPR:
+      pp_string (buffer, "((");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, "))");
+      break;
+
     case NON_LVALUE_EXPR:
       pp_string (buffer, "NON_LVALUE_EXPR <");
       dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
     case NON_LVALUE_EXPR:
       pp_string (buffer, "NON_LVALUE_EXPR <");
       dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
@@ -1099,10 +1465,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       pp_character (buffer, '>');
       break;
 
       pp_character (buffer, '>');
       break;
 
-    case ENTRY_VALUE_EXPR:
-      NIY;
-      break;
-
     case COMPLEX_EXPR:
       pp_string (buffer, "COMPLEX_EXPR <");
       dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
     case COMPLEX_EXPR:
       pp_string (buffer, "COMPLEX_EXPR <");
       dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
@@ -1182,6 +1544,17 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       is_expr = false;
       break;
 
       is_expr = false;
       break;
 
+    case CHANGE_DYNAMIC_TYPE_EXPR:
+      pp_string (buffer, "<<<change_dynamic_type (");
+      dump_generic_node (buffer, CHANGE_DYNAMIC_TYPE_NEW_TYPE (node), spc + 2,
+                        flags, false);
+      pp_string (buffer, ") ");
+      dump_generic_node (buffer, CHANGE_DYNAMIC_TYPE_LOCATION (node), spc + 2,
+                        flags, false);
+      pp_string (buffer, ")>>>");
+      is_expr = false;
+      break;
+
     case LABEL_EXPR:
       op0 = TREE_OPERAND (node, 0);
       /* If this is for break or continue, don't bother printing it.  */
     case LABEL_EXPR:
       op0 = TREE_OPERAND (node, 0);
       /* If this is for break or continue, don't bother printing it.  */
@@ -1198,48 +1571,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        pp_string (buffer, " [non-local]");
       break;
 
        pp_string (buffer, " [non-local]");
       break;
 
-    case LABELED_BLOCK_EXPR:
-      op0 = LABELED_BLOCK_LABEL (node);
-      /* If this is for break or continue, don't bother printing it.  */
-      if (DECL_NAME (op0))
-       {
-         const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
-         if (strcmp (name, "break") == 0
-             || strcmp (name, "continue") == 0)
-           {
-             dump_generic_node (buffer, LABELED_BLOCK_BODY (node), spc, flags, false);
-             break;
-           }
-       }
-      dump_generic_node (buffer, LABELED_BLOCK_LABEL (node), spc, flags, false);
-      pp_string (buffer, ": {");
-      if (!(flags & TDF_SLIM))
-       newline_and_indent (buffer, spc+2);
-      dump_generic_node (buffer, LABELED_BLOCK_BODY (node), spc+2, flags, true);
-      if (!flags)
-       newline_and_indent (buffer, spc);
-      pp_character (buffer, '}');
-      is_expr = false;
-      break;
-
-    case EXIT_BLOCK_EXPR:
-      op0 = LABELED_BLOCK_LABEL (EXIT_BLOCK_LABELED_BLOCK (node));
-      /* If this is for a break or continue, print it accordingly.  */
-      if (DECL_NAME (op0))
-       {
-         const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
-         if (strcmp (name, "break") == 0
-             || strcmp (name, "continue") == 0)
-           {
-             pp_string (buffer, name);
-             break;
-           }
-       }
-      pp_string (buffer, "<<<exit block ");
-      dump_generic_node (buffer, op0, spc, flags, false);
-      pp_string (buffer, ">>>");
-      break;
-
     case EXC_PTR_EXPR:
       pp_string (buffer, "<<<exception object>>>");
       break;
     case EXC_PTR_EXPR:
       pp_string (buffer, "<<<exception object>>>");
       break;
@@ -1262,14 +1593,26 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       is_expr = false;
       break;
 
       is_expr = false;
       break;
 
+    case PREDICT_EXPR:
+      pp_string (buffer, "// predicted ");
+      if (PREDICT_EXPR_OUTCOME (node))
+        pp_string (buffer, "likely by ");
+      else
+        pp_string (buffer, "unlikely by ");
+      pp_string (buffer, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
+      pp_string (buffer, " predictor.");
+      break;
+
     case RETURN_EXPR:
       pp_string (buffer, "return");
       op0 = TREE_OPERAND (node, 0);
       if (op0)
        {
          pp_space (buffer);
     case RETURN_EXPR:
       pp_string (buffer, "return");
       op0 = TREE_OPERAND (node, 0);
       if (op0)
        {
          pp_space (buffer);
-         if (TREE_CODE (op0) == MODIFY_EXPR)
-           dump_generic_node (buffer, TREE_OPERAND (op0, 1), spc, flags, false);
+         if (TREE_CODE (op0) == MODIFY_EXPR
+             || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
+           dump_generic_node (buffer, GENERIC_TREE_OPERAND (op0, 1),
+                              spc, flags, false);
          else
            dump_generic_node (buffer, op0, spc, flags, false);
        }
          else
            dump_generic_node (buffer, op0, spc, flags, false);
        }
@@ -1292,7 +1635,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
          if (SWITCH_BODY (node))
            {
              newline_and_indent (buffer, spc+4);
          if (SWITCH_BODY (node))
            {
              newline_and_indent (buffer, spc+4);
-             dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags, true);
+             dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags,
+                                true);
            }
          else
            {
            }
          else
            {
@@ -1302,10 +1646,16 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
                {
                  tree elt = TREE_VEC_ELT (vec, i);
                  newline_and_indent (buffer, spc+4);
                {
                  tree elt = TREE_VEC_ELT (vec, i);
                  newline_and_indent (buffer, spc+4);
-                 dump_generic_node (buffer, elt, spc+4, flags, false);
-                 pp_string (buffer, " goto ");
-                 dump_generic_node (buffer, CASE_LABEL (elt), spc+4, flags, true);
-                 pp_semicolon (buffer);
+                 if (elt)
+                   {
+                     dump_generic_node (buffer, elt, spc+4, flags, false);
+                     pp_string (buffer, " goto ");
+                     dump_generic_node (buffer, CASE_LABEL (elt), spc+4,
+                                        flags, true);
+                     pp_semicolon (buffer);
+                   }
+                 else
+                   pp_string (buffer, "case ???: goto ???;");
                }
            }
          newline_and_indent (buffer, spc+2);
                }
            }
          newline_and_indent (buffer, spc+2);
@@ -1316,9 +1666,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
     case GOTO_EXPR:
       op0 = GOTO_DESTINATION (node);
 
     case GOTO_EXPR:
       op0 = GOTO_DESTINATION (node);
-      if (TREE_CODE (op0) != SSA_NAME
-         && DECL_P (op0)
-         && DECL_NAME (op0))
+      if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
        {
          const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
          if (strcmp (name, "break") == 0
        {
          const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
          if (strcmp (name, "break") == 0
@@ -1333,8 +1681,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       break;
 
     case RESX_EXPR:
       break;
 
     case RESX_EXPR:
-      pp_string (buffer, "resx");
-      /* ??? Any sensible way to present the eh region?  */
+      pp_string (buffer, "resx ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
       break;
 
     case ASM_EXPR:
       break;
 
     case ASM_EXPR:
@@ -1399,7 +1747,10 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
            if (i < PHI_NUM_ARGS (node) - 1)
              pp_string (buffer, ", ");
          }
            if (i < PHI_NUM_ARGS (node) - 1)
              pp_string (buffer, ", ");
          }
-       pp_string (buffer, ">;");
+       pp_string (buffer, ">");
+
+       if (stmt_references_memory_p (node) && (flags & TDF_MEMSYMS))
+         dump_symbols (buffer, STORED_SYMS (node), flags);
       }
       break;
 
       }
       break;
 
@@ -1407,6 +1758,10 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
       pp_string (buffer, "_");
       pp_decimal_int (buffer, SSA_NAME_VERSION (node));
       dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
       pp_string (buffer, "_");
       pp_decimal_int (buffer, SSA_NAME_VERSION (node));
+      if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
+       pp_string (buffer, "(ab)");
+      else if (SSA_NAME_IS_DEFAULT_DEF (node))
+       pp_string (buffer, "(D)");
       break;
 
     case WITH_SIZE_EXPR:
       break;
 
     case WITH_SIZE_EXPR:
@@ -1421,9 +1776,17 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
       break;
 
       pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
       break;
 
-    case SCEV_KNOWN:
-      pp_string (buffer, "scev_known");
-      break;
+    case ASSERT_EXPR:
+      pp_string (buffer, "ASSERT_EXPR <");
+      dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
+      pp_string (buffer, ">");
+      break;
+
+    case SCEV_KNOWN:
+      pp_string (buffer, "scev_known");
+      break;
 
     case SCEV_NOT_KNOWN:
       pp_string (buffer, "scev_not_known");
 
     case SCEV_NOT_KNOWN:
       pp_string (buffer, "scev_not_known");
@@ -1439,13 +1802,388 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       is_stmt = false;
       break;
 
       is_stmt = false;
       break;
 
+    case REALIGN_LOAD_EXPR:
+      pp_string (buffer, "REALIGN_LOAD <");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
+      pp_string (buffer, ">");
+      break;
+      
+    case VEC_COND_EXPR:
+      pp_string (buffer, " VEC_COND_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, " , ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " , ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case DOT_PROD_EXPR:
+      pp_string (buffer, " DOT_PROD_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case OMP_PARALLEL:
+      pp_string (buffer, "#pragma omp parallel");
+      dump_omp_clauses (buffer, OMP_PARALLEL_CLAUSES (node), spc, flags);
+      if (OMP_PARALLEL_FN (node))
+       {
+         pp_string (buffer, " [child fn: ");
+         dump_generic_node (buffer, OMP_PARALLEL_FN (node), spc, flags, false);
+
+         pp_string (buffer, " (");
+
+         if (OMP_PARALLEL_DATA_ARG (node))
+           dump_generic_node (buffer, OMP_PARALLEL_DATA_ARG (node), spc, flags,
+                              false);
+         else
+           pp_string (buffer, "???");
+
+         pp_string (buffer, ")]");
+       }
+
+    dump_omp_body:
+      if (!(flags & TDF_SLIM) && OMP_BODY (node))
+       {
+         newline_and_indent (buffer, spc + 2);
+         pp_character (buffer, '{');
+         newline_and_indent (buffer, spc + 4);
+         dump_generic_node (buffer, OMP_BODY (node), spc + 4, flags, false);
+         newline_and_indent (buffer, spc + 2);
+         pp_character (buffer, '}');
+       }
+      is_expr = false;
+      break;
+
+    case OMP_FOR:
+      pp_string (buffer, "#pragma omp for");
+      dump_omp_clauses (buffer, OMP_FOR_CLAUSES (node), spc, flags);
+
+      if (!(flags & TDF_SLIM))
+       {
+         if (OMP_FOR_PRE_BODY (node))
+           {
+             newline_and_indent (buffer, spc + 2);
+             pp_character (buffer, '{');
+             spc += 4;
+             newline_and_indent (buffer, spc);
+             dump_generic_node (buffer, OMP_FOR_PRE_BODY (node),
+                 spc, flags, false);
+           }
+         newline_and_indent (buffer, spc);
+         pp_string (buffer, "for (");
+         dump_generic_node (buffer, OMP_FOR_INIT (node), spc, flags, false);
+         pp_string (buffer, "; ");
+         dump_generic_node (buffer, OMP_FOR_COND (node), spc, flags, false);
+         pp_string (buffer, "; ");
+         dump_generic_node (buffer, OMP_FOR_INCR (node), spc, flags, false);
+         pp_string (buffer, ")");
+         if (OMP_FOR_BODY (node))
+           {
+             newline_and_indent (buffer, spc + 2);
+             pp_character (buffer, '{');
+             newline_and_indent (buffer, spc + 4);
+             dump_generic_node (buffer, OMP_FOR_BODY (node), spc + 4, flags,
+                 false);
+             newline_and_indent (buffer, spc + 2);
+             pp_character (buffer, '}');
+           }
+         if (OMP_FOR_PRE_BODY (node))
+           {
+             spc -= 4;
+             newline_and_indent (buffer, spc + 2);
+             pp_character (buffer, '}');
+           }
+       }
+      is_expr = false;
+      break;
+
+    case OMP_SECTIONS:
+      pp_string (buffer, "#pragma omp sections");
+      if (OMP_SECTIONS_CONTROL (node))
+       {
+         pp_string (buffer, " <");
+         dump_generic_node (buffer, OMP_SECTIONS_CONTROL (node), spc,
+                            flags, false);
+         pp_string (buffer, ">");
+       }
+      dump_omp_clauses (buffer, OMP_SECTIONS_CLAUSES (node), spc, flags);
+      goto dump_omp_body;
+
+    case OMP_SECTIONS_SWITCH:
+      pp_string (buffer, "OMP_SECTIONS_SWITCH");
+      is_expr = false;
+      break;
+    case OMP_SECTION:
+      pp_string (buffer, "#pragma omp section");
+      goto dump_omp_body;
+    case OMP_MASTER:
+      pp_string (buffer, "#pragma omp master");
+      goto dump_omp_body;
+
+    case OMP_ORDERED:
+      pp_string (buffer, "#pragma omp ordered");
+      goto dump_omp_body;
+
+    case OMP_CRITICAL:
+      pp_string (buffer, "#pragma omp critical");
+      if (OMP_CRITICAL_NAME (node))
+       {
+         pp_space (buffer);
+         pp_character (buffer, '(');
+          dump_generic_node (buffer, OMP_CRITICAL_NAME (node), spc,
+                            flags, false);
+         pp_character (buffer, ')');
+       }
+      goto dump_omp_body;
+
+    case OMP_ATOMIC:
+      pp_string (buffer, "#pragma omp atomic");
+      newline_and_indent (buffer, spc + 2);
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_space (buffer);
+      pp_character (buffer, '=');
+      pp_space (buffer);
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      break;
+
+    case OMP_ATOMIC_LOAD:
+      pp_string (buffer, "#pragma omp atomic_load");
+      newline_and_indent (buffer, spc + 2);
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_space (buffer);
+      pp_character (buffer, '=');
+      pp_space (buffer);
+      pp_character (buffer, '*');
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      break;
+
+    case OMP_ATOMIC_STORE:
+      pp_string (buffer, "#pragma omp atomic_store (");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_character (buffer, ')');
+      break;
+
+    case OMP_SINGLE:
+      pp_string (buffer, "#pragma omp single");
+      dump_omp_clauses (buffer, OMP_SINGLE_CLAUSES (node), spc, flags);
+      goto dump_omp_body;
+
+    case OMP_RETURN:
+      pp_string (buffer, "OMP_RETURN");
+      if (OMP_RETURN_NOWAIT (node))
+       pp_string (buffer, " [nowait]");
+      is_expr = false;
+      break;
+
+    case OMP_CONTINUE:
+      pp_string (buffer, "OMP_CONTINUE <");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, " <- ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, ">");
+      is_expr = false;
+      break;
+
+    case OMP_CLAUSE:
+      dump_omp_clause (buffer, node, spc, flags);
+      is_expr = false;
+      break;
+
+    case REDUC_MAX_EXPR:
+      pp_string (buffer, " REDUC_MAX_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case REDUC_MIN_EXPR:
+      pp_string (buffer, " REDUC_MIN_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case REDUC_PLUS_EXPR:
+      pp_string (buffer, " REDUC_PLUS_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_WIDEN_MULT_HI_EXPR:
+      pp_string (buffer, " VEC_WIDEN_MULT_HI_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_WIDEN_MULT_LO_EXPR:
+      pp_string (buffer, " VEC_WIDEN_MULT_LO_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_UNPACK_HI_EXPR:
+      pp_string (buffer, " VEC_UNPACK_HI_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_UNPACK_LO_EXPR:
+      pp_string (buffer, " VEC_UNPACK_LO_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_UNPACK_FLOAT_HI_EXPR:
+      pp_string (buffer, " VEC_UNPACK_FLOAT_HI_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_UNPACK_FLOAT_LO_EXPR:
+      pp_string (buffer, " VEC_UNPACK_FLOAT_LO_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_PACK_TRUNC_EXPR:
+      pp_string (buffer, " VEC_PACK_TRUNC_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_PACK_SAT_EXPR:
+      pp_string (buffer, " VEC_PACK_SAT_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_PACK_FIX_TRUNC_EXPR:
+      pp_string (buffer, " VEC_PACK_FIX_TRUNC_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case BLOCK:
+      {
+       tree t;
+       pp_string (buffer, "BLOCK");
+
+       if (BLOCK_ABSTRACT (node))
+         pp_string (buffer, " [abstract]");
+
+       if (TREE_ASM_WRITTEN (node))
+         pp_string (buffer, " [written]");
+
+       newline_and_indent (buffer, spc + 2);
+
+       if (BLOCK_SUPERCONTEXT (node))
+         {
+           pp_string (buffer, "SUPERCONTEXT: ");
+           if (TREE_CODE (BLOCK_SUPERCONTEXT (node)) == BLOCK)
+             pp_printf (buffer, "BLOCK %p",
+                        (void *)BLOCK_SUPERCONTEXT (node));
+           else
+             dump_generic_node (buffer, BLOCK_SUPERCONTEXT (node), 0, flags,
+                                false);
+           newline_and_indent (buffer, spc + 2);
+         }
+
+       if (BLOCK_SUBBLOCKS (node))
+         {
+           pp_string (buffer, "SUBBLOCKS: ");
+           for (t = BLOCK_SUBBLOCKS (node); t; t = BLOCK_CHAIN (t))
+             pp_printf (buffer, "%p ", (void *)t);
+           newline_and_indent (buffer, spc + 2);
+         }
+
+       if (BLOCK_VARS (node))
+         {
+           pp_string (buffer, "VARS: ");
+           for (t = BLOCK_VARS (node); t; t = TREE_CHAIN (t))
+             {
+               dump_generic_node (buffer, t, 0, flags, false);
+               pp_string (buffer, " ");
+             }
+           newline_and_indent (buffer, spc + 2);
+         }
+
+       if (BLOCK_ABSTRACT_ORIGIN (node))
+         {
+           pp_string (buffer, "ABSTRACT_ORIGIN: ");
+           if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node)) == BLOCK)
+             pp_printf (buffer, "BLOCK %p",
+                        (void *)BLOCK_ABSTRACT_ORIGIN (node));
+           else
+             dump_generic_node (buffer, BLOCK_ABSTRACT_ORIGIN (node), 0, flags,
+                                false);
+           newline_and_indent (buffer, spc + 2);
+         }
+      }
+    break;
+
+    case VEC_EXTRACT_EVEN_EXPR:
+      pp_string (buffer, " VEC_EXTRACT_EVEN_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+  
+    case VEC_EXTRACT_ODD_EXPR:
+      pp_string (buffer, " VEC_EXTRACT_ODD_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_INTERLEAVE_HIGH_EXPR:
+      pp_string (buffer, " VEC_INTERLEAVE_HIGH_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
+    case VEC_INTERLEAVE_LOW_EXPR:
+      pp_string (buffer, " VEC_INTERLEAVE_LOW_EXPR < ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
+      pp_string (buffer, ", ");
+      dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
+      pp_string (buffer, " > ");
+      break;
+
     default:
       NIY;
     }
 
   if (is_stmt && is_expr)
     pp_semicolon (buffer);
     default:
       NIY;
     }
 
   if (is_stmt && is_expr)
     pp_semicolon (buffer);
-  pp_write_text_to_stream (buffer);
+
+  /* If we're building a diagnostic, the formatted text will be written
+     into BUFFER's stream by the caller; otherwise, write it now.  */
+  if (!(flags & TDF_DIAGNOSTIC))
+    pp_write_text_to_stream (buffer);
 
   return spc;
 }
 
   return spc;
 }
@@ -1460,7 +2198,7 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
   if (TREE_CODE (t) == TYPE_DECL)
     pp_string (buffer, "typedef ");
 
   if (TREE_CODE (t) == TYPE_DECL)
     pp_string (buffer, "typedef ");
 
-  if (DECL_REGISTER (t))
+  if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
     pp_string (buffer, "register ");
 
   if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
     pp_string (buffer, "register ");
 
   if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
@@ -1487,18 +2225,7 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
       tmp = TREE_TYPE (t);
       while (TREE_CODE (tmp) == ARRAY_TYPE)
        {
       tmp = TREE_TYPE (t);
       while (TREE_CODE (tmp) == ARRAY_TYPE)
        {
-         pp_character (buffer, '[');
-         if (TYPE_DOMAIN (tmp))
-           {
-             if (TREE_CODE (TYPE_SIZE (tmp)) == INTEGER_CST)
-               pp_wide_integer (buffer,
-                               TREE_INT_CST_LOW (TYPE_SIZE (tmp)) /
-                               TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (tmp))));
-             else
-               dump_generic_node (buffer, TYPE_SIZE_UNIT (tmp), spc, flags,
-                                  false);
-           }
-         pp_character (buffer, ']');
+         dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
          tmp = TREE_TYPE (tmp);
        }
     }
          tmp = TREE_TYPE (tmp);
        }
     }
@@ -1519,6 +2246,14 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
       dump_generic_node (buffer, t, spc, flags, false);
     }
 
       dump_generic_node (buffer, t, spc, flags, false);
     }
 
+  if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
+    {
+      pp_string (buffer, " __asm__ ");
+      pp_character (buffer, '(');
+      dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
+      pp_character (buffer, ')');
+    }
+
   /* The initial value of a function serves to determine wether the function
      is declared or defined.  So the following does not apply to function
      nodes.  */
   /* The initial value of a function serves to determine wether the function
      is declared or defined.  So the following does not apply to function
      nodes.  */
@@ -1534,6 +2269,13 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
        }
     }
 
        }
     }
 
+  if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
+    {
+      pp_string (buffer, " [value-expr: ");
+      dump_generic_node (buffer, DECL_VALUE_EXPR (t), spc, flags, false);
+      pp_character (buffer, ']');
+    }
+
   pp_character (buffer, ';');
 }
 
   pp_character (buffer, ';');
 }
 
@@ -1542,7 +2284,7 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
    FIXME: Still incomplete.  */
 
 static void
    FIXME: Still incomplete.  */
 
 static void
-print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags)
+print_struct_decl (pretty_printer *buffer, const_tree node, int spc, int flags)
 {
   /* Print the name of the structure.  */
   if (TYPE_NAME (node))
 {
   /* Print the name of the structure.  */
   if (TYPE_NAME (node))
@@ -1613,7 +2355,7 @@ print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags)
    operators.  */
 
 static int
    operators.  */
 
 static int
-op_prio (tree op)
+op_prio (const_tree op)
 {
   if (op == NULL)
     return 9999;
 {
   if (op == NULL)
     return 9999;
@@ -1626,6 +2368,7 @@ op_prio (tree op)
       return 1;
 
     case MODIFY_EXPR:
       return 1;
 
     case MODIFY_EXPR:
+    case GIMPLE_MODIFY_STMT:
     case INIT_EXPR:
       return 2;
 
     case INIT_EXPR:
       return 2;
 
@@ -1674,10 +2417,16 @@ op_prio (tree op)
     case RROTATE_EXPR:
       return 11;
 
     case RROTATE_EXPR:
       return 11;
 
+    case WIDEN_SUM_EXPR:
     case PLUS_EXPR:
     case PLUS_EXPR:
+    case POINTER_PLUS_EXPR:
     case MINUS_EXPR:
       return 12;
 
     case MINUS_EXPR:
       return 12;
 
+    case VEC_WIDEN_MULT_HI_EXPR:
+    case VEC_WIDEN_MULT_LO_EXPR:
+    case WIDEN_MULT_EXPR:
+    case DOT_PROD_EXPR:
     case MULT_EXPR:
     case TRUNC_DIV_EXPR:
     case CEIL_DIV_EXPR:
     case MULT_EXPR:
     case TRUNC_DIV_EXPR:
     case CEIL_DIV_EXPR:
@@ -1698,15 +2447,14 @@ op_prio (tree op)
     case PREINCREMENT_EXPR:
     case PREDECREMENT_EXPR:
     case NEGATE_EXPR:
     case PREINCREMENT_EXPR:
     case PREDECREMENT_EXPR:
     case NEGATE_EXPR:
+    case ALIGN_INDIRECT_REF:
+    case MISALIGNED_INDIRECT_REF:
     case INDIRECT_REF:
     case ADDR_EXPR:
     case FLOAT_EXPR:
     case NOP_EXPR:
     case CONVERT_EXPR:
     case FIX_TRUNC_EXPR:
     case INDIRECT_REF:
     case ADDR_EXPR:
     case FLOAT_EXPR:
     case NOP_EXPR:
     case CONVERT_EXPR:
     case FIX_TRUNC_EXPR:
-    case FIX_CEIL_EXPR:
-    case FIX_FLOOR_EXPR:
-    case FIX_ROUND_EXPR:
     case TARGET_EXPR:
       return 14;
 
     case TARGET_EXPR:
       return 14;
 
@@ -1722,6 +2470,17 @@ op_prio (tree op)
     case ABS_EXPR:
     case REALPART_EXPR:
     case IMAGPART_EXPR:
     case ABS_EXPR:
     case REALPART_EXPR:
     case IMAGPART_EXPR:
+    case REDUC_MAX_EXPR:
+    case REDUC_MIN_EXPR:
+    case REDUC_PLUS_EXPR:
+    case VEC_LSHIFT_EXPR:
+    case VEC_RSHIFT_EXPR:
+    case VEC_UNPACK_HI_EXPR:
+    case VEC_UNPACK_LO_EXPR:
+    case VEC_UNPACK_FLOAT_HI_EXPR:
+    case VEC_UNPACK_FLOAT_LO_EXPR:
+    case VEC_PACK_TRUNC_EXPR:
+    case VEC_PACK_SAT_EXPR:
       return 16;
 
     case SAVE_EXPR:
       return 16;
 
     case SAVE_EXPR:
@@ -1736,17 +2495,15 @@ op_prio (tree op)
 }
 
 
 }
 
 
-/* Return the symbol associated with operator OP.  */
+/* Return the symbol associated with operator CODE.  */
 
 
-static const char *
-op_symbol (tree op)
+const char *
+op_symbol_code (enum tree_code code)
 {
 {
-  if (op == NULL)
-    abort ();
-
-  switch (TREE_CODE (op))
+  switch (code)
     {
     case MODIFY_EXPR:
     {
     case MODIFY_EXPR:
+    case GIMPLE_MODIFY_STMT:
       return "=";
 
     case TRUTH_OR_EXPR:
       return "=";
 
     case TRUTH_OR_EXPR:
@@ -1810,9 +2567,33 @@ op_symbol (tree op)
     case RSHIFT_EXPR:
       return ">>";
 
     case RSHIFT_EXPR:
       return ">>";
 
+    case LROTATE_EXPR:
+      return "r<<";
+
+    case RROTATE_EXPR:
+      return "r>>";
+
+    case VEC_LSHIFT_EXPR:
+      return "v<<";
+
+    case VEC_RSHIFT_EXPR:
+      return "v>>";
+
+    case POINTER_PLUS_EXPR:
+      return "+";
     case PLUS_EXPR:
       return "+";
 
     case PLUS_EXPR:
       return "+";
 
+    case REDUC_PLUS_EXPR:
+      return "r+";
+
+    case WIDEN_SUM_EXPR:
+      return "w+";
+
+    case WIDEN_MULT_EXPR:
+      return "w*";
+
     case NEGATE_EXPR:
     case MINUS_EXPR:
       return "-";
     case NEGATE_EXPR:
     case MINUS_EXPR:
       return "-";
@@ -1827,19 +2608,39 @@ op_symbol (tree op)
     case INDIRECT_REF:
       return "*";
 
     case INDIRECT_REF:
       return "*";
 
+    case ALIGN_INDIRECT_REF:
+      return "A*";
+
+    case MISALIGNED_INDIRECT_REF:
+      return "M*";
+
     case TRUNC_DIV_EXPR:
     case TRUNC_DIV_EXPR:
+    case RDIV_EXPR:
+      return "/";
+
     case CEIL_DIV_EXPR:
     case CEIL_DIV_EXPR:
+      return "/[cl]";
+
     case FLOOR_DIV_EXPR:
     case FLOOR_DIV_EXPR:
+      return "/[fl]";
+
     case ROUND_DIV_EXPR:
     case ROUND_DIV_EXPR:
-    case RDIV_EXPR:
+      return "/[rd]";
+
     case EXACT_DIV_EXPR:
     case EXACT_DIV_EXPR:
-      return "/";
+      return "/[ex]";
 
     case TRUNC_MOD_EXPR:
 
     case TRUNC_MOD_EXPR:
+      return "%";
+
     case CEIL_MOD_EXPR:
     case CEIL_MOD_EXPR:
+      return "%[cl]";
+
     case FLOOR_MOD_EXPR:
     case FLOOR_MOD_EXPR:
+      return "%[fl]";
+
     case ROUND_MOD_EXPR:
     case ROUND_MOD_EXPR:
-      return "%";
+      return "%[rd]";
 
     case PREDECREMENT_EXPR:
       return " --";
 
     case PREDECREMENT_EXPR:
       return " --";
@@ -1853,22 +2654,35 @@ op_symbol (tree op)
     case POSTINCREMENT_EXPR:
       return "++ ";
 
     case POSTINCREMENT_EXPR:
       return "++ ";
 
+    case MAX_EXPR:
+      return "max";
+
+    case MIN_EXPR:
+      return "min";
+
     default:
       return "<<< ??? >>>";
     }
 }
 
     default:
       return "<<< ??? >>>";
     }
 }
 
+/* Return the symbol associated with operator OP.  */
+
+static const char *
+op_symbol (const_tree op)
+{
+  return op_symbol_code (TREE_CODE (op));
+}
+
 /* Prints the name of a CALL_EXPR.  */
 
 static void
 /* Prints the name of a CALL_EXPR.  */
 
 static void
-print_call_name (pretty_printer *buffer, tree node)
+print_call_name (pretty_printer *buffer, const_tree node)
 {
   tree op0;
 
 {
   tree op0;
 
-  if (TREE_CODE (node) != CALL_EXPR)
-    abort ();
+  gcc_assert (TREE_CODE (node) == CALL_EXPR);
 
 
-  op0 = TREE_OPERAND (node, 0);
+  op0 = CALL_EXPR_FN (node);
 
   if (TREE_CODE (op0) == NON_LVALUE_EXPR)
     op0 = TREE_OPERAND (op0, 0);
 
   if (TREE_CODE (op0) == NON_LVALUE_EXPR)
     op0 = TREE_OPERAND (op0, 0);
@@ -1877,7 +2691,7 @@ print_call_name (pretty_printer *buffer, tree node)
     {
     case VAR_DECL:
     case PARM_DECL:
     {
     case VAR_DECL:
     case PARM_DECL:
-      PRINT_FUNCTION_NAME (op0);
+      dump_function_name (buffer, op0);
       break;
 
     case ADDR_EXPR:
       break;
 
     case ADDR_EXPR:
@@ -1899,7 +2713,7 @@ print_call_name (pretty_printer *buffer, tree node)
       /* The function is a pointer contained in a structure.  */
       if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
          TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
       /* The function is a pointer contained in a structure.  */
       if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
          TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
-       PRINT_FUNCTION_NAME (TREE_OPERAND (op0, 1));
+       dump_function_name (buffer, TREE_OPERAND (op0, 1));
       else
        dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
       /* else
       else
        dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
       /* else
@@ -1910,7 +2724,7 @@ print_call_name (pretty_printer *buffer, tree node)
 
     case ARRAY_REF:
       if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
 
     case ARRAY_REF:
       if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
-       PRINT_FUNCTION_NAME (TREE_OPERAND (op0, 0));
+       dump_function_name (buffer, TREE_OPERAND (op0, 0));
       else
        dump_generic_node (buffer, op0, 0, 0, false);
       break;
       else
        dump_generic_node (buffer, op0, 0, 0, false);
       break;
@@ -1973,9 +2787,7 @@ pretty_print_string (pretty_printer *buffer, const char *str)
          pp_string (buffer, "\\'");
          break;
 
          pp_string (buffer, "\\'");
          break;
 
-       case '\0':
-         pp_string (buffer, "\\0");
-         break;
+         /* No need to handle \0; the loop terminates on \0.  */
 
        case '\1':
          pp_string (buffer, "\\1");
 
        case '\1':
          pp_string (buffer, "\\1");
@@ -2033,46 +2845,89 @@ newline_and_indent (pretty_printer *buffer, int spc)
   INDENT (spc);
 }
 
   INDENT (spc);
 }
 
+
 static void
 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
 {
 static void
 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
 {
-  size_t i;
-  stmt_ann_t ann = stmt_ann (stmt);
-  v_may_def_optype v_may_defs = V_MAY_DEF_OPS (ann);
-  v_must_def_optype v_must_defs = V_MUST_DEF_OPS (ann);
-  vuse_optype vuses = VUSE_OPS (ann);
+  struct voptype_d *vdefs;
+  struct voptype_d *vuses;
+  int i, n;
 
 
-  for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
+  if (!ssa_operands_active () || !stmt_references_memory_p (stmt))
+    return;
+
+  /* Even if the statement doesn't have virtual operators yet, it may
+     contain symbol information (this happens before aliases have been
+     computed).  */
+  if ((flags & TDF_MEMSYMS)
+      && VUSE_OPS (stmt) == NULL
+      && VDEF_OPS (stmt) == NULL)
     {
     {
-      pp_string (buffer, "#   ");
-      dump_generic_node (buffer, V_MAY_DEF_RESULT (v_may_defs, i),
-                         spc + 2, flags, false);
-      pp_string (buffer, " = V_MAY_DEF <");
-      dump_generic_node (buffer, V_MAY_DEF_OP (v_may_defs, i),
-                         spc + 2, flags, false);
-      pp_string (buffer, ">;");
-      newline_and_indent (buffer, spc);
+      if (LOADED_SYMS (stmt))
+       {
+         pp_string (buffer, "# LOADS: ");
+         dump_symbols (buffer, LOADED_SYMS (stmt), flags);
+         newline_and_indent (buffer, spc);
+       }
+
+      if (STORED_SYMS (stmt))
+       {
+         pp_string (buffer, "# STORES: ");
+         dump_symbols (buffer, STORED_SYMS (stmt), flags);
+         newline_and_indent (buffer, spc);
+       }
+
+      return;
     }
 
     }
 
-  for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
+  vuses = VUSE_OPS (stmt);
+  while (vuses)
     {
     {
-      tree v_must_def = V_MUST_DEF_OP (v_must_defs, i);
-      pp_string (buffer, "#   V_MUST_DEF <");
-      dump_generic_node (buffer, v_must_def, spc + 2, flags, false);
-      pp_string (buffer, ">;");
+      pp_string (buffer, "# VUSE <");
+
+      n = VUSE_NUM (vuses);
+      for (i = 0; i < n; i++)
+       {
+         dump_generic_node (buffer, VUSE_OP (vuses, i), spc + 2, flags, false);
+         if (i < n - 1)
+           pp_string (buffer, ", ");
+       }
+
+      pp_string (buffer, ">");
+
+      if (flags & TDF_MEMSYMS)
+       dump_symbols (buffer, LOADED_SYMS (stmt), flags);
+
       newline_and_indent (buffer, spc);
       newline_and_indent (buffer, spc);
+      vuses = vuses->next;
     }
 
     }
 
-  for (i = 0; i < NUM_VUSES (vuses); i++)
+  vdefs = VDEF_OPS (stmt);
+  while (vdefs)
     {
     {
-      tree vuse = VUSE_OP (vuses, i);
-      pp_string (buffer, "#   VUSE <");
-      dump_generic_node (buffer, vuse, spc + 2, flags, false);
-      pp_string (buffer, ">;");
+      pp_string (buffer, "# ");
+      dump_generic_node (buffer, VDEF_RESULT (vdefs), spc + 2, flags, false);
+      pp_string (buffer, " = VDEF <");
+
+      n = VDEF_NUM (vdefs);
+      for (i = 0; i < n; i++)
+       {
+         dump_generic_node (buffer, VDEF_OP (vdefs, i), spc + 2, flags, 0);
+         if (i < n - 1)
+           pp_string (buffer, ", ");
+       }
+
+      pp_string (buffer, ">");
+
+      if ((flags & TDF_MEMSYMS) && vdefs->next == NULL)
+       dump_symbols (buffer, STORED_SYMS (stmt), flags);
+
       newline_and_indent (buffer, spc);
       newline_and_indent (buffer, spc);
+      vdefs = vdefs->next;
     }
 }
 
     }
 }
 
+
 /* Dumps basic block BB to FILE with details described by FLAGS and
    indented by INDENT spaces.  */
 
 /* Dumps basic block BB to FILE with details described by FLAGS and
    indented by INDENT spaces.  */
 
@@ -2080,7 +2935,6 @@ void
 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
 {
   maybe_init_pretty_print (file);
 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
 {
   maybe_init_pretty_print (file);
-  dumping_stmts = true;
   dump_generic_bb_buff (&buffer, bb, indent, flags);
   pp_flush (&buffer);
 }
   dump_generic_bb_buff (&buffer, bb, indent, flags);
   pp_flush (&buffer);
 }
@@ -2093,12 +2947,23 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
 {
   edge e;
   tree stmt;
 {
   edge e;
   tree stmt;
+  edge_iterator ei;
 
   if (flags & TDF_BLOCKS)
     {
       INDENT (indent);
       pp_string (buffer, "# BLOCK ");
       pp_decimal_int (buffer, bb->index);
 
   if (flags & TDF_BLOCKS)
     {
       INDENT (indent);
       pp_string (buffer, "# BLOCK ");
       pp_decimal_int (buffer, bb->index);
+      if (bb->frequency)
+       {
+          pp_string (buffer, " freq:");
+          pp_decimal_int (buffer, bb->frequency);
+       }
+      if (bb->count)
+       {
+          pp_string (buffer, " count:");
+          pp_widest_integer (buffer, bb->count);
+       }
 
       if (flags & TDF_LINENO)
        {
 
       if (flags & TDF_LINENO)
        {
@@ -2116,8 +2981,8 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
 
       pp_string (buffer, "# PRED:");
       pp_write_text_to_stream (buffer);
 
       pp_string (buffer, "# PRED:");
       pp_write_text_to_stream (buffer);
-      for (e = bb->pred; e; e = e->pred_next)
-        if (flags & TDF_SLIM)
+      FOR_EACH_EDGE (e, ei, bb->preds)
+       if (flags & TDF_SLIM)
          {
            pp_string (buffer, " ");
            if (e->src == ENTRY_BLOCK_PTR)
          {
            pp_string (buffer, " ");
            if (e->src == ENTRY_BLOCK_PTR)
@@ -2141,6 +3006,8 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
          pp_newline (buffer);
        }
     }
          pp_newline (buffer);
        }
     }
+  pp_write_text_to_stream (buffer);
+  check_bb_profile (bb, buffer->buffer->stream);
 }
 
 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
 }
 
 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
@@ -2150,11 +3017,12 @@ static void
 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
 {
   edge e;
 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
 {
   edge e;
+  edge_iterator ei;
 
   INDENT (indent);
   pp_string (buffer, "# SUCC:");
   pp_write_text_to_stream (buffer);
 
   INDENT (indent);
   pp_string (buffer, "# SUCC:");
   pp_write_text_to_stream (buffer);
-  for (e = bb->succ; e; e = e->succ_next)
+  FOR_EACH_EDGE (e, ei, bb->succs)
     if (flags & TDF_SLIM)
       {
        pp_string (buffer, " ");
     if (flags & TDF_SLIM)
       {
        pp_string (buffer, " ");
@@ -2168,8 +3036,8 @@ dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
   pp_newline (buffer);
 }
 
   pp_newline (buffer);
 }
 
-/* Dumps phi nodes of basic block BB to buffer BUFFER with details described by
-   FLAGS indented by INDENT spaces.  */
+/* Dump PHI nodes of basic block BB to BUFFER with details described
+   by FLAGS and indented by INDENT spaces.  */
 
 static void
 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
 
 static void
 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
@@ -2190,6 +3058,7 @@ dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
     }
 }
 
     }
 }
 
+
 /* Dump jump to basic block BB that is represented implicitly in the cfg
    to BUFFER.  */
 
 /* Dump jump to basic block BB that is represented implicitly in the cfg
    to BUFFER.  */
 
@@ -2220,30 +3089,44 @@ dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
                     int flags)
 {
   edge e;
                     int flags)
 {
   edge e;
+  edge_iterator ei;
+  tree stmt;
+
+  stmt = last_stmt (bb);
+  if (stmt && TREE_CODE (stmt) == COND_EXPR)
+    {
+      edge true_edge, false_edge;
+
+      /* When we are emitting the code or changing CFG, it is possible that
+        the edges are not yet created.  When we are using debug_bb in such
+        a situation, we do not want it to crash.  */
+      if (EDGE_COUNT (bb->succs) != 2)
+       return;
+      extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
+
+      INDENT (indent + 2);
+      pp_cfg_jump (buffer, true_edge->dest);
+      newline_and_indent (buffer, indent);
+      pp_string (buffer, "else");
+      newline_and_indent (buffer, indent + 2);
+      pp_cfg_jump (buffer, false_edge->dest);
+      pp_newline (buffer);
+      return;
+    }
 
   /* If there is a fallthru edge, we may need to add an artificial goto to the
      dump.  */
 
   /* If there is a fallthru edge, we may need to add an artificial goto to the
      dump.  */
-  for (e = bb->succ; e; e = e->succ_next)
+  FOR_EACH_EDGE (e, ei, bb->succs)
     if (e->flags & EDGE_FALLTHRU)
       break;
   if (e && e->dest != bb->next_bb)
     {
       INDENT (indent);
 
     if (e->flags & EDGE_FALLTHRU)
       break;
   if (e && e->dest != bb->next_bb)
     {
       INDENT (indent);
 
-      if ((flags & TDF_LINENO)
-#ifdef USE_MAPPED_LOCATION
-         && e->goto_locus != UNKNOWN_LOCATION
-#else
-         && e->goto_locus
-#endif
-         )
+      if ((flags & TDF_LINENO) && e->goto_locus != UNKNOWN_LOCATION)
        {
          expanded_location goto_xloc;
        {
          expanded_location goto_xloc;
-#ifdef USE_MAPPED_LOCATION
          goto_xloc = expand_location (e->goto_locus);
          goto_xloc = expand_location (e->goto_locus);
-#else
-         goto_xloc = *e->goto_locus;
-#endif
          pp_character (buffer, '[');
          if (goto_xloc.file)
            {
          pp_character (buffer, '[');
          if (goto_xloc.file)
            {
@@ -2275,8 +3158,7 @@ dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
 
   dump_bb_header (buffer, bb, indent, flags);
 
 
   dump_bb_header (buffer, bb, indent, flags);
 
-  if (bb_ann (bb))
-    dump_phi_nodes (buffer, bb, indent, flags);
+  dump_phi_nodes (buffer, bb, indent, flags);
 
   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
     {
 
   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
     {
@@ -2289,6 +3171,7 @@ dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
       INDENT (curr_indent);
       dump_generic_node (buffer, stmt, curr_indent, flags, true);
       pp_newline (buffer);
       INDENT (curr_indent);
       dump_generic_node (buffer, stmt, curr_indent, flags, true);
       pp_newline (buffer);
+      dump_histograms_for_stmt (cfun, buffer->buffer->stream, stmt);
     }
 
   dump_implicit_edges (buffer, bb, indent, flags);
     }
 
   dump_implicit_edges (buffer, bb, indent, flags);