Put opening curly brace of functions on a separate line. Last time I missed some.
[libfirm] / ir / ir / irvrfy.c
index dcecff8..e53e8a3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
  *
  * This file is part of libFirm.
  *
@@ -23,9 +23,7 @@
  * @author   Christian Schaefer, Goetz Lindenmaier, Till Riedel, Michael Beck
  * @version  $Id$
  */
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
 
 #include "irprog.h"
 #include "irop_t.h"
@@ -38,6 +36,7 @@
 #include "irprintf.h"
 #include "irouts.h"
 #include "irflag_t.h"
+#include "irpass_t.h"
 
 /** if this flag is set, verify entity types in Load & Store nodes */
 static int vrfy_entities = 0;
@@ -45,7 +44,8 @@ static int vrfy_entities = 0;
 const char *firm_vrfy_failure_msg;
 
 /* enable verification of Load/Store entities */
-void vrfy_enable_entity_tests(int enable) {
+void vrfy_enable_entity_tests(int enable)
+{
        vrfy_entities = enable;
 }
 
@@ -54,19 +54,23 @@ void vrfy_enable_entity_tests(int enable) {
 /**
  * little helper for NULL modes
  */
-static const char *get_mode_name_ex(ir_mode *mode) {
+static const char *get_mode_name_ex(ir_mode *mode)
+{
        if (! mode)
                return "<no mode>";
        return get_mode_name(mode);
 }
 
-/** the last IRG, on which a verify error was found */
+/** the last IRG, on which a verification error was found */
 static ir_graph *last_irg_error = NULL;
 
 /**
  * print the name of the entity of an verification failure
+ *
+ * @param node  the node caused the failure
  */
-static void show_entity_failure(ir_node *node) {
+static void show_entity_failure(ir_node *node)
+{
        ir_graph *irg = get_irn_irg(node);
 
        if (last_irg_error == irg)
@@ -83,10 +87,8 @@ static void show_entity_failure(ir_node *node) {
                        ir_type *ent_type = get_entity_owner(ent);
 
                        if (ent_type) {
-                               if (ent_type == get_glob_type())
-                                       fprintf(stderr, "\nFIRM: irn_vrfy_irg() %s failed\n", get_entity_name(ent));
-                               else
-                                       fprintf(stderr, "\nFIRM: irn_vrfy_irg() %s::%s failed\n", get_type_name(ent_type), get_entity_name(ent));
+                               ir_fprintf(stderr, "\nFIRM: irn_vrfy_irg() %+F::%s failed\n",
+                                          ent_type, get_entity_name(ent));
                        } else {
                                fprintf(stderr, "\nFIRM: irn_vrfy_irg() <NULL>::%s failed\n", get_entity_name(ent));
                        }
@@ -99,7 +101,8 @@ static void show_entity_failure(ir_node *node) {
 /**
  * Prints a failure for a Node
  */
-static void show_node_failure(ir_node *n) {
+static void show_node_failure(ir_node *n)
+{
        show_entity_failure(n);
        fprintf(stderr, "  node %ld %s%s\n" ,
                get_irn_node_nr(n),
@@ -110,7 +113,8 @@ static void show_node_failure(ir_node *n) {
 /**
  * Prints a failure message for a binop
  */
-static void show_binop_failure(ir_node *n, const char *text) {
+static void show_binop_failure(ir_node *n, const char *text)
+{
        ir_node *left  = get_binop_left(n);
        ir_node *right = get_binop_right(n);
 
@@ -126,7 +130,8 @@ static void show_binop_failure(ir_node *n, const char *text) {
 /**
  * Prints a failure message for an unop
  */
-static void show_unop_failure(ir_node *n, const char *text) {
+static void show_unop_failure(ir_node *n, const char *text)
+{
        ir_node *op  = get_unop_op(n);
 
        show_entity_failure(n);
@@ -140,7 +145,8 @@ static void show_unop_failure(ir_node *n, const char *text) {
 /**
  * Prints a failure message for an op with 3 operands
  */
-static void show_triop_failure(ir_node *n, const char *text) {
+static void show_triop_failure(ir_node *n, const char *text)
+{
        ir_node *op0  = get_irn_n(n, 0);
        ir_node *op1  = get_irn_n(n, 1);
        ir_node *op2  = get_irn_n(n, 2);
@@ -158,7 +164,8 @@ static void show_triop_failure(ir_node *n, const char *text) {
 /**
  * Prints a failure message for a proj
  */
-static void show_proj_failure(ir_node *n) {
+static void show_proj_failure(ir_node *n)
+{
        ir_node *op  = get_Proj_pred(n);
        int proj     = get_Proj_proj(n);
 
@@ -172,51 +179,61 @@ static void show_proj_failure(ir_node *n) {
 /**
  * Prints a failure message for a proj from Start
  */
-static void show_proj_mode_failure(ir_node *n, ir_type *ty) {
+static void show_proj_mode_failure(ir_node *n, ir_type *ty)
+{
        long proj  = get_Proj_proj(n);
        ir_mode *m = get_type_mode(ty);
+       char type_name[256];
+       ir_print_type(type_name, sizeof(type_name), ty);
 
        show_entity_failure(n);
        fprintf(stderr, "  Proj %ld mode %s proj %ld (type %s mode %s) failed\n" ,
                get_irn_node_nr(n),
                get_irn_modename(n),
                proj,
-               get_type_name(ty),
+               type_name,
                get_mode_name_ex(m));
 }
 
 /**
  * Prints a failure message for a proj
  */
-static void show_proj_failure_ent(ir_node *n, ir_entity *ent) {
+static void show_proj_failure_ent(ir_node *n, ir_entity *ent)
+{
        ir_node *op  = get_Proj_pred(n);
        int proj     = get_Proj_proj(n);
        ir_mode *m   = get_type_mode(get_entity_type(ent));
+       char type_name[256];
+       ir_print_type(type_name, sizeof(type_name), get_entity_type(ent));
 
        show_entity_failure(n);
        fprintf(stderr, "  node %ld %s%s %d(%s%s) entity %s(type %s mode %s)failed\n" ,
                get_irn_node_nr(n),
                get_irn_opname(n), get_irn_modename(n), proj,
                get_irn_opname(op), get_irn_modename(op),
-               get_entity_name(ent), get_type_name(get_entity_type(ent)),
+               get_entity_name(ent), type_name,
                get_mode_name_ex(m));
 }
 
 /**
  * Show a node and a graph
  */
-static void show_node_on_graph(ir_graph *irg, ir_node *n) {
+static void show_node_on_graph(ir_graph *irg, ir_node *n)
+{
        ir_fprintf(stderr, "\nFIRM: irn_vrfy_irg() of %+F, node %+F\n", irg, n);
 }
 
 /**
  * Show call parameters
  */
-static void show_call_param(ir_node *n, ir_type *mt) {
+static void show_call_param(ir_node *n, ir_type *mt)
+{
        int i;
+       char type_name[256];
+       ir_print_type(type_name, sizeof(type_name), mt);
 
        show_entity_failure(n);
-       fprintf(stderr, "  Call type-check failed: %s(", get_type_name(mt));
+       fprintf(stderr, "  Call type-check failed: %s(", type_name);
        for (i = 0; i < get_method_n_params(mt); ++i) {
                fprintf(stderr, "%s ", get_mode_name_ex(get_type_mode(get_method_param_type(mt, i))));
        }
@@ -231,7 +248,8 @@ static void show_call_param(ir_node *n, ir_type *mt) {
 /**
  * Show return modes
  */
-static void show_return_modes(ir_graph *irg, ir_node *n, ir_type *mt, int i) {
+static void show_return_modes(ir_graph *irg, ir_node *n, ir_type *mt, int i)
+{
        ir_entity *ent = get_irg_entity(irg);
 
        show_entity_failure(n);
@@ -245,7 +263,8 @@ static void show_return_modes(ir_graph *irg, ir_node *n, ir_type *mt, int i) {
 /**
  * Show return number of results
  */
-static void show_return_nres(ir_graph *irg, ir_node *n, ir_type *mt) {
+static void show_return_nres(ir_graph *irg, ir_node *n, ir_type *mt)
+{
        ir_entity *ent = get_irg_entity(irg);
 
        show_entity_failure(n);
@@ -257,7 +276,8 @@ static void show_return_nres(ir_graph *irg, ir_node *n, ir_type *mt) {
 /**
  * Show Phi input
  */
-static void show_phi_failure(ir_node *phi, ir_node *pred, int pos) {
+static void show_phi_failure(ir_node *phi, ir_node *pred, int pos)
+{
        (void) pos;
        show_entity_failure(phi);
        fprintf(stderr, "  Phi node %ld has mode %s different from predeccessor node %ld mode %s\n",
@@ -268,7 +288,8 @@ static void show_phi_failure(ir_node *phi, ir_node *pred, int pos) {
 /**
  * Show Phi inputs
  */
-static void show_phi_inputs(ir_node *phi, ir_node *block) {
+static void show_phi_inputs(ir_node *phi, ir_node *block)
+{
        show_entity_failure(phi);
        fprintf(stderr, "  Phi node %ld has %d inputs, its Block %ld has %d\n",
                get_irn_node_nr(phi),   get_irn_arity(phi),
@@ -277,11 +298,16 @@ static void show_phi_inputs(ir_node *phi, ir_node *block) {
 
 #endif /* #ifndef NDEBUG */
 
-/** If the address is Sel or SymConst, return the entity. */
-static ir_entity *get_ptr_entity(ir_node *ptr) {
-       if (get_irn_op(ptr) == op_Sel) {
+/**
+ * If the address is Sel or SymConst, return the entity.
+ *
+ * @param ptr  the node representing the address
+ */
+static ir_entity *get_ptr_entity(ir_node *ptr)
+{
+       if (is_Sel(ptr)) {
                return get_Sel_entity(ptr);
-       } else if ((get_irn_op(ptr) == op_SymConst) && (get_SymConst_kind(ptr) == symconst_addr_ent)) {
+       } else if (is_SymConst_addr_ent(ptr)) {
                return get_SymConst_entity(ptr);
        }
        return NULL;
@@ -290,7 +316,8 @@ static ir_entity *get_ptr_entity(ir_node *ptr) {
 /**
  * verify a Proj(Start) node
  */
-static int verify_node_Proj_Start(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Start(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
        (void) n;
@@ -298,13 +325,10 @@ static int verify_node_Proj_Start(ir_node *n, ir_node *p) {
        ASSERT_AND_RET_DBG(
                (
                        (proj == pn_Start_X_initial_exec && mode == mode_X) ||
-                       (proj == pn_Start_M         && mode == mode_M) ||
-                       (proj == pn_Start_P_frame_base && mode_is_reference(mode)) ||
-                       (proj == pn_Start_P_globals && mode_is_reference(mode)) ||
-                       (proj == pn_Start_P_tls     && mode_is_reference(mode)) ||
-                       (proj == pn_Start_T_args    && mode == mode_T) ||
-                       (proj == pn_Start_P_value_arg_base && mode_is_reference(mode)) ||
-                       (proj == pn_Start_P_value_arg_base && mode == mode_T)    /* FIXME: only one of those */
+                       (proj == pn_Start_M              && mode == mode_M) ||
+                       (proj == pn_Start_P_frame_base   && mode_is_reference(mode)) ||
+                       (proj == pn_Start_P_tls          && mode_is_reference(mode)) ||
+                       (proj == pn_Start_T_args         && mode == mode_T)
                ),
                "wrong Proj from Start", 0,
                show_proj_failure(p);
@@ -315,7 +339,8 @@ static int verify_node_Proj_Start(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Cond) node
  */
-static int verify_node_Proj_Cond(ir_node *pred, ir_node *p) {
+static int verify_node_Proj_Cond(ir_node *pred, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
@@ -334,7 +359,8 @@ static int verify_node_Proj_Cond(ir_node *pred, ir_node *p) {
 /**
  * verify a Proj(Raise) node
  */
-static int verify_node_Proj_Raise(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Raise(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
        (void) n;
@@ -350,18 +376,18 @@ static int verify_node_Proj_Raise(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(InstOf) node
  */
-static int verify_node_Proj_InstOf(ir_node *n, ir_node *p) {
+static int verify_node_Proj_InstOf(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
        (void) n;
 
        ASSERT_AND_RET_DBG(
                (
-                       (proj == pn_InstOf_M_regular && mode == mode_M) ||
+                       (proj == pn_InstOf_M         && mode == mode_M) ||
                        (proj == pn_InstOf_X_regular && mode == mode_X) ||
                        (proj == pn_InstOf_X_except  && mode == mode_X) ||
-                       (proj == pn_InstOf_res       && mode_is_reference(mode)) ||
-                       (proj == pn_InstOf_M_except  && mode == mode_M)
+                       (proj == pn_InstOf_res       && mode_is_reference(mode))
                ),
                "wrong Proj from InstOf", 0,
                show_proj_failure(p);
@@ -372,33 +398,34 @@ static int verify_node_Proj_InstOf(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Call) node
  */
-static int verify_node_Proj_Call(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Call(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
        ASSERT_AND_RET_DBG(
                (
-                       (proj == pn_Call_M_regular        && mode == mode_M) ||
+                       (proj == pn_Call_M                && mode == mode_M) ||
                        (proj == pn_Call_X_regular        && mode == mode_X) ||
                        (proj == pn_Call_X_except         && mode == mode_X) ||
                        (proj == pn_Call_T_result         && mode == mode_T) ||
-                       (proj == pn_Call_M_except         && mode == mode_M) ||
                        (proj == pn_Call_P_value_res_base && mode_is_reference(mode))
                ),
                "wrong Proj from Call", 0,
                show_proj_failure(p);
        );
+       /* if we have exception flow, we must have a real Memory input */
        if (proj == pn_Call_X_regular)
                ASSERT_AND_RET(
-                       get_irn_op(get_Call_mem(n)) != op_NoMem,
+                       !is_NoMem(get_Call_mem(n)),
                        "Regular Proj from FunctionCall", 0);
        else if (proj == pn_Call_X_except)
                ASSERT_AND_RET(
-                       get_irn_op(get_Call_mem(n)) != op_NoMem,
+                       !is_NoMem(get_Call_mem(n)),
                        "Exception Proj from FunctionCall", 0);
-       else if (proj == pn_Call_M_regular || proj == pn_Call_M_except)
+       else if (proj == pn_Call_M)
                ASSERT_AND_RET(
-                       (get_irn_op(get_Call_mem(n)) != op_NoMem || 1),
+                       (!is_NoMem(get_Call_mem(n)) || 1),
                        "Memory Proj from FunctionCall", 0);
        return 1;
 }
@@ -406,7 +433,8 @@ static int verify_node_Proj_Call(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Quot) node
  */
-static int verify_node_Proj_Quot(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Quot(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
@@ -438,7 +466,8 @@ static int verify_node_Proj_Quot(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(DivMod) node
  */
-static int verify_node_Proj_DivMod(ir_node *n, ir_node *p) {
+static int verify_node_Proj_DivMod(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
@@ -471,7 +500,8 @@ static int verify_node_Proj_DivMod(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Div) node
  */
-static int verify_node_Proj_Div(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Div(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
@@ -503,7 +533,8 @@ static int verify_node_Proj_Div(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Mod) node
  */
-static int verify_node_Proj_Mod(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Mod(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
@@ -535,7 +566,8 @@ static int verify_node_Proj_Mod(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Cmp) node
  */
-static int verify_node_Proj_Cmp(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Cmp(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
        (void) n;
@@ -545,13 +577,19 @@ static int verify_node_Proj_Cmp(ir_node *n, ir_node *p) {
                "wrong Proj from Cmp", 0,
                show_proj_failure(p);
        );
+       ASSERT_AND_RET_DBG(
+               (mode_is_float(get_irn_mode(get_Cmp_left(n))) || !(proj & pn_Cmp_Uo)),
+               "unordered Proj for non-float Cmp", 0,
+               show_proj_failure(p);
+       );
        return 1;
 }
 
 /**
  * verify a Proj(Load) node
  */
-static int verify_node_Proj_Load(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Load(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
@@ -601,7 +639,8 @@ static int verify_node_Proj_Load(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Store) node
  */
-static int verify_node_Proj_Store(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Store(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
@@ -629,7 +668,8 @@ static int verify_node_Proj_Store(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Alloc) node
  */
-static int verify_node_Proj_Alloc(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Alloc(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
        (void) n;
@@ -650,7 +690,8 @@ static int verify_node_Proj_Alloc(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Proj) node
  */
-static int verify_node_Proj_Proj(ir_node *pred, ir_node *p) {
+static int verify_node_Proj_Proj(ir_node *pred, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
        long nr       = get_Proj_proj(pred);
@@ -681,15 +722,6 @@ static int verify_node_Proj_Proj(ir_node *pred, ir_node *p) {
                                                show_proj_mode_failure(p, get_method_param_type(mt, proj));
                                                );
                        }
-               } else if (nr == pn_Start_P_value_arg_base) {
-                       ASSERT_AND_RET(
-                               (proj >= 0 && mode_is_reference(mode)),
-                               "wrong Proj from Proj from Start", 0
-                               );
-                       ASSERT_AND_RET(
-                               (proj < get_method_n_params(mt)),
-                               "More Projs for args than args in type", 0
-                               );
                }
                break;
 
@@ -729,7 +761,8 @@ static int verify_node_Proj_Proj(ir_node *pred, ir_node *p) {
 /**
  * verify a Proj(Tuple) node
  */
-static int verify_node_Proj_Tuple(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Tuple(ir_node *n, ir_node *p)
+{
        (void) n;
        (void) p;
        /* We don't test */
@@ -739,7 +772,8 @@ static int verify_node_Proj_Tuple(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(CallBegin) node
  */
-static int verify_node_Proj_CallBegin(ir_node *n, ir_node *p) {
+static int verify_node_Proj_CallBegin(ir_node *n, ir_node *p)
+{
        (void) n;
        (void) p;
        return 1;
@@ -748,7 +782,8 @@ static int verify_node_Proj_CallBegin(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(EndReg) node
  */
-static int verify_node_Proj_EndReg(ir_node *n, ir_node *p) {
+static int verify_node_Proj_EndReg(ir_node *n, ir_node *p)
+{
        (void) n;
        (void) p;
 #ifdef INTERPROCEDURAL_VIEW
@@ -762,7 +797,8 @@ static int verify_node_Proj_EndReg(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(EndExcept) node
  */
-static int verify_node_Proj_EndExcept(ir_node *n, ir_node *p) {
+static int verify_node_Proj_EndExcept(ir_node *n, ir_node *p)
+{
        (void) n;
        (void) p;
 #ifdef INTERPROCEDURAL_VIEW
@@ -776,16 +812,16 @@ static int verify_node_Proj_EndExcept(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(CopyB) node
  */
-static int verify_node_Proj_CopyB(ir_node *n, ir_node *p) {
+static int verify_node_Proj_CopyB(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
        ASSERT_AND_RET_DBG(
                (
-                       (proj == pn_CopyB_M_regular && mode == mode_M) ||
+                       (proj == pn_CopyB_M         && mode == mode_M) ||
                        (proj == pn_CopyB_X_regular && mode == mode_X) ||
-                       (proj == pn_CopyB_X_except  && mode == mode_X) ||
-                       (proj == pn_CopyB_M_except  && mode == mode_M)
+                       (proj == pn_CopyB_X_except  && mode == mode_X)
                ),
                "wrong Proj from CopyB", 0,
                show_proj_failure(p);
@@ -804,7 +840,8 @@ static int verify_node_Proj_CopyB(ir_node *n, ir_node *p) {
 /**
  * verify a Proj(Bound) node
  */
-static int verify_node_Proj_Bound(ir_node *n, ir_node *p) {
+static int verify_node_Proj_Bound(ir_node *n, ir_node *p)
+{
        ir_mode *mode = get_irn_mode(p);
        long proj     = get_Proj_proj(p);
 
@@ -827,14 +864,14 @@ static int verify_node_Proj_Bound(ir_node *n, ir_node *p) {
 /**
  * verify a Proj node
  */
-static int
-verify_node_Proj(ir_node *p, ir_graph *irg) {
+static int verify_node_Proj(ir_node *p, ir_graph *irg)
+{
        ir_node *pred;
        ir_op *op;
-       (void) irg;
 
        pred = skip_Id(get_Proj_pred(p));
        ASSERT_AND_RET(get_irn_mode(pred) == mode_T, "mode of a 'projed' node is not Tuple", 0);
+       ASSERT_AND_RET(get_irg_pinned(irg) == op_pin_state_floats || get_nodes_block(pred) == get_nodes_block(p), "Proj must be in same block as its predecessor", 0);
 
        op = get_irn_op(pred);
 
@@ -848,30 +885,47 @@ verify_node_Proj(ir_node *p, ir_graph *irg) {
 /**
  * verify a Block node
  */
-static int verify_node_Block(ir_node *n, ir_graph *irg) {
+static int verify_node_Block(ir_node *n, ir_graph *irg)
+{
        int i;
        ir_node *mb = get_Block_MacroBlock(n);
 
        ASSERT_AND_RET(is_Block(mb) || is_Bad(mb), "Block node with wrong MacroBlock", 0);
 
        if (is_Block(mb) && mb != n) {
+               ir_node *pred;
+
                /* Blocks with more than one predecessor must be header blocks */
                ASSERT_AND_RET(get_Block_n_cfgpreds(n) == 1, "partBlock with more than one predecessor", 0);
+               if (get_irg_phase_state(irg) != phase_backend) {
+                       pred = get_Block_cfgpred(n, 0);
+                       if (is_Proj(pred)) {
+                               /* the predecessor MUST be a regular Proj */
+                               ir_node *frag_op = get_Proj_pred(pred);
+                               ASSERT_AND_RET(
+                                       is_fragile_op(frag_op) && get_Proj_proj(pred) == pn_Generic_X_regular,
+                                       "partBlock with non-regular predecessor", 0);
+                       } else {
+                               /* We allow Jmps to be predecessors of partBlocks. This can happen due to optimization
+                                  of fragile nodes during construction. It does not violate our assumption of dominance
+                                  so let it. */
+                               ASSERT_AND_RET(is_Jmp(pred) || is_Bad(pred),
+                                       "partBlock with non-regular predecessor", 0);
+                       }
+               } else {
+                       /* relax in backend: Bound nodes are probably lowered into conditional jumps */
+               }
        }
 
        for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) {
                ir_node *pred =  get_Block_cfgpred(n, i);
                ASSERT_AND_RET(
-                       (
-                               is_Bad(pred)     ||
-                               is_Unknown(pred) ||
-                               (get_irn_mode(pred) == mode_X)
-                       ),
-                       "Block node", 0);
+                       is_Bad(pred) || (get_irn_mode(pred) == mode_X),
+                       "Block node must have a mode_X predecessor", 0);
        }
 
        if (n == get_irg_end_block(irg) && get_irg_phase_state(irg) != phase_backend)
-               /*  End block may only have Return, Raise or fragile ops as preds. */
+               /* End block may only have Return, Raise or fragile ops as preds. */
                for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) {
                        ir_node *pred =  skip_Proj(get_Block_cfgpred(n, i));
                        if (is_Proj(pred) || is_Tuple(pred))
@@ -895,7 +949,8 @@ static int verify_node_Block(ir_node *n, ir_graph *irg) {
 /**
  * verify a Start node
  */
-static int verify_node_Start(ir_node *n, ir_graph *irg) {
+static int verify_node_Start(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode = get_irn_mode(n);
        (void) irg;
 
@@ -909,7 +964,8 @@ static int verify_node_Start(ir_node *n, ir_graph *irg) {
 /**
  * verify a Jmp node
  */
-static int verify_node_Jmp(ir_node *n, ir_graph *irg) {
+static int verify_node_Jmp(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode = get_irn_mode(n);
        (void) irg;
 
@@ -923,7 +979,8 @@ static int verify_node_Jmp(ir_node *n, ir_graph *irg) {
 /**
  * verify an IJmp node
  */
-static int verify_node_IJmp(ir_node *n, ir_graph *irg) {
+static int verify_node_IJmp(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_IJmp_target(n));
        (void) irg;
@@ -938,7 +995,8 @@ static int verify_node_IJmp(ir_node *n, ir_graph *irg) {
 /**
  * verify a Break node
  */
-static int verify_node_Break(ir_node *n, ir_graph *irg) {
+static int verify_node_Break(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode = get_irn_mode(n);
        (void) irg;
 
@@ -956,7 +1014,8 @@ static int verify_node_Break(ir_node *n, ir_graph *irg) {
 /**
  * verify a Cond node
  */
-static int verify_node_Cond(ir_node *n, ir_graph *irg) {
+static int verify_node_Cond(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Cond_selector(n));
        (void) irg;
@@ -975,7 +1034,8 @@ static int verify_node_Cond(ir_node *n, ir_graph *irg) {
 /**
  * verify a Return node
  */
-static int verify_node_Return(ir_node *n, ir_graph *irg) {
+static int verify_node_Return(ir_node *n, ir_graph *irg)
+{
        int i;
        ir_mode *mymode   = get_irn_mode(n);
        ir_mode *mem_mode = get_irn_mode(get_Return_mem(n));
@@ -1019,7 +1079,8 @@ static int verify_node_Return(ir_node *n, ir_graph *irg) {
 /**
  * verify a Raise node
  */
-static int verify_node_Raise(ir_node *n, ir_graph *irg) {
+static int verify_node_Raise(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Raise_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Raise_exo_ptr(n));
@@ -1036,7 +1097,8 @@ static int verify_node_Raise(ir_node *n, ir_graph *irg) {
 /**
  * verify a Const node
  */
-static int verify_node_Const(ir_node *n, ir_graph *irg) {
+static int verify_node_Const(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode = get_irn_mode(n);
        (void) irg;
 
@@ -1057,20 +1119,11 @@ static int verify_node_Const(ir_node *n, ir_graph *irg) {
 /**
  * verify a SymConst node
  */
-static int verify_node_SymConst(ir_node *n, ir_graph *irg) {
+static int verify_node_SymConst(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode = get_irn_mode(n);
        (void) irg;
 
-       if (get_SymConst_kind(n) == symconst_addr_ent) {
-               ir_entity *ent = get_SymConst_entity(n);
-               if (is_Method_type(get_entity_type(ent)) &&
-                       get_irn_irg(n) != get_const_code_irg()) {
-#if 1
-                       ASSERT_AND_RET((get_entity_peculiarity(ent) != peculiarity_description),
-                               "A constant must address an existing method.", 0);
-#endif
-               }
-       }
        ASSERT_AND_RET(
                /* SymConst: BB --> int*/
                (mode_is_int(mymode) ||
@@ -1083,7 +1136,8 @@ static int verify_node_SymConst(ir_node *n, ir_graph *irg) {
 /**
  * verify a Sel node
  */
-static int verify_node_Sel(ir_node *n, ir_graph *irg) {
+static int verify_node_Sel(ir_node *n, ir_graph *irg)
+{
        int i;
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Sel_mem(n));
@@ -1108,7 +1162,8 @@ static int verify_node_Sel(ir_node *n, ir_graph *irg) {
 /**
  * verify an InstOf node
  */
-static int verify_node_InstOf(ir_node *n, ir_graph *irg) {
+static int verify_node_InstOf(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_InstOf_obj(n));
        (void) irg;
@@ -1121,7 +1176,8 @@ static int verify_node_InstOf(ir_node *n, ir_graph *irg) {
 /**
  * Check if the pinned state is right.
  */
-static int verify_right_pinned(ir_node *n) {
+static int verify_right_pinned(ir_node *n)
+{
        ir_node *mem;
 
        if (get_irn_pinned(n) == op_pin_state_pinned)
@@ -1137,7 +1193,8 @@ static int verify_right_pinned(ir_node *n) {
 /**
  * verify a Call node
  */
-static int verify_node_Call(ir_node *n, ir_graph *irg) {
+static int verify_node_Call(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Call_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Call_ptr(n));
@@ -1153,7 +1210,7 @@ static int verify_node_Call(ir_node *n, ir_graph *irg) {
        ASSERT_AND_RET(verify_right_pinned(n),"Call node with wrong memory input", 0 );
 
        mt = get_Call_type(n);
-       if(get_unknown_type() == mt) {
+       if (get_unknown_type() == mt) {
                return 1;
        }
 
@@ -1169,14 +1226,17 @@ static int verify_node_Call(ir_node *n, ir_graph *irg) {
                        get_Call_n_params(n) >= get_method_n_params(mt),
                        "Number of args for Call doesn't match number of args in variadic type.",
                        0,
-                       fprintf(stderr, "Call has %d params, method %s type %d\n",
-                       get_Call_n_params(n), get_type_name(mt), get_method_n_params(mt));
+                       ir_fprintf(stderr, "Call %+F has %d params, type %d\n",
+                       n, get_Call_n_params(n), get_method_n_params(mt));
                );
        } else {
-               ASSERT_AND_RET(
+               ASSERT_AND_RET_DBG(
                        get_Call_n_params(n) == get_method_n_params(mt),
                        "Number of args for Call doesn't match number of args in non variadic type.",
-                       0);
+                       0,
+                       ir_fprintf(stderr, "Call %+F has %d params, type %d\n",
+                       n, get_Call_n_params(n), get_method_n_params(mt));
+               );
        }
 
        for (i = 0; i < get_method_n_params(mt); i++) {
@@ -1213,7 +1273,8 @@ static int verify_node_Call(ir_node *n, ir_graph *irg) {
 /**
  * verify an Add node
  */
-static int verify_node_Add(ir_node *n, ir_graph *irg) {
+static int verify_node_Add(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Add_left(n));
        ir_mode *op2mode = get_irn_mode(get_Add_right(n));
@@ -1239,7 +1300,8 @@ static int verify_node_Add(ir_node *n, ir_graph *irg) {
 /**
  * verify a Sub node
  */
-static int verify_node_Sub(ir_node *n, ir_graph *irg) {
+static int verify_node_Sub(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Sub_left(n));
        ir_mode *op2mode = get_irn_mode(get_Sub_right(n));
@@ -1251,15 +1313,12 @@ static int verify_node_Sub(ir_node *n, ir_graph *irg) {
                        (mymode ==op1mode && mymode == op2mode && mode_is_data(op1mode)) ||
                        /* Pointer Sub: BB x ref x int --> ref */
                        (op1mode == mymode && mode_is_int(op2mode) && mode_is_reference(mymode)) ||
-                       /* Pointer Sub: BB x int x ref --> ref */
-                       (mode_is_int(op1mode) && op2mode == mymode && mode_is_reference(mymode)) ||
                        /* Pointer Sub: BB x ref x ref --> int */
                        (op1mode == op2mode && mode_is_reference(op2mode) && mode_is_int(mymode))
                ),
                "Sub node", 0,
                show_binop_failure(n, "/* common Sub: BB x numP x numP --> numP */ |\n"
                        "/* Pointer Sub: BB x ref x int --> ref */   |\n"
-                       "/* Pointer Sub: BB x int x ref --> ref */   |\n"
                        "/* Pointer Sub: BB x ref x ref --> int */" );
                );
        return 1;
@@ -1268,7 +1327,8 @@ static int verify_node_Sub(ir_node *n, ir_graph *irg) {
 /**
  * verify a Minus node
  */
-static int verify_node_Minus(ir_node *n, ir_graph *irg) {
+static int verify_node_Minus(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Minus_op(n));
        (void) irg;
@@ -1284,7 +1344,8 @@ static int verify_node_Minus(ir_node *n, ir_graph *irg) {
 /**
  * verify a Mul node
  */
-static int verify_node_Mul(ir_node *n, ir_graph *irg) {
+static int verify_node_Mul(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Mul_left(n));
        ir_mode *op2mode = get_irn_mode(get_Mul_right(n));
@@ -1308,7 +1369,8 @@ static int verify_node_Mul(ir_node *n, ir_graph *irg) {
 /**
  * verify a Mulh node
  */
-static int verify_node_Mulh(ir_node *n, ir_graph *irg) {
+static int verify_node_Mulh(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Mulh_left(n));
        ir_mode *op2mode = get_irn_mode(get_Mulh_right(n));
@@ -1328,7 +1390,8 @@ static int verify_node_Mulh(ir_node *n, ir_graph *irg) {
 /**
  * verify a Quot node
  */
-static int verify_node_Quot(ir_node *n, ir_graph *irg) {
+static int verify_node_Quot(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Quot_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Quot_left(n));
@@ -1349,7 +1412,8 @@ static int verify_node_Quot(ir_node *n, ir_graph *irg) {
 /**
  * verify a DivMod node
  */
-static int verify_node_DivMod(ir_node *n, ir_graph *irg) {
+static int verify_node_DivMod(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_DivMod_mem(n));
        ir_mode *op2mode = get_irn_mode(get_DivMod_left(n));
@@ -1370,7 +1434,8 @@ static int verify_node_DivMod(ir_node *n, ir_graph *irg) {
 /**
  * verify a Div node
  */
-static int verify_node_Div(ir_node *n, ir_graph *irg) {
+static int verify_node_Div(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Div_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Div_left(n));
@@ -1391,7 +1456,8 @@ static int verify_node_Div(ir_node *n, ir_graph *irg) {
 /**
  * verify a Mod node
  */
-static int verify_node_Mod(ir_node *n, ir_graph *irg) {
+static int verify_node_Mod(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Mod_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Mod_left(n));
@@ -1412,7 +1478,8 @@ static int verify_node_Mod(ir_node *n, ir_graph *irg) {
 /**
  * verify an Abs node
  */
-static int verify_node_Abs(ir_node *n, ir_graph *irg) {
+static int verify_node_Abs(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Abs_op(n));
        (void) irg;
@@ -1430,7 +1497,8 @@ static int verify_node_Abs(ir_node *n, ir_graph *irg) {
 /**
  * verify a logical And, Or, Eor node
  */
-static int verify_node_Logic(ir_node *n, ir_graph *irg) {
+static int verify_node_Logic(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_binop_left(n));
        ir_mode *op2mode = get_irn_mode(get_binop_right(n));
@@ -1454,7 +1522,8 @@ static int verify_node_Logic(ir_node *n, ir_graph *irg) {
 /**
  * verify a Not node
  */
-static int verify_node_Not(ir_node *n, ir_graph *irg) {
+static int verify_node_Not(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Not_op(n));
        (void) irg;
@@ -1472,7 +1541,8 @@ static int verify_node_Not(ir_node *n, ir_graph *irg) {
 /**
  * verify a Cmp node
  */
-static int verify_node_Cmp(ir_node *n, ir_graph *irg) {
+static int verify_node_Cmp(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Cmp_left(n));
        ir_mode *op2mode = get_irn_mode(get_Cmp_right(n));
@@ -1492,7 +1562,8 @@ static int verify_node_Cmp(ir_node *n, ir_graph *irg) {
 /**
  * verify a Shift node
  */
-static int verify_node_Shift(ir_node *n, ir_graph *irg) {
+static int verify_node_Shift(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_binop_left(n));
        ir_mode *op2mode = get_irn_mode(get_binop_right(n));
@@ -1515,21 +1586,22 @@ static int verify_node_Shift(ir_node *n, ir_graph *irg) {
 #define verify_node_Shrs  verify_node_Shift
 
 /**
- * verify a Rot node
+ * verify a Rotl node
  */
-static int verify_node_Rot(ir_node *n, ir_graph *irg) {
+static int verify_node_Rotl(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
-       ir_mode *op1mode = get_irn_mode(get_Rot_left(n));
-       ir_mode *op2mode = get_irn_mode(get_Rot_right(n));
+       ir_mode *op1mode = get_irn_mode(get_Rotl_left(n));
+       ir_mode *op2mode = get_irn_mode(get_Rotl_right(n));
        (void) irg;
 
        ASSERT_AND_RET_DBG(
-               /* Rot: BB x int x int --> int */
+               /* Rotl: BB x int x int --> int */
                mode_is_int(op1mode) &&
                mode_is_int(op2mode) &&
                mymode == op1mode,
-               "Rot node", 0,
-               show_binop_failure(n, "/* Rot: BB x int x int --> int */");
+               "Rotl node", 0,
+               show_binop_failure(n, "/* Rotl: BB x int x int --> int */");
        );
        return 1;
 }
@@ -1537,7 +1609,8 @@ static int verify_node_Rot(ir_node *n, ir_graph *irg) {
 /**
  * verify a Conv node
  */
-static int verify_node_Conv(ir_node *n, ir_graph *irg) {
+static int verify_node_Conv(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Conv_op(n));
        (void) irg;
@@ -1554,7 +1627,8 @@ static int verify_node_Conv(ir_node *n, ir_graph *irg) {
 /**
  * verify a Cast node
  */
-static int verify_node_Cast(ir_node *n, ir_graph *irg) {
+static int verify_node_Cast(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Cast_op(n));
        (void) irg;
@@ -1571,14 +1645,17 @@ static int verify_node_Cast(ir_node *n, ir_graph *irg) {
 /**
  * verify a Phi node
  */
-static int verify_node_Phi(ir_node *n, ir_graph *irg) {
+static int verify_node_Phi(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode = get_irn_mode(n);
        ir_node *block  = get_nodes_block(n);
        int i;
        (void) irg;
 
+       /* a Phi node MUST have the same number of inputs as its block
+        * Exception is a phi with 0 inputs which is used when (re)constructing the
+        * SSA form */
        if (! is_Bad(block) && get_irg_phase_state(get_irn_irg(n)) != phase_building && get_irn_arity(n) > 0) {
-               /* a Phi node MUST have the same number of inputs as its block */
                ASSERT_AND_RET_DBG(
                        get_irn_arity(n) == get_irn_arity(block),
                        "wrong number of inputs in Phi node", 0,
@@ -1587,9 +1664,9 @@ static int verify_node_Phi(ir_node *n, ir_graph *irg) {
        }
 
        /* Phi: BB x dataM^n --> dataM */
-       for (i = get_irn_arity(n) - 1; i >= 0; --i) {
-               ir_node *pred = get_irn_n(n, i);
-               if (!is_Bad(pred) && (get_irn_op(pred) != op_Unknown)) {
+       for (i = get_Phi_n_preds(n) - 1; i >= 0; --i) {
+               ir_node *pred = get_Phi_pred(n, i);
+               if (!is_Bad(pred)) {
                        ASSERT_AND_RET_DBG(
                                get_irn_mode(pred) == mymode,
                                "Phi node", 0,
@@ -1630,7 +1707,8 @@ static int verify_node_Phi(ir_node *n, ir_graph *irg) {
 /**
  * verify a Filter node
  */
-static int verify_node_Filter(ir_node *n, ir_graph *irg) {
+static int verify_node_Filter(ir_node *n, ir_graph *irg)
+{
        (void) n;
        (void) irg;
 #ifdef INTERPROCEDURAL_VIEW
@@ -1644,7 +1722,8 @@ static int verify_node_Filter(ir_node *n, ir_graph *irg) {
 /**
  * verify a Load node
  */
-static int verify_node_Load(ir_node *n, ir_graph *irg) {
+static int verify_node_Load(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Load_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Load_ptr(n));
@@ -1652,9 +1731,6 @@ static int verify_node_Load(ir_node *n, ir_graph *irg) {
        ASSERT_AND_RET(op1mode == mode_M, "Load node", 0);
        if (get_irg_phase_state(irg) != phase_backend) {
                ASSERT_AND_RET(mode_is_reference(op2mode), "Load node", 0 );
-       } else {
-               ASSERT_AND_RET(mode_is_reference(op2mode) ||
-                       (mode_is_int(op2mode) && get_mode_size_bits(op2mode) == get_mode_size_bits(mode_P)), "Load node", 0 );
        }
        ASSERT_AND_RET( mymode == mode_T, "Load node", 0 );
 
@@ -1679,7 +1755,8 @@ static int verify_node_Load(ir_node *n, ir_graph *irg) {
 /**
  * verify a Store node
  */
-static int verify_node_Store(ir_node *n, ir_graph *irg) {
+static int verify_node_Store(ir_node *n, ir_graph *irg)
+{
        ir_entity *target;
 
        ir_mode *mymode  = get_irn_mode(n);
@@ -1690,9 +1767,6 @@ static int verify_node_Store(ir_node *n, ir_graph *irg) {
        ASSERT_AND_RET(op1mode == mode_M && mode_is_datab(op3mode), "Store node", 0 );
        if (get_irg_phase_state(irg) != phase_backend) {
                ASSERT_AND_RET(mode_is_reference(op2mode), "Store node", 0 );
-       } else {
-               ASSERT_AND_RET(mode_is_reference(op2mode) ||
-                       (mode_is_int(op2mode) && get_mode_size_bits(op2mode) == get_mode_size_bits(mode_P)), "Store node", 0 );
        }
        ASSERT_AND_RET(mymode == mode_T, "Store node", 0);
 
@@ -1713,7 +1787,8 @@ static int verify_node_Store(ir_node *n, ir_graph *irg) {
 /**
  * verify an Alloc node
  */
-static int verify_node_Alloc(ir_node *n, ir_graph *irg) {
+static int verify_node_Alloc(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Alloc_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Alloc_size(n));
@@ -1726,7 +1801,7 @@ static int verify_node_Alloc(ir_node *n, ir_graph *irg) {
                !mode_is_signed(op2mode) &&
                mymode == mode_T,
                "Alloc node", 0,
-               show_binop_failure(n, "/* Alloc: BB x M x int_u --> M x X x ref */");
+               show_node_failure(n);
        );
        return 1;
 }
@@ -1734,7 +1809,8 @@ static int verify_node_Alloc(ir_node *n, ir_graph *irg) {
 /**
  * verify a Free node
  */
-static int verify_node_Free(ir_node *n, ir_graph *irg) {
+static int verify_node_Free(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Free_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Free_ptr(n));
@@ -1756,7 +1832,8 @@ static int verify_node_Free(ir_node *n, ir_graph *irg) {
 /**
  * verify a Sync node
  */
-static int verify_node_Sync(ir_node *n, ir_graph *irg) {
+static int verify_node_Sync(ir_node *n, ir_graph *irg)
+{
        int i;
        ir_mode *mymode  = get_irn_mode(n);
        (void) irg;
@@ -1772,7 +1849,8 @@ static int verify_node_Sync(ir_node *n, ir_graph *irg) {
 /**
  * verify a Confirm node
  */
-static int verify_node_Confirm(ir_node *n, ir_graph *irg) {
+static int verify_node_Confirm(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Confirm_value(n));
        ir_mode *op2mode = get_irn_mode(get_Confirm_bound(n));
@@ -1791,7 +1869,8 @@ static int verify_node_Confirm(ir_node *n, ir_graph *irg) {
 /**
  * verify a Mux node
  */
-static int verify_node_Mux(ir_node *n, ir_graph *irg) {
+static int verify_node_Mux(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Mux_sel(n));
        ir_mode *op2mode = get_irn_mode(get_Mux_true(n));
@@ -1799,11 +1878,11 @@ static int verify_node_Mux(ir_node *n, ir_graph *irg) {
        (void) irg;
 
        ASSERT_AND_RET(
-               /* Mux: BB x b x numP x numP --> numP */
+               /* Mux: BB x b x datab x datab --> datab */
                op1mode == mode_b &&
                op2mode == mymode &&
                op3mode == mymode &&
-               mode_is_data(mymode),
+               mode_is_datab(mymode),
                "Mux node", 0
                );
        return 1;
@@ -1812,7 +1891,8 @@ static int verify_node_Mux(ir_node *n, ir_graph *irg) {
 /**
  * verify a CopyB node
  */
-static int verify_node_CopyB(ir_node *n, ir_graph *irg) {
+static int verify_node_CopyB(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_CopyB_mem(n));
        ir_mode *op2mode = get_irn_mode(get_CopyB_dst(n));
@@ -1824,11 +1904,6 @@ static int verify_node_CopyB(ir_node *n, ir_graph *irg) {
        if (get_irg_phase_state(irg) != phase_backend) {
                ASSERT_AND_RET(mode_is_reference(op2mode) && mode_is_reference(op3mode),
                        "CopyB node", 0 );
-       } else {
-               ASSERT_AND_RET(mode_is_reference(op2mode) ||
-                       (mode_is_int(op2mode) && get_mode_size_bits(op2mode) == get_mode_size_bits(mode_P)), "CopyB node", 0 );
-               ASSERT_AND_RET(mode_is_reference(op3mode) ||
-                       (mode_is_int(op3mode) && get_mode_size_bits(op3mode) == get_mode_size_bits(mode_P)), "CopyB node", 0 );
        }
 
        ASSERT_AND_RET(
@@ -1844,7 +1919,8 @@ static int verify_node_CopyB(ir_node *n, ir_graph *irg) {
 /**
  * verify a Bound node
  */
-static int verify_node_Bound(ir_node *n, ir_graph *irg) {
+static int verify_node_Bound(ir_node *n, ir_graph *irg)
+{
        ir_mode *mymode  = get_irn_mode(n);
        ir_mode *op1mode = get_irn_mode(get_Bound_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Bound_index(n));
@@ -1871,7 +1947,8 @@ static int verify_node_Bound(ir_node *n, ir_graph *irg) {
  *
  * @return non-zero on success, 0 on dominance error
  */
-static int check_dominance_for_node(ir_node *use) {
+static int check_dominance_for_node(ir_node *use)
+{
        if (is_Block(use)) {
                ir_node *mbh = get_Block_MacroBlock(use);
 
@@ -1917,7 +1994,8 @@ static int check_dominance_for_node(ir_node *use) {
 }
 
 /* Tests the modes of n and its predecessors. */
-int irn_vrfy_irg(ir_node *n, ir_graph *irg) {
+int irn_vrfy_irg(ir_node *n, ir_graph *irg)
+{
        int i;
        ir_op *op;
 
@@ -1929,16 +2007,22 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg) {
                 * do NOT check placement in interprocedural view, as we don't always know
                 * the "right" graph ...
                 */
+
+#ifndef NDEBUG
+               /* this seems to be an expensive check in VS compile (9% over all runtime),
+                  so do NOT run it in release mode */
                ASSERT_AND_RET_DBG(
                        node_is_in_irgs_storage(irg, n),
                        "Node is not stored on proper IR graph!", 0,
                        show_node_on_graph(irg, n);
                );
+#endif
                assert(get_irn_irg(n) == irg);
                {
                        unsigned idx           = get_irn_idx(n);
                        ir_node *node_from_map = get_idx_irn(irg, idx);
-                       ASSERT_AND_RET_DBG(node_from_map == n, "Node index and index map entry differ", 0, ir_printf("node %+F node in map %+F(%p)", n, node_from_map, node_from_map));
+                       ASSERT_AND_RET_DBG(node_from_map == n, "Node index and index map entry differ", 0,
+                               ir_printf("node %+F node in map %+F(%p)\n", n, node_from_map, node_from_map));
                }
        }
 
@@ -1969,7 +2053,8 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg) {
        return 1;
 }
 
-int irn_vrfy(ir_node *n) {
+int irn_vrfy(ir_node *n)
+{
 #ifdef DEBUG_libfirm
        return irn_vrfy_irg(n, current_ir_graph);
 #else
@@ -1986,19 +2071,21 @@ int irn_vrfy(ir_node *n) {
 /**
  * Walker to check every node
  */
-static void vrfy_wrap(ir_node *node, void *env) {
+static void vrfy_wrap(ir_node *node, void *env)
+{
        int *res = env;
-       *res = irn_vrfy(node);
+       *res = irn_vrfy_irg(node, current_ir_graph);
 }
 
 /**
  * Walker to check every node including SSA property.
  * Only called if dominance info is available.
  */
-static void vrfy_wrap_ssa(ir_node *node, void *env) {
+static void vrfy_wrap_ssa(ir_node *node, void *env)
+{
        int *res = env;
 
-       *res = irn_vrfy(node);
+       *res = irn_vrfy_irg(node, current_ir_graph);
        if (*res) {
                *res = check_dominance_for_node(node);
        }
@@ -2011,14 +2098,18 @@ static void vrfy_wrap_ssa(ir_node *node, void *env) {
  * Graph must be in state "op_pin_state_pinned".
  * If dominance info is available, check the SSA property.
  */
-int irg_verify(ir_graph *irg, unsigned flags) {
+int irg_verify(ir_graph *irg, unsigned flags)
+{
        int res = 1;
 #ifdef DEBUG_libfirm
        ir_graph *rem;
 
        rem = current_ir_graph;
        current_ir_graph = irg;
-       last_irg_error = NULL;
+
+#ifndef NDEBUG
+    last_irg_error = NULL;
+#endif /* NDEBUG */
 
        assert(get_irg_pinned(irg) == op_pin_state_pinned && "Verification need pinned graph");
 
@@ -2032,16 +2123,16 @@ int irg_verify(ir_graph *irg, unsigned flags) {
                NULL, &res
        );
 
-       current_ir_graph = rem;
-
        if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT && ! res) {
-               ir_entity *ent = get_irg_entity(current_ir_graph);
+               ir_entity *ent = get_irg_entity(irg);
 
                if (ent)
                        fprintf(stderr, "irg_verify: Verifying graph %s failed\n", get_entity_name(ent));
                else
-                       fprintf(stderr, "irg_verify: Verifying graph %p failed\n", (void *)current_ir_graph);
+                       fprintf(stderr, "irg_verify: Verifying graph %p failed\n", (void *)irg);
        }
+
+       current_ir_graph = rem;
 #else
        (void)irg;
        (void)flags;
@@ -2050,7 +2141,41 @@ int irg_verify(ir_graph *irg, unsigned flags) {
        return res;
 }
 
-int irn_vrfy_irg_dump(ir_node *n, ir_graph *irg, const char **bad_string) {
+struct pass_t {
+       ir_graph_pass_t pass;
+       unsigned        flags;
+};
+
+/**
+ * Wrapper to irg_verify to be run as an ir_graph pass.
+ */
+static int irg_verify_wrapper(ir_graph *irg, void *context)
+{
+       struct pass_t *pass = context;
+       irg_verify(irg, pass->flags);
+       /* do NOT rerun the pass if verify is ok :-) */
+       return 0;
+}
+
+/* Creates an ir_graph pass for irg_verify(). */
+ir_graph_pass_t *irg_verify_pass(const char *name, unsigned flags)
+{
+       struct pass_t *pass = XMALLOCZ(struct pass_t);
+
+       def_graph_pass_constructor(
+               &pass->pass, name ? name : "irg_verify", irg_verify_wrapper);
+
+       /* neither dump for verify */
+       pass->pass.dump_irg   = (DUMP_ON_IRG_FUNC)ir_prog_no_dump;
+       pass->pass.verify_irg = (RUN_ON_IRG_FUNC)ir_prog_no_verify;
+
+       pass->flags = flags;
+       return &pass->pass;
+}
+
+/* create a verify pass */
+int irn_vrfy_irg_dump(ir_node *n, ir_graph *irg, const char **bad_string)
+{
        int res;
        firm_verification_t old = get_node_verification_mode();
 
@@ -2075,7 +2200,8 @@ typedef struct _vrfy_bad_env_t {
 /**
  * Pre-Walker: check Bad predecessors of node.
  */
-static void check_bads(ir_node *node, void *env) {
+static void check_bads(ir_node *node, void *env)
+{
        vrfy_bad_env_t *venv = env;
        int i, arity = get_irn_arity(node);
 
@@ -2093,7 +2219,7 @@ static void check_bads(ir_node *node, void *env) {
                                                fprintf(stderr, "irg_vrfy_bads: Block %ld has Bad predecessor\n", get_irn_node_nr(node));
                                        }
                                        if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
-                                               dump_ir_block_graph(current_ir_graph, "-assert");
+                                               dump_ir_block_graph_sched(current_ir_graph, "-assert");
                                                assert(0 && "Bad CF detected");
                                        }
                                }
@@ -2110,21 +2236,21 @@ static void check_bads(ir_node *node, void *env) {
                                        fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Block\n", get_irn_node_nr(node));
                                }
                                if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
-                                       dump_ir_block_graph(current_ir_graph, "-assert");
+                                       dump_ir_block_graph_sched(current_ir_graph, "-assert");
                                        assert(0 && "Bad CF detected");
                                }
                        }
                }
 
                if ((venv->flags & TUPLE) == 0) {
-                       if (get_irn_op(node) == op_Tuple) {
+                       if (is_Tuple(node)) {
                                venv->res |= TUPLE;
 
                                if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
                                        fprintf(stderr, "irg_vrfy_bads: node %ld is a Tuple\n", get_irn_node_nr(node));
                                }
                                if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
-                                       dump_ir_block_graph(current_ir_graph, "-assert");
+                                       dump_ir_block_graph_sched(current_ir_graph, "-assert");
                                        assert(0 && "Tuple detected");
                                }
                        }
@@ -2145,7 +2271,7 @@ static void check_bads(ir_node *node, void *env) {
                                                        fprintf(stderr, "irg_vrfy_bads: Phi %ld has Bad Input\n", get_irn_node_nr(node));
                                                }
                                                if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
-                                                       dump_ir_block_graph(current_ir_graph, "-assert");
+                                                       dump_ir_block_graph_sched(current_ir_graph, "-assert");
                                                        assert(0 && "Bad CF detected");
                                                }
                                        }
@@ -2159,7 +2285,7 @@ static void check_bads(ir_node *node, void *env) {
                                                fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Input\n", get_irn_node_nr(node));
                                        }
                                        if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
-                                               dump_ir_block_graph(current_ir_graph, "-assert");
+                                               dump_ir_block_graph_sched(current_ir_graph, "-assert");
                                                assert(0 && "Bad NON-CF detected");
                                        }
                                }
@@ -2171,7 +2297,8 @@ static void check_bads(ir_node *node, void *env) {
 /*
  * verify occurrence of bad nodes
  */
-int irg_vrfy_bads(ir_graph *irg, int flags) {
+int irg_vrfy_bads(ir_graph *irg, int flags)
+{
        vrfy_bad_env_t env;
 
        env.flags = flags;
@@ -2185,7 +2312,8 @@ int irg_vrfy_bads(ir_graph *irg, int flags) {
 /*
  * set the default verify operation
  */
-void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops) {
+void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops)
+{
 #define CASE(a)                           \
    case iro_##a:                          \
      ops->verify_node  = verify_node_##a; \
@@ -2224,7 +2352,7 @@ void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops) {
        CASE(Shl);
        CASE(Shr);
        CASE(Shrs);
-       CASE(Rot);
+       CASE(Rotl);
        CASE(Conv);
        CASE(Cast);
        CASE(Phi);