fix weak external functions
[libfirm] / ir / ir / irvrfy.c
index c05121f..65d2d81 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;
@@ -49,6 +48,8 @@ void vrfy_enable_entity_tests(int enable) {
        vrfy_entities = enable;
 }
 
+#ifndef NDEBUG
+
 /**
  * little helper for NULL modes
  */
@@ -58,11 +59,13 @@ static const char *get_mode_name_ex(ir_mode *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) {
        ir_graph *irg = get_irn_irg(node);
@@ -81,10 +84,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));
                        }
@@ -173,13 +174,15 @@ static void show_proj_failure(ir_node *n) {
 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));
 }
 
@@ -190,13 +193,15 @@ 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));
 }
 
@@ -212,9 +217,11 @@ static void show_node_on_graph(ir_graph *irg, ir_node *n) {
  */
 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))));
        }
@@ -256,6 +263,7 @@ 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) {
+       (void) pos;
        show_entity_failure(phi);
        fprintf(stderr, "  Phi node %ld has mode %s different from predeccessor node %ld mode %s\n",
                get_irn_node_nr(phi), get_mode_name_ex(get_irn_mode(phi)),
@@ -272,11 +280,17 @@ static void show_phi_inputs(ir_node *phi, ir_node *block) {
                get_irn_node_nr(block), get_irn_arity(block));
 }
 
-/** If the address is Sel or SymConst, return the entity. */
+#endif /* #ifndef NDEBUG */
+
+/**
+ * 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 (get_irn_op(ptr) == op_Sel) {
+       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;
@@ -288,17 +302,15 @@ static ir_entity *get_ptr_entity(ir_node *ptr) {
 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;
 
        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);
@@ -331,6 +343,7 @@ static int verify_node_Proj_Cond(ir_node *pred, 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;
 
        ASSERT_AND_RET_DBG(
                ((proj == pn_Raise_X && mode == mode_X) || (proj == pn_Raise_M && mode == mode_M)),
@@ -346,14 +359,14 @@ static int verify_node_Proj_Raise(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);
@@ -370,27 +383,27 @@ static int verify_node_Proj_Call(ir_node *n, ir_node *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;
 }
@@ -530,12 +543,18 @@ static int verify_node_Proj_Mod(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;
 
        ASSERT_AND_RET_DBG(
                (proj >= 0 && proj <= 15 && mode == mode_b),
                "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;
 }
 
@@ -623,6 +642,7 @@ static int verify_node_Proj_Store(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;
 
        ASSERT_AND_RET_DBG(
                (
@@ -655,7 +675,7 @@ static int verify_node_Proj_Proj(ir_node *pred, ir_node *p) {
 
                if (nr == pn_Start_T_args) {
                        ASSERT_AND_RET(
-                               (proj >= 0 && mode_is_data(mode)),
+                               (proj >= 0 && mode_is_datab(mode)),
                                "wrong Proj from Proj from Start", 0);
                        ASSERT_AND_RET(
                                (proj < get_method_n_params(mt)),
@@ -664,27 +684,20 @@ static int verify_node_Proj_Proj(ir_node *pred, ir_node *p) {
                        if ((mode_is_reference(mode)) && is_compound_type(get_method_param_type(mt, proj)))
                                /* value argument */ break;
 
+                       if (get_irg_phase_state(get_irn_irg(pred)) != phase_backend) {
                                ASSERT_AND_RET_DBG(
-                               (mode == get_type_mode(get_method_param_type(mt, proj))),
-                               "Mode of Proj from Start doesn't match mode of param type.", 0,
-                               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
-                               );
+                                               (mode == get_type_mode(get_method_param_type(mt, proj))),
+                                               "Mode of Proj from Start doesn't match mode of param type.", 0,
+                                               show_proj_mode_failure(p, get_method_param_type(mt, proj));
+                                               );
+                       }
                }
                break;
 
        case iro_Call:
                {
                        ASSERT_AND_RET(
-                               (proj >= 0 && mode_is_data(mode)),
+                               (proj >= 0 && mode_is_datab(mode)),
                                "wrong Proj from Proj from Call", 0);
                        mt = get_Call_type(pred);
                        ASSERT_AND_RET(
@@ -718,6 +731,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) {
+       (void) n;
+       (void) p;
        /* We don't test */
        return 1;
 }
@@ -726,6 +741,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) {
+       (void) n;
+       (void) p;
        return 1;
 }
 
