OSDN Git Service

2005-09-28 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / tree-pretty-print.c
index e660b44..6fa0326 100644 (file)
@@ -1,5 +1,5 @@
 /* Pretty formatting of GENERIC trees in C syntax.
-   Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
    Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
 
 This file is part of GCC.
@@ -16,14 +16,13 @@ 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.  */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA.  */
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
-#include "errors.h"
 #include "tree.h"
 #include "diagnostic.h"
 #include "real.h"
@@ -31,6 +30,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "tree-flow.h"
 #include "langhooks.h"
 #include "tree-iterator.h"
+#include "tree-chrec.h"
+#include "tree-pass.h"
 
 /* Local functions, macros and variables.  */
 static int op_prio (tree);
@@ -69,9 +70,9 @@ do_niy (pretty_printer *buffer, tree node)
   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_CODE_LENGTH (TREE_CODE (node));
       for (i = 0; i < len; ++i)
        {
          newline_and_indent (buffer, 2);
@@ -161,13 +162,27 @@ dump_decl_name (pretty_printer *buffer, tree node, int flags)
     {
       if (TREE_CODE (node) == LABEL_DECL
          && LABEL_DECL_UID (node) != -1)
-       pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
+       pp_printf (buffer, "L." HOST_WIDE_INT_PRINT_DEC,
                   LABEL_DECL_UID (node));
       else
-       pp_printf (buffer, "<D%u>", DECL_UID (node));
+       {
+         char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
+         pp_printf (buffer, "%c.%u", c, DECL_UID (node));
+       }
     }
 }
 
+/* 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.  */
 
@@ -202,6 +217,35 @@ dump_function_declaration (pretty_printer *buffer, tree node,
   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 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
@@ -224,9 +268,13 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
   if (TREE_CODE (node) != ERROR_MARK
       && is_gimple_stmt (node)
       && (flags & TDF_VOPS)
-      && stmt_ann (node))
+      && stmt_ann (node)
+      && TREE_CODE (node) != PHI_NODE)
     dump_vops (buffer, node, spc, flags);
 
+  if (is_stmt && (flags & TDF_STMTADDR))
+    pp_printf (buffer, "<&%p> ", (void *)node);
+
   if (dumping_stmts
       && (flags & TDF_LINENO)
       && EXPR_HAS_LOCATION (node))
@@ -270,8 +318,26 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        }
       break;
 
-    case TREE_VEC:
+    case TREE_BINFO:
       dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
+
+    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 BLOCK:
@@ -288,7 +354,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
     case CHAR_TYPE:
       {
        unsigned int quals = TYPE_QUALS (node);
-       char class;
+       enum tree_code_class class;
 
        if (quals & TYPE_QUAL_CONST)
          pp_string (buffer, "const ");
@@ -299,14 +365,14 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
        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>");
          }
-       else if (class == 't')
+       else if (class == tcc_type)
          {
            if (TYPE_NAME (node))
              {
@@ -316,7 +382,13 @@ 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
-                  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
               pp_string (buffer, "<unnamed type>");
@@ -358,6 +430,9 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
            pp_string (buffer,  "volatile");
          else if (quals & TYPE_QUAL_RESTRICT)
            pp_string (buffer, " restrict");
+
+         if (TYPE_REF_CAN_ALIAS_ALL (node))
+           pp_string (buffer, " {ref-all}");
        }
       break;
 
@@ -370,8 +445,62 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       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:
@@ -385,38 +514,11 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        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;
       }
 
-    case SET_TYPE:
-      NIY;
-      break;
-
     case RECORD_TYPE:
     case UNION_TYPE:
     case QUAL_UNION_TYPE:
@@ -469,9 +571,10 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
          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));
+             val = build_int_cst_wide (NULL_TREE,
+                                       -TREE_INT_CST_LOW (val),
+                                       ~TREE_INT_CST_HIGH (val)
+                                       + !TREE_INT_CST_LOW (val));
            }
          /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
             systems?  */
@@ -622,12 +725,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);
 
-      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;
 