@@ -733,9 +750,13 @@ 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) {
+       (void) n;
+       (void) p;
+#ifdef INTERPROCEDURAL_VIEW
        ASSERT_AND_RET(
                (get_irp_ip_view_state() != ip_view_no),
                "EndReg may only appear if ip view is constructed.", 0);
+#endif
        return 1;
 }
 
@@ -743,9 +764,13 @@ 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) {
+       (void) n;
+       (void) p;
+#ifdef INTERPROCEDURAL_VIEW
        ASSERT_AND_RET(
                (get_irp_ip_view_state() != ip_view_no),
                "EndExcept may only appear if ip view is constructed.", 0);
+#endif
        return 1;
 }
 
@@ -758,10 +783,9 @@ static int verify_node_Proj_CopyB(ir_node *n, ir_node *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);
@@ -810,6 +834,7 @@ verify_node_Proj(ir_node *p, ir_graph *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);
 
@@ -825,29 +850,53 @@ verify_node_Proj(ir_node *p, 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);
        }
 
-       /*  End block may only have Return, Raise or fragile ops as preds. */
        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. */
                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) || get_irn_op(pred) == op_Tuple)
+                       if (is_Proj(pred) || is_Tuple(pred))
                                break;   /*  We can not test properly.  How many tuples are there? */
                        ASSERT_AND_RET(
                                (
-                                       is_Return(pred)                 ||
-                                       is_Bad(pred)                    ||
-                                       (get_irn_op(pred) == op_Raise)  ||
+                                       is_Return(pred) ||
+                                       is_Bad(pred)    ||
+                                       is_Raise(pred)  ||
                                        is_fragile_op(pred)
                                ),
                                "End Block node", 0);
@@ -864,6 +913,7 @@ static int verify_node_Block(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;
 
        ASSERT_AND_RET(
                /* Start: BB --> X x M x ref x data1 x ... x datan x ref */
@@ -877,6 +927,7 @@ static int verify_node_Start(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;
 
        ASSERT_AND_RET(
                /* Jmp: BB --> X */
@@ -891,6 +942,7 @@ static int verify_node_Jmp(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;
 
        ASSERT_AND_RET(
                /* IJmp: BB x ref --> X */
@@ -904,9 +956,12 @@ static int verify_node_IJmp(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;
 
+#ifdef INTERPROCEDURAL_VIEW
        ASSERT_AND_RET((get_irp_ip_view_state() != ip_view_no),
                "Break may only appear if ip view is constructed.", 0);
+#endif
        ASSERT_AND_RET(
                /* Jmp: BB --> X */
                mymode == mode_X, "Break node", 0
@@ -920,6 +975,7 @@ static int verify_node_Break(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;
 
        ASSERT_AND_RET(
                /* Cond: BB x b --> X x X */
@@ -946,7 +1002,7 @@ static int verify_node_Return(ir_node *n, ir_graph *irg) {
        ASSERT_AND_RET( mem_mode == mode_M, "Return node", 0 );  /* operand M */
 
        for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
-               ASSERT_AND_RET( mode_is_data(get_irn_mode(get_Return_res(n, i))), "Return node", 0 );  /* operand datai */
+               ASSERT_AND_RET( mode_is_datab(get_irn_mode(get_Return_res(n, i))), "Return node", 0 );  /* operand datai */
        }
        ASSERT_AND_RET( mymode == mode_X, "Result X", 0 );   /* result X */
        /* Compare returned results with result types of method type */
@@ -957,18 +1013,20 @@ static int verify_node_Return(ir_node *n, ir_graph *irg) {
        for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
                ir_type *res_type = get_method_res_type(mt, i);
 
-               if (is_atomic_type(res_type)) {
-                       ASSERT_AND_RET_DBG(
-                               get_irn_mode(get_Return_res(n, i)) == get_type_mode(res_type),
-                               "Mode of result for Return doesn't match mode of result type.", 0,
-                               show_return_modes(irg, n, mt, i);
-                       );
-               } else {
-                       ASSERT_AND_RET_DBG(
-                               mode_is_reference(get_irn_mode(get_Return_res(n, i))),
-                               "Mode of result for Return doesn't match mode of result type.", 0,
-                               show_return_modes(irg, n, mt, i);
-                       );
+               if (get_irg_phase_state(irg) != phase_backend) {
+                       if (is_atomic_type(res_type)) {
+                               ASSERT_AND_RET_DBG(
+                                       get_irn_mode(get_Return_res(n, i)) == get_type_mode(res_type),
+                                       "Mode of result for Return doesn't match mode of result type.", 0,
+                                       show_return_modes(irg, n, mt, i);
+                               );
+                       } else {
+                               ASSERT_AND_RET_DBG(
+                                       mode_is_reference(get_irn_mode(get_Return_res(n, i))),
+                                       "Mode of result for Return doesn't match mode of result type.", 0,
+                                       show_return_modes(irg, n, mt, i);
+                               );
+                       }
                }
        }
        return 1;
@@ -981,6 +1039,7 @@ 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));
+       (void) irg;
 
        ASSERT_AND_RET(
                /* Sel: BB x M x ref --> X x M */
@@ -995,6 +1054,7 @@ static int verify_node_Raise(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;
 
        ASSERT_AND_RET(
                /* Const: BB --> data */
@@ -1013,19 +1073,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) ||
@@ -1044,6 +1096,7 @@ static int verify_node_Sel(ir_node *n, ir_graph *irg) {
        ir_mode *op1mode = get_irn_mode(get_Sel_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Sel_ptr(n));
        ir_entity *ent;
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                /* Sel: BB x M x ref x int^n --> ref */
@@ -1065,12 +1118,29 @@ static int verify_node_Sel(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;
 
        ASSERT_AND_RET(mode_T == mymode, "mode of Instof is not a tuple", 0);
        ASSERT_AND_RET(mode_is_data(op1mode), "Instof not on data", 0);
        return 1;
 }
 
+/**
+ * Check if the pinned state is right.
+ */
+static int verify_right_pinned(ir_node *n) {
+       ir_node *mem;
+
+       if (get_irn_pinned(n) == op_pin_state_pinned)
+               return 1;
+       mem = get_Call_mem(n);
+
+       /* if it's not pinned, its memory predecessor must be NoMem or Pin */
+       if (is_NoMem(mem) || is_Pin(mem))
+               return 1;
+       return 0;
+}
+
 /**
  * verify a Call node
  */
@@ -1080,16 +1150,14 @@ static int verify_node_Call(ir_node *n, ir_graph *irg) {
        ir_mode *op2mode = get_irn_mode(get_Call_ptr(n));
        ir_type *mt;
        int i;
+       (void) irg;
 
        /* Call: BB x M x ref x data1 x ... x datan
        --> M x datan+1 x ... x data n+m */
        ASSERT_AND_RET( op1mode == mode_M && mode_is_reference(op2mode), "Call node", 0 );  /* operand M x ref */
 
        /* NoMem nodes are only allowed as memory input if the Call is NOT pinned */
-       ASSERT_AND_RET(
-               (get_irn_op(get_Call_mem(n)) == op_NoMem) ||
-               (get_irn_op(get_Call_mem(n)) != op_NoMem && get_irn_pinned(n) == op_pin_state_pinned),
-               "Call node with wrong memory input", 0 );
+       ASSERT_AND_RET(verify_right_pinned(n),"Call node with wrong memory input", 0 );
 
        mt = get_Call_type(n);
        if(get_unknown_type() == mt) {
@@ -1097,7 +1165,7 @@ static int verify_node_Call(ir_node *n, ir_graph *irg) {
        }
 
        for (i = get_Call_n_params(n) - 1; i >= 0; --i) {
-               ASSERT_AND_RET( mode_is_data(get_irn_mode(get_Call_param(n, i))), "Call node", 0 );  /* operand datai */
+               ASSERT_AND_RET( mode_is_datab(get_irn_mode(get_Call_param(n, i))), "Call node", 0 );  /* operand datai */
        }
 
        ASSERT_AND_RET( mymode == mode_T, "Call result not a tuple", 0 );   /* result T */
@@ -1108,32 +1176,37 @@ 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++) {
                ir_type *t = get_method_param_type(mt, i);
 
-               if (is_atomic_type(t)) {
-                       ASSERT_AND_RET_DBG(
-                               get_irn_mode(get_Call_param(n, i)) == get_type_mode(t),
-                               "Mode of arg for Call doesn't match mode of arg type.", 0,
-                               show_call_param(n, mt);
-                       );
-               } else {
-                       /* call with a compound type, mode must be reference */
-                       ASSERT_AND_RET_DBG(
-                               mode_is_reference(get_irn_mode(get_Call_param(n, i))),
-                               "Mode of arg for Call doesn't match mode of arg type.", 0,
-                               show_call_param(n, mt);
-                       );
+               if (get_irg_phase_state(irg) != phase_backend) {
+                       if (is_atomic_type(t)) {
+                               ASSERT_AND_RET_DBG(
+                                       get_irn_mode(get_Call_param(n, i)) == get_type_mode(t),
+                                       "Mode of arg for Call doesn't match mode of arg type.", 0,
+                                       show_call_param(n, mt);
+                               );
+                       } else {
+                               /* call with a compound type, mode must be reference */
+                               ASSERT_AND_RET_DBG(
+                                       mode_is_reference(get_irn_mode(get_Call_param(n, i))),
+                                       "Mode of arg for Call doesn't match mode of arg type.", 0,
+                                       show_call_param(n, mt);
+                               );
+                       }
                }
        }
 
@@ -1154,11 +1227,12 @@ 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));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                (
                        /* common Add: BB x numP x numP --> numP */
-                       (op1mode == mymode && op2mode == op1mode && mode_is_numP(mymode)) ||
+                       (op1mode == mymode && op2mode == op1mode && mode_is_data(mymode)) ||
                        /* Pointer Add: BB x ref x int --> ref */
                        (mode_is_reference(op1mode) && mode_is_int(op2mode) && op1mode == mymode) ||
                        /* Pointer Add: BB x int x ref --> ref */
@@ -1179,22 +1253,20 @@ 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));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                (
                        /* common Sub: BB x numP x numP --> numP */
-                       (mymode ==op1mode && mymode == op2mode && mode_is_numP(op1mode)) ||
+                       (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;
@@ -1206,6 +1278,7 @@ static int verify_node_Sub(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;
 
        ASSERT_AND_RET_DBG(
                /* Minus: BB x num --> num */
@@ -1222,21 +1295,43 @@ 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));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                (
-                       /* Mul: BB x int1 x int1 --> int2 */
-                       (mode_is_int(op1mode)   && op2mode == op1mode && mode_is_int(mymode)) ||
+                       /* Mul: BB x int_n x int_n --> int_n|int_2n */
+                       (mode_is_int(op1mode)   && op2mode == op1mode && mode_is_int(mymode) &&
+                        (op1mode == mymode || get_mode_size_bits(op1mode) * 2 == get_mode_size_bits(mymode))) ||
                        /* Mul: BB x float x float --> float */
                        (mode_is_float(op1mode) && op2mode == op1mode && mymode == op1mode)
                ),
                "Mul node",0,
-               show_binop_failure(n, "/* Mul: BB x int1 x int1 --> int2 */ |\n"
+               show_binop_failure(n, "/* Mul: BB x int_n x int_n --> int_n|int_2n */ |\n"
                "/* Mul: BB x float x float --> float */");
        );
        return 1;
 }
 
+/**
+ * verify a Mulh node
+ */
+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));
+       (void) irg;
+
+       ASSERT_AND_RET_DBG(
+               (
+                       /* Mulh: BB x int x int --> int */
+                       (mode_is_int(op1mode) && op2mode == op1mode && op1mode == mymode)
+               ),
+               "Mulh node",0,
+               show_binop_failure(n, "/* Mulh: BB x int x int --> int */");
+       );
+       return 1;
+}
+
 /**
  * verify a Quot node
  */
@@ -1245,6 +1340,7 @@ static int verify_node_Quot(ir_node *n, ir_graph *irg) {
        ir_mode *op1mode = get_irn_mode(get_Quot_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Quot_left(n));
        ir_mode *op3mode = get_irn_mode(get_Quot_right(n));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                /* Quot: BB x M x float x float --> M x X x float */
@@ -1265,6 +1361,7 @@ static int verify_node_DivMod(ir_node *n, ir_graph *irg) {
        ir_mode *op1mode = get_irn_mode(get_DivMod_mem(n));
        ir_mode *op2mode = get_irn_mode(get_DivMod_left(n));
        ir_mode *op3mode = get_irn_mode(get_DivMod_right(n));
+       (void) irg;
 
        ASSERT_AND_RET(
                /* DivMod: BB x M x int x int --> M x X x int x int */
@@ -1285,6 +1382,7 @@ static int verify_node_Div(ir_node *n, ir_graph *irg) {
        ir_mode *op1mode = get_irn_mode(get_Div_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Div_left(n));
        ir_mode *op3mode = get_irn_mode(get_Div_right(n));
+       (void) irg;
 
        ASSERT_AND_RET(
                /* Div: BB x M x int x int --> M x X x int */
@@ -1305,6 +1403,7 @@ static int verify_node_Mod(ir_node *n, ir_graph *irg) {
        ir_mode *op1mode = get_irn_mode(get_Mod_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Mod_left(n));
        ir_mode *op3mode = get_irn_mode(get_Mod_right(n));
+       (void) irg;
 
        ASSERT_AND_RET(
                /* Mod: BB x M x int x int --> M x X x int */
@@ -1323,6 +1422,7 @@ static int verify_node_Mod(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;
 
        ASSERT_AND_RET_DBG(
                /* Abs: BB x num --> num */
@@ -1341,6 +1441,7 @@ 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));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                /* And or Or or Eor: BB x int x int --> int */
@@ -1363,10 +1464,11 @@ static int verify_node_Logic(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;
 
        ASSERT_AND_RET_DBG(
                /* Not: BB x int --> int */
-               mode_is_int(mymode) &&
+               (mode_is_int(mymode) || mymode == mode_b) &&
                mymode == op1mode,
                "Not node", 0,
                show_unop_failure(n, "/* Not: BB x int --> int */");
@@ -1381,10 +1483,11 @@ 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));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                /* Cmp: BB x datab x datab --> b16 */
-               mode_is_data (op1mode) &&
+               mode_is_datab(op1mode) &&
                op2mode == op1mode &&
                mymode == mode_T,
                "Cmp node", 0,
@@ -1400,6 +1503,7 @@ 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));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                /* Shl, Shr or Shrs: BB x int x int_u --> int */
@@ -1418,20 +1522,21 @@ 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;
 }
@@ -1442,12 +1547,13 @@ static int verify_node_Rot(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;
 
        ASSERT_AND_RET_DBG(
-               /* Conv: BB x datab1 --> datab2 */
-               mode_is_datab(op1mode) && mode_is_data(mymode),
+               get_irg_phase_state(irg) == phase_backend ||
+               (mode_is_datab(op1mode) && mode_is_data(mymode)),
                "Conv node", 0,
-               show_unop_failure(n, "/* Conv: BB x datab1 --> datab2 */");
+               show_unop_failure(n, "/* Conv: BB x datab --> data */");
        );
        return 1;
 }
@@ -1458,6 +1564,7 @@ static int verify_node_Conv(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;
 
        ASSERT_AND_RET_DBG(
                /* Conv: BB x datab1 --> datab2 */
@@ -1475,9 +1582,12 @@ 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;
 
-       if (! is_Bad(block) && get_irg_phase_state(get_irn_irg(n)) != phase_building) {
-               /* a Phi node MUST have the same number of inputs as its block */
+       /* 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) {
                ASSERT_AND_RET_DBG(
                        get_irn_arity(n) == get_irn_arity(block),
                        "wrong number of inputs in Phi node", 0,
@@ -1486,9 +1596,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,
@@ -1496,7 +1606,7 @@ static int verify_node_Phi(ir_node *n, ir_graph *irg) {
                        );
                }
        }
-       ASSERT_AND_RET( mode_is_dataM(mymode), "Phi node", 0 );
+       ASSERT_AND_RET(mode_is_dataM(mymode) || mymode == mode_b, "Phi node", 0 );
 
        if (mymode == mode_M) {
                for (i = get_Phi_n_preds(n) - 1; i >= 0; --i) {
@@ -1530,8 +1640,12 @@ 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) {
+       (void) n;
+       (void) irg;
+#ifdef INTERPROCEDURAL_VIEW
        ASSERT_AND_RET((get_irp_ip_view_state() != ip_view_no),
                "Filter may only appear if ip view is constructed.", 0);
+#endif
        /* We should further do tests as for Proj and Phi. */
        return 1;
 }
@@ -1547,9 +1661,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 );
 
@@ -1582,12 +1693,9 @@ static int verify_node_Store(ir_node *n, ir_graph *irg) {
        ir_mode *op2mode = get_irn_mode(get_Store_ptr(n));
        ir_mode *op3mode = get_irn_mode(get_Store_value(n));
 
-       ASSERT_AND_RET(op1mode == mode_M && mode_is_data(op3mode), "Store node", 0 );
+       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);
 
@@ -1612,6 +1720,7 @@ 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));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                /* Alloc: BB x M x int_u --> M x X x ref */
@@ -1620,7 +1729,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;
 }
@@ -1633,6 +1742,7 @@ static int verify_node_Free(ir_node *n, ir_graph *irg) {
        ir_mode *op1mode = get_irn_mode(get_Free_mem(n));
        ir_mode *op2mode = get_irn_mode(get_Free_ptr(n));
        ir_mode *op3mode = get_irn_mode(get_Free_size(n));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                /* Free: BB x M x ref x int_u --> M */
@@ -1652,6 +1762,7 @@ static int verify_node_Free(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;
 
        /* Sync: BB x M^n --> M */
        for (i = get_Sync_n_preds(n) - 1; i >= 0; --i) {
@@ -1668,6 +1779,7 @@ 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));
+       (void) irg;
 
        ASSERT_AND_RET_DBG(
                /* Confirm: BB x T x T --> T */
@@ -1687,13 +1799,14 @@ static int verify_node_Mux(ir_node *n, ir_graph *irg) {
        ir_mode *op1mode = get_irn_mode(get_Mux_sel(n));
        ir_mode *op2mode = get_irn_mode(get_Mux_true(n));
        ir_mode *op3mode = get_irn_mode(get_Mux_false(n));
+       (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_numP(mymode),
+               mode_is_datab(mymode),
                "Mux node", 0
                );
        return 1;
@@ -1714,11 +1827,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(
@@ -1727,10 +1835,7 @@ static int verify_node_CopyB(ir_node *n, ir_graph *irg) {
 
        /* NoMem nodes are only allowed as memory input if the CopyB is NOT pinned.
           This should happen RARELY, as CopyB COPIES MEMORY */
-       ASSERT_AND_RET(
-               (get_irn_op(get_CopyB_mem(n)) == op_NoMem) ||
-               (get_irn_op(get_CopyB_mem(n)) != op_NoMem && get_irn_pinned(n) == op_pin_state_pinned),
-               "CopyB node with wrong memory input", 0 );
+       ASSERT_AND_RET(verify_right_pinned(n), "CopyB node with wrong memory input", 0 );
        return 1;
 }
 
@@ -1743,6 +1848,7 @@ static int verify_node_Bound(ir_node *n, ir_graph *irg) {
        ir_mode *op2mode = get_irn_mode(get_Bound_index(n));
        ir_mode *op3mode = get_irn_mode(get_Bound_lower(n));
        ir_mode *op4mode = get_irn_mode(get_Bound_upper(n));
+       (void) irg;
 
        /* Bound: BB x M x int x int x int --> M x X */
        ASSERT_AND_RET(
@@ -1764,8 +1870,18 @@ 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) {
+       if (is_Block(use)) {
+               ir_node *mbh = get_Block_MacroBlock(use);
+
+               if (mbh != use) {
+                       /* must be a partBlock */
+                       if (is_Block(mbh)) {
+                               ASSERT_AND_RET(block_dominates(mbh, use), "MacroBlock header must dominate a partBlock", 0);
+                       }
+               }
+       }
        /* This won't work for blocks and the end node */
-       if (!is_Block(use) && use != get_irg_end(current_ir_graph)) {
+       else if (use != get_irg_end(current_ir_graph) && use != current_ir_graph->anchor) {
                int i;
                ir_node *bl = get_nodes_block(use);
 
@@ -1811,16 +1927,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));
                }
        }
 
@@ -1828,11 +1950,21 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg) {
 
        /* We don't want to test nodes whose predecessors are Bad,
           as we would have to special case that for each operation. */
-       if (op != op_Phi && op != op_Block)
+       if (op != op_Phi && op != op_Block) {
                for (i = get_irn_arity(n) - 1; i >= 0; --i) {
                        if (is_Bad(get_irn_n(n, i)))
                                return 1;
                }
+       }
+
+       if (_get_op_pinned(op) >= op_pin_state_exc_pinned) {
+               op_pin_state state = get_irn_pinned(n);
+               ASSERT_AND_RET_DBG(
+                       state == op_pin_state_floats ||
+                       state == op_pin_state_pinned,
+                       "invalid pin state", 0,
+                       ir_printf("node %+F", n));
+       }
 
        if (op->ops.verify_node)
                return op->ops.verify_node(n, irg);
@@ -1842,11 +1974,12 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg) {
 }
 
 int irn_vrfy(ir_node *n) {
-       int res = 1;
 #ifdef DEBUG_libfirm
-       res = irn_vrfy_irg(n, current_ir_graph);
+       return irn_vrfy_irg(n, current_ir_graph);
+#else
+       (void)n;
+       return 1;
 #endif
-       return res;
 }
 
 /*-----------------------------------------------------------------*/
@@ -1859,7 +1992,7 @@ int irn_vrfy(ir_node *n) {
  */
 static void vrfy_wrap(ir_node *node, void *env) {
        int *res = env;
-       *res = irn_vrfy(node);
+       *res = irn_vrfy_irg(node, current_ir_graph);
 }
 
 /**
@@ -1869,9 +2002,10 @@ static void vrfy_wrap(ir_node *node, void *env) {
 static void vrfy_wrap_ssa(ir_node *node, void *env) {
        int *res = env;
 
-       *res = irn_vrfy(node);
-       if (*res)
+       *res = irn_vrfy_irg(node, current_ir_graph);
+       if (*res) {
                *res = check_dominance_for_node(node);
+       }
 }
 
 #endif /* DEBUG_libfirm */
@@ -1888,35 +2022,72 @@ int irg_verify(ir_graph *irg, unsigned flags) {
 
        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");
 
        if (flags & VRFY_ENFORCE_SSA)
                compute_doms(irg);
 
-       irg_walk_graph(
+       irg_walk_anchors(
                irg,
                get_irg_dom_state(irg) == dom_consistent &&
                get_irg_pinned(irg) == op_pin_state_pinned ? vrfy_wrap_ssa : vrfy_wrap,
                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;
 #endif /* DEBUG_libfirm */
 
        return res;
 }
 
+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();
@@ -1960,7 +2131,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");
                                        }
                                }
@@ -1977,21 +2148,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");
                                }
                        }
@@ -2012,7 +2183,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");
                                                }
                                        }
@@ -2026,7 +2197,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");
                                        }
                                }
@@ -2077,6 +2248,7 @@ void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops) {
        CASE(Sub);
        CASE(Minus);
        CASE(Mul);
+       CASE(Mulh);
        CASE(Quot);
        CASE(DivMod);
        CASE(Div);
@@ -2090,7 +2262,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);