@@ -672,36 +778,29 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
     case CONSTRUCTOR:
       {
-       tree lnode;
+       unsigned HOST_WIDE_INT ix;
+       tree field, val;
        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;
-       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, '.');
-               dump_generic_node (buffer, TREE_PURPOSE (lnode), spc, flags, false);
+               dump_generic_node (buffer, field, spc, flags, false);
                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)
-             {
                dump_decl_name (buffer, val, flags);
-             }
            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);
@@ -753,7 +852,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       {
        tree_stmt_iterator si;
        bool first = true;
-  
+
        if ((flags & TDF_SLIM) || !dumping_stmts)
          {
            pp_string (buffer, "<STATEMENT_LIST>");
@@ -802,9 +901,11 @@ 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)
-             && 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)
-             && 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);
              dump_generic_node (buffer, COND_EXPR_THEN (node), 0, flags, true);
@@ -897,6 +998,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
          pp_character (buffer, ']');
        }
 
+      if (CALL_EXPR_RETURN_SLOT_OPT (node))
+       pp_string (buffer, " [return slot optimization]");
       if (CALL_EXPR_TAILCALL (node))
        pp_string (buffer, " [tail call]");
       break;
@@ -935,6 +1038,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
     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:
@@ -997,6 +1102,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
     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
@@ -1013,6 +1120,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);
+
+      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:
@@ -1067,7 +1181,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_string (buffer, ")");
+         pp_string (buffer, ") ");
        }
       if (op_prio (op0) < op_prio (node))
        pp_character (buffer, '(');
@@ -1096,16 +1210,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
       pp_character (buffer, '>');
       break;
 
-    case UNSAVE_EXPR:
-      pp_string (buffer, "UNSAVE_EXPR <");
-      dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
-      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);
@@ -1201,48 +1305,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
        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;
@@ -1319,9 +1381,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
     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
@@ -1410,12 +1470,86 @@ 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));
+      if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
+       pp_string (buffer, "(ab)");
+      break;
+
+    case WITH_SIZE_EXPR:
+      pp_string (buffer, "WITH_SIZE_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 VALUE_HANDLE:
       pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
       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");
+      break;
+
+    case POLYNOMIAL_CHREC:
+      pp_string (buffer, "{");
+      dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
+      pp_string (buffer, ", +, ");
+      dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
+      pp_string (buffer, "}_");
+      dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
+      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 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;
+
     default:
       NIY;
     }
@@ -1437,7 +1571,7 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
   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))
@@ -1464,18 +1598,7 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
       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);
        }
     }
@@ -1496,6 +1619,14 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
       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.  */
@@ -1675,6 +1806,8 @@ op_prio (tree op)
     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:
@@ -1699,6 +1832,11 @@ op_prio (tree op)
     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:
       return 16;
 
     case SAVE_EXPR:
@@ -1718,8 +1856,7 @@ op_prio (tree op)
 static const char *
 op_symbol (tree op)
 {
-  if (op == NULL)
-    abort ();
+  gcc_assert (op);
 
   switch (TREE_CODE (op))
     {
@@ -1787,9 +1924,18 @@ op_symbol (tree op)
     case RSHIFT_EXPR:
       return ">>";
 
+    case VEC_LSHIFT_EXPR:
+      return "v<<";
+
+    case VEC_RSHIFT_EXPR:
+      return "v>>";
     case PLUS_EXPR:
       return "+";
 
+    case REDUC_PLUS_EXPR:
+      return "r+";
+
     case NEGATE_EXPR:
     case MINUS_EXPR:
       return "-";
@@ -1804,19 +1950,39 @@ op_symbol (tree op)
     case INDIRECT_REF:
       return "*";
 
+    case ALIGN_INDIRECT_REF:
+      return "A*";
+
+    case MISALIGNED_INDIRECT_REF:
+      return "M*";
+
     case TRUNC_DIV_EXPR:
+    case RDIV_EXPR:
+      return "/";
+
     case CEIL_DIV_EXPR:
+      return "/[cl]";
+
     case FLOOR_DIV_EXPR:
+      return "/[fl]";
+
     case ROUND_DIV_EXPR:
-    case RDIV_EXPR:
+      return "/[rd]";
+
     case EXACT_DIV_EXPR:
-      return "/";
+      return "/[ex]";
 
     case TRUNC_MOD_EXPR:
+      return "%";
+
     case CEIL_MOD_EXPR:
+      return "%[cl]";
+
     case FLOOR_MOD_EXPR:
+      return "%[fl]";
+
     case ROUND_MOD_EXPR:
-      return "%";
+      return "%[rd]";
 
     case PREDECREMENT_EXPR:
       return " --";
@@ -1842,8 +2008,7 @@ print_call_name (pretty_printer *buffer, tree node)
 {
   tree op0;
 
-  if (TREE_CODE (node) != CALL_EXPR)
-    abort ();
+  gcc_assert (TREE_CODE (node) == CALL_EXPR);
 
   op0 = TREE_OPERAND (node, 0);
 
@@ -1854,7 +2019,7 @@ print_call_name (pretty_printer *buffer, tree node)
     {
     case VAR_DECL:
     case PARM_DECL:
-      PRINT_FUNCTION_NAME (op0);
+      dump_function_name (buffer, op0);
       break;
 
     case ADDR_EXPR:
@@ -1876,7 +2041,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)
-       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
@@ -1887,7 +2052,7 @@ print_call_name (pretty_printer *buffer, tree node)
 
     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;
@@ -2013,38 +2178,43 @@ newline_and_indent (pretty_printer *buffer, int spc)
 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);
+  tree use;
+  use_operand_p use_p;
+  def_operand_p def_p;
+  use_operand_p kill_p;
+  ssa_op_iter iter;
 
-  for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
+  if (!ssa_operands_active ())
+    return;
+
+  FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter)
     {
       pp_string (buffer, "#   ");
-      dump_generic_node (buffer, V_MAY_DEF_RESULT (v_may_defs, i), 
+      dump_generic_node (buffer, DEF_FROM_PTR (def_p),
                          spc + 2, flags, false);
       pp_string (buffer, " = V_MAY_DEF <");
-      dump_generic_node (buffer, V_MAY_DEF_OP (v_may_defs, i), 
+      dump_generic_node (buffer, USE_FROM_PTR (use_p),
                          spc + 2, flags, false);
       pp_string (buffer, ">;");
       newline_and_indent (buffer, spc);
     }
 
-  for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
+  FOR_EACH_SSA_MUSTDEF_OPERAND (def_p, kill_p, stmt, iter)
     {
-      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, "#   ");
+      dump_generic_node (buffer, DEF_FROM_PTR (def_p),
+                         spc + 2, flags, false);
+      pp_string (buffer, " = V_MUST_DEF <");
+      dump_generic_node (buffer, USE_FROM_PTR (kill_p),
+                         spc + 2, flags, false);
       pp_string (buffer, ">;");
       newline_and_indent (buffer, spc);
     }
 
-  for (i = 0; i < NUM_VUSES (vuses); i++)
+  FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_VUSE)
     {
-      tree vuse = VUSE_OP (vuses, i);
       pp_string (buffer, "#   VUSE <");
-      dump_generic_node (buffer, vuse, spc + 2, flags, false);
+      dump_generic_node (buffer, use, spc + 2, flags, false);
       pp_string (buffer, ">;");
       newline_and_indent (buffer, spc);
     }
@@ -2070,12 +2240,23 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
 {
   edge e;
   tree stmt;
+  edge_iterator ei;
 
   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)
        {
@@ -2093,8 +2274,8 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
 
       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)
@@ -2118,6 +2299,8 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
          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
@@ -2127,11 +2310,12 @@ static void
 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);
-  for (e = bb->succ; e; e = e->succ_next)
+  FOR_EACH_EDGE (e, ei, bb->succs)
     if (flags & TDF_SLIM)
       {
        pp_string (buffer, " ");
@@ -2197,10 +2381,11 @@ dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
                     int flags)
 {
   edge e;
+  edge_iterator ei;
 
   /* 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)
@@ -2252,9 +2437,8 @@ dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
 
   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))
     {
       int curr_indent;