no unnecessary and cryptic abreviations: rename vrfy to verify
authorMatthias Braun <matze@braunis.de>
Wed, 28 Jul 2010 14:56:54 +0000 (14:56 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 28 Jul 2010 14:56:54 +0000 (14:56 +0000)
[r27836]

41 files changed:
include/libfirm/Makefile.am
include/libfirm/firm.h
include/libfirm/ircons.h
include/libfirm/irverify.h [new file with mode: 0644]
include/libfirm/irvrfy.h [deleted file]
include/libfirm/typerep.h
ir/ana/rta.c
ir/be/TEMPLATE/TEMPLATE_new_nodes.c
ir/be/TEMPLATE/TEMPLATE_transform.c
ir/be/amd64/amd64_new_nodes.c
ir/be/amd64/amd64_transform.c
ir/be/arm/arm_new_nodes.c
ir/be/arm/arm_transform.c
ir/be/be_t.h
ir/be/bemain.c
ir/be/beprefalloc.c
ir/be/ia32/ia32_new_nodes.c
ir/be/ia32/ia32_transform.c
ir/be/scripts/generate_new_opcodes.pl
ir/be/sparc/sparc_new_nodes.c
ir/be/sparc/sparc_transform.c
ir/ir/irarch.c
ir/ir/ircons.c
ir/ir/irdump.c
ir/ir/iredges.c
ir/ir/irgmod.c
ir/ir/irop.c
ir/ir/iropt.c
ir/ir/irpass.c
ir/ir/irverify.c [new file with mode: 0644]
ir/ir/irverify_t.h [new file with mode: 0644]
ir/ir/irvrfy.c [deleted file]
ir/ir/irvrfy_t.h [deleted file]
ir/lower/lower_intrinsics.c
ir/lower/lower_mux.c
ir/opt/cfopt.c
ir/opt/funccall.c
ir/opt/ldstopt.c
ir/tr/trverify.c [new file with mode: 0644]
ir/tr/trvrfy.c [deleted file]
scripts/gen_ir.py

index 9aaf454..3827698 100644 (file)
@@ -49,7 +49,7 @@ libfirminclude_HEADERS = \
        irprog.h \
        irsimpletype.h \
        irtypeinfo.h \
-       irvrfy.h \
+       irverify.h \
        lowering.h \
        rta.h \
        seqnumbers.h \
index 9e320a0..71d824e 100644 (file)
 #include "irprog.h"
 #include "irsimpletype.h"
 #include "irtypeinfo.h"
-#include "irvrfy.h"
+#include "irverify.h"
 #include "lowering.h"
 #include "rta.h"
 #include "seqnumbers.h"
index 0428f9a..427b8d6 100644 (file)
  *    --------------------------------------------
  *
  *    Creates a new Block with the given list of predecessors.  This block
- *    is mature.  As other constructors calls optimization and vrfy for the
+ *    is mature.  As other constructors calls optimization and verify for the
  *    block.  If one of the predecessors is Unknown (as it has to be filled in
  *    later) optimizations are skipped.  This is necessary to
  *    construct Blocks in loops.
diff --git a/include/libfirm/irverify.h b/include/libfirm/irverify.h
new file mode 100644 (file)
index 0000000..ce6c0e4
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 1995-2009 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/**
+ * @file
+ * @brief    Check irnodes for correctness.
+ * @author   Christian Schaefer, Goetz Lindenmaier, Till Riedel
+ * @version  $Id$
+ */
+#ifndef FIRM_IR_IRVERIFY_H
+#define FIRM_IR_IRVERIFY_H
+
+#include "firm_types.h"
+#include "begin.h"
+
+/**
+ * Tests the modes of checknode and its predecessors.
+ * checknode must be in current_ir_graph.
+ *
+ * @return NON-zero on success
+ */
+FIRM_API int irn_verify(ir_node *checknode);
+
+/**
+ * Tests the modes of checknode and its predecessors.
+ * checknode must be in given ir_graph.
+ *
+ * @return NON-zero on success
+ */
+FIRM_API int irn_verify_irg(ir_node *checknode, ir_graph *irg);
+
+/**
+ * Same as irn_verify_irg, but temporary sets verification mode to
+ * NODE_VERIFICATION_ERROR_ONLY.
+ * @return NON-zero on success
+ */
+FIRM_API int irn_verify_irg_dump(ir_node *checknode, ir_graph *irg, const char **bad_string);
+
+/**
+ * Flags for irg_verify().
+ */
+typedef enum _irg_verify_flags_t {
+       VERIFY_NORMAL      = 0,      /**< check SSA property only if dominance information is available */
+       VERIFY_ENFORCE_SSA = 1       /**< check SSA property by enforcing the dominance information recalculation */
+} irg_verify_flags_t;
+
+/**
+ * Calls irn_verify() for each node in irg.
+ * Graph must be in state "op_pin_state_pinned".
+ *
+ * @param irg    the IR-graph t check
+ * @param flags  one of irg_verify_flags_t
+ *
+ * @return NON-zero on success.
+ */
+FIRM_API int irg_verify(ir_graph *irg, unsigned flags);
+
+/**
+ * Creates an ir_graph pass for irg_verify().
+ *
+ * @param name   the name of this pass or NULL
+ * @param flags  one of irg_verify_flags_t
+ *
+ * @return  the newly created ir_graph pass
+ */
+FIRM_API ir_graph_pass_t *irg_verify_pass(const char *name, unsigned flags);
+
+/**
+ * Possible flags for irg_verify_bads().
+ */
+enum verify_bad_flags_t {
+       BAD_CF      = 1,    /**< Bad nodes are allowed as predecessors of Blocks and Phis. */
+       BAD_DF      = 2,    /**< Bad nodes are allowed as dataflow predecessors. */
+       BAD_BLOCK   = 4,    /**< Bad nodes are allowed as Block input. */
+       TUPLE       = 8     /**< Tuple nodes are allowed. */
+};
+
+/**
+ * Verify occurrence of bad nodes in a graph.
+ *
+ * @param irg    The graph to verify
+ * @param flags  combination of verify_bad_flags_t flags describing
+ *               which Bads are allowed
+ * @returns      a value combined of verify_bad_flags_t indicating the problems found.
+ */
+FIRM_API int irg_verify_bads(ir_graph *irg, int flags);
+
+/**
+ *  Enable/disable verification of Load/Store nodes with
+ *  its entities. If disabled, Store(SymConst(array)) will be allowed
+ *  (C-frontend builds this :-)
+ */
+FIRM_API void verify_enable_entity_tests(int enable);
+
+#include "end.h"
+
+#endif
diff --git a/include/libfirm/irvrfy.h b/include/libfirm/irvrfy.h
deleted file mode 100644 (file)
index 4ff8122..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 1995-2009 University of Karlsruhe.  All right reserved.
- *
- * This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
- */
-
-/**
- * @file
- * @brief    Check irnodes for correctness.
- * @author   Christian Schaefer, Goetz Lindenmaier, Till Riedel
- * @version  $Id$
- */
-#ifndef FIRM_IR_IRVRFY_H
-#define FIRM_IR_IRVRFY_H
-
-#include "firm_types.h"
-#include "begin.h"
-
-/**
- * Tests the modes of checknode and its predecessors.
- * checknode must be in current_ir_graph.
- *
- * @return
- *     NON-zero on success
- */
-FIRM_API int irn_vrfy(ir_node *checknode);
-
-/**
- * Tests the modes of checknode and its predecessors.
- * checknode must be in given ir_graph.
- *
- * @return
- *     NON-zero on success
- */
-FIRM_API int irn_vrfy_irg(ir_node *checknode, ir_graph *irg);
-
-/**
- * Same as irn_vrfy_irg, but temporary sets verification mode to
- * NODE_VERIFICATION_ERROR_ONLY.
- * @return
- *     NON-zero on success
- */
-FIRM_API int irn_vrfy_irg_dump(ir_node *checknode, ir_graph *irg, const char **bad_string);
-
-/**
- * Flags for irg_verify().
- */
-typedef enum _irg_verify_flags_t {
-       VRFY_NORMAL      = 0,      /**< check SSA property only if dominance information is available */
-       VRFY_ENFORCE_SSA = 1       /**< check SSA property by enforcing the dominance information recalculation */
-} irg_verify_flags_t;
-
-/**
- * Calls irn_vrfy() for each node in irg.
- * Graph must be in state "op_pin_state_pinned".
- *
- * @param irg    the IR-graph t check
- * @param flags  one of irg_verify_flags_t
- *
- * @return
- *     NON-zero on success.
- */
-FIRM_API int irg_verify(ir_graph *irg, unsigned flags);
-
-/**
- * Compatibility macro. Deprecated soon.
- */
-#define irg_vrfy(irg) irg_verify(irg, 0)
-
-/**
- * Creates an ir_graph pass for irg_verify().
- *
- * @param name   the name of this pass or NULL
- * @param flags  one of irg_verify_flags_t
- *
- * @return  the newly created ir_graph pass
- */
-FIRM_API ir_graph_pass_t *irg_verify_pass(const char *name, unsigned flags);
-
-/**
- * Possible flags for irg_vrfy_bads().
- */
-enum verify_bad_flags_t {
-       BAD_CF      = 1,    /**< Bad nodes are allowed as predecessors of Blocks and Phis. */
-       BAD_DF      = 2,    /**< Bad nodes are allowed as dataflow predecessors. */
-       BAD_BLOCK   = 4,    /**< Bad nodes are allowed as Block input. */
-       TUPLE       = 8     /**< Tuple nodes are allowed. */
-};
-
-/**
- * Verify occurrence of bad nodes in a graph.
- *
- * @param irg    The graph to verify
- * @param flags  combination of verify_bad_flags_t flags describing
- *               which Bads are allowed
- * @returns      a value combined of verify_bad_flags_t indicating the problems found.
- */
-FIRM_API int irg_vrfy_bads(ir_graph *irg, int flags);
-
-/**
- *  Enable/disable verification of Load/Store nodes with
- *  its entities. If disabled, Store(SymConst(array)) will be allowed
- *  (C-frontend builds this :-)
- */
-FIRM_API void vrfy_enable_entity_tests(int enable);
-
-#include "end.h"
-
-#endif
index e196eb2..523e060 100644 (file)
@@ -1019,9 +1019,9 @@ FIRM_API ir_class_cast_state get_irp_class_cast_state(void);
 FIRM_API void verify_irg_class_cast_state(ir_graph *irg);
 
 /**
- * possible trvrfy() error codes
+ * possible trverify() error codes
  */
-enum trvrfy_error_codes {
+enum trverify_error_codes {
        no_error = 0,                      /**< no error */
        error_ent_not_cont,                /**< overwritten entity not in superclass */
        error_null_mem,                    /**< compound contains NULL member */
@@ -1048,7 +1048,7 @@ FIRM_API int check_type(ir_type *tp);
  *
  * @return
  *  0   if no error encountered
- *  != 0    a trvrfy_error_codes code
+ *  != 0    a trverify_error_codes code
  */
 FIRM_API int check_entity(ir_entity *ent);
 
@@ -1064,7 +1064,7 @@ FIRM_API int check_entity(ir_entity *ent);
  *    0 if graph is correct
  *    else error code.
  */
-FIRM_API int tr_vrfy(void);
+FIRM_API int tr_verify(void);
 
 /**
  * @page type   representation of types
index c4cc9c0..f87a109 100644 (file)
@@ -38,7 +38,7 @@
 #include "pset_new.h"
 #include "irgwalk.h"
 #include "irgmod.h"
-#include "irvrfy.h"
+#include "irverify.h"
 #include "irprintf.h"
 #include "debug.h"
 #include "error.h"
@@ -313,9 +313,9 @@ void rta_init(void)
        {
                int i;
                for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
-                       irg_vrfy(get_irp_irg(i));
+                       irg_verify(get_irp_irg(i), 0);
                }
-               tr_vrfy();
+               tr_verify();
        }
 # endif /* defined DEBUG_libfirm */
 
@@ -332,9 +332,9 @@ void rta_init(void)
                int i;
 
                for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
-                       irg_vrfy(get_irp_irg(i));
+                       irg_verify(get_irp_irg(i), 0);
                }
-               tr_vrfy();
+               tr_verify();
        }
 # endif /* defined DEBUG_libfirm */
 }
@@ -402,9 +402,9 @@ void rta_cleanup(void)
 # ifdef DEBUG_libfirm
        int i;
        for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
-               irg_vrfy(get_irp_irg(i));
+               irg_verify(get_irp_irg(i), 0);
        }
-       tr_vrfy();
+       tr_verify();
 # endif /* defined DEBUG_libfirm */
 
        if (_live_classes != NULL) {
index cadba43..4afdaa5 100644 (file)
@@ -35,7 +35,6 @@
 #include "ircons_t.h"
 #include "iropt_t.h"
 #include "irop.h"
-#include "irvrfy_t.h"
 #include "irprintf.h"
 #include "xmalloc.h"
 
@@ -53,7 +52,7 @@
  */
 static void TEMPLATE_dump_node(FILE *F, ir_node *n, dump_reason_t reason)
 {
-       ir_mode *mode = NULL;
+       ir_mode *mode = NULL;
 
        switch (reason) {
        case dump_node_opcode_txt:
index 4d7ccf8..c86fd0e 100644 (file)
@@ -29,7 +29,6 @@
 #include "irmode_t.h"
 #include "irgmod.h"
 #include "iredges.h"
-#include "irvrfy.h"
 #include "ircons.h"
 #include "iropt_t.h"
 #include "debug.h"
index 21ff32d..b6dc152 100644 (file)
@@ -35,7 +35,6 @@
 #include "ircons_t.h"
 #include "iropt_t.h"
 #include "irop.h"
-#include "irvrfy_t.h"
 #include "irprintf.h"
 #include "xmalloc.h"
 
index 35d8175..7aa0576 100644 (file)
@@ -29,7 +29,6 @@
 #include "irmode_t.h"
 #include "irgmod.h"
 #include "iredges.h"
-#include "irvrfy.h"
 #include "ircons.h"
 #include "iropt_t.h"
 #include "error.h"
index 3023c3f..0cd9119 100644 (file)
@@ -37,7 +37,6 @@
 #include "ircons_t.h"
 #include "iropt_t.h"
 #include "irop.h"
-#include "irvrfy_t.h"
 #include "irprintf.h"
 #include "xmalloc.h"
 
index a23ac7e..565ed35 100644 (file)
@@ -30,7 +30,6 @@
 #include "irmode_t.h"
 #include "irgmod.h"
 #include "iredges.h"
-#include "irvrfy.h"
 #include "ircons.h"
 #include "irprintf.h"
 #include "dbginfo.h"
index 1fddd8a..20f219b 100644 (file)
@@ -53,9 +53,9 @@ enum {
 };
 
 enum {
-       BE_VRFY_OFF,
-       BE_VRFY_WARN,
-       BE_VRFY_ASSERT
+       BE_VERIFY_OFF,
+       BE_VERIFY_WARN,
+       BE_VERIFY_ASSERT
 };
 
 enum {
@@ -72,7 +72,7 @@ struct be_options_t {
        int  omit_leaf_fp;        /**< try to omit the frame pointer in leaf routines */
        int  pic;                 /**< create position independent code */
        int  gprof;               /**< create gprof compatible profiling code */
-       int  vrfy_option;         /**< backend verify option */
+       int  verify_option;       /**< backend verify option */
        int  scheduler;           /**< the scheduler */
        char target_os[128];      /**< target operating system name */
        char ilp_server[128];     /**< the ilp server name */
index 7308834..3cf7be6 100644 (file)
@@ -43,7 +43,7 @@
 #include "iredges_t.h"
 #include "irloop_t.h"
 #include "irtools.h"
-#include "irvrfy.h"
+#include "irverify.h"
 #include "irprintf.h"
 #include "iroptimize.h"
 #include "firmstat.h"
@@ -88,7 +88,7 @@ static be_options_t be_options = {
        0,                                 /* try to omit leaf frame pointer */
        0,                                 /* create PIC code */
        0,                                 /* create gprof compatible profiling code */
-       BE_VRFY_WARN,                      /* verification level: warn */
+       BE_VERIFY_WARN,                    /* verification level: warn */
        BE_SCHED_LIST,                     /* scheduler: list scheduler */
        "linux",                           /* target OS name */
        "i44pc52.info.uni-karlsruhe.de",   /* ilp server */
@@ -118,10 +118,10 @@ static const lc_opt_enum_mask_items_t dump_items[] = {
 };
 
 /* verify options. */
-static const lc_opt_enum_int_items_t vrfy_items[] = {
-       { "off",    BE_VRFY_OFF    },
-       { "warn",   BE_VRFY_WARN   },
-       { "assert", BE_VRFY_ASSERT },
+static const lc_opt_enum_int_items_t verify_items[] = {
+       { "off",    BE_VERIFY_OFF    },
+       { "warn",   BE_VERIFY_WARN   },
+       { "assert", BE_VERIFY_ASSERT },
        { NULL,     0 }
 };
 
@@ -138,8 +138,8 @@ static lc_opt_enum_mask_var_t dump_var = {
        &be_options.dump_flags, dump_items
 };
 
-static lc_opt_enum_int_var_t vrfy_var = {
-       &be_options.vrfy_option, vrfy_items
+static lc_opt_enum_int_var_t verify_var = {
+       &be_options.verify_option, verify_items
 };
 
 static lc_opt_enum_int_var_t sched_var = {
@@ -153,7 +153,7 @@ static const lc_opt_table_entry_t be_main_options[] = {
        LC_OPT_ENT_BOOL     ("omitleaffp", "omit frame pointer in leaf routines",                 &be_options.omit_leaf_fp),
        LC_OPT_ENT_BOOL     ("pic",        "create PIC code",                                     &be_options.pic),
        LC_OPT_ENT_BOOL     ("gprof",      "create gprof profiling code",                         &be_options.gprof),
-       LC_OPT_ENT_ENUM_PTR ("verify",     "verify the backend irg",                              &vrfy_var),
+       LC_OPT_ENT_ENUM_PTR ("verify",     "verify the backend irg",                              &verify_var),
        LC_OPT_ENT_BOOL     ("time",       "get backend timing statistics",                       &be_options.timing),
        LC_OPT_ENT_BOOL     ("profile",    "instrument the code for execution count profiling",   &be_options.opt_profile),
        LC_OPT_ENT_ENUM_PTR ("sched",      "select a scheduler",                                  &sched_var),
@@ -355,11 +355,11 @@ static const backend_params be_params = {
 };
 
 /* Perform schedule verification if requested. */
-static void be_sched_vrfy(ir_graph *irg, int vrfy_opt)
+static void be_sched_verify(ir_graph *irg, int verify_opt)
 {
-       if (vrfy_opt == BE_VRFY_WARN) {
+       if (verify_opt == BE_VERIFY_WARN) {
                be_verify_schedule(irg);
-       } else if (vrfy_opt == BE_VRFY_ASSERT) {
+       } else if (verify_opt == BE_VERIFY_ASSERT) {
                assert(be_verify_schedule(irg) && "Schedule verification failed.");
        }
 }
@@ -616,11 +616,11 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
 
                /* Verify the initial graph */
                be_timer_push(T_VERIFY);
-               if (be_options.vrfy_option == BE_VRFY_WARN) {
-                       irg_verify(irg, VRFY_ENFORCE_SSA);
+               if (be_options.verify_option == BE_VERIFY_WARN) {
+                       irg_verify(irg, VERIFY_ENFORCE_SSA);
                        be_check_dominance(irg);
-               } else if (be_options.vrfy_option == BE_VRFY_ASSERT) {
-                       assert(irg_verify(irg, VRFY_ENFORCE_SSA) && "irg verification failed");
+               } else if (be_options.verify_option == BE_VERIFY_ASSERT) {
+                       assert(irg_verify(irg, VERIFY_ENFORCE_SSA) && "irg verification failed");
                        assert(be_check_dominance(irg) && "Dominance verification failed");
                }
                be_timer_pop(T_VERIFY);
@@ -659,9 +659,9 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
 
                dump(DUMP_PREPARED, irg, "before-code-selection");
 
-               if (be_options.vrfy_option == BE_VRFY_WARN) {
+               if (be_options.verify_option == BE_VERIFY_WARN) {
                        be_check_dominance(irg);
-               } else if (be_options.vrfy_option == BE_VRFY_ASSERT) {
+               } else if (be_options.verify_option == BE_VERIFY_ASSERT) {
                        assert(be_check_dominance(irg) && "Dominance verification failed");
                }
 
@@ -670,9 +670,9 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
                arch_code_generator_prepare_graph(birg->cg);
                be_timer_pop(T_CODEGEN);
 
-               if (be_options.vrfy_option == BE_VRFY_WARN) {
+               if (be_options.verify_option == BE_VERIFY_WARN) {
                        be_check_dominance(irg);
-               } else if (be_options.vrfy_option == BE_VRFY_ASSERT) {
+               } else if (be_options.verify_option == BE_VERIFY_ASSERT) {
                        assert(be_check_dominance(irg) && "Dominance verification failed");
                }
 
@@ -714,7 +714,7 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
 
                /* check schedule */
                be_timer_push(T_VERIFY);
-               be_sched_vrfy(irg, be_options.vrfy_option);
+               be_sched_verify(irg, be_options.verify_option);
                be_timer_pop(T_VERIFY);
 
                /* introduce patterns to assure constraints */
@@ -746,7 +746,7 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
 
                /* check schedule */
                be_timer_push(T_VERIFY);
-               be_sched_vrfy(irg, be_options.vrfy_option);
+               be_sched_verify(irg, be_options.verify_option);
                be_timer_pop(T_VERIFY);
 
                stat_ev_if {
@@ -792,13 +792,13 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
 
                /* check schedule and register allocation */
                be_timer_push(T_VERIFY);
-               if (be_options.vrfy_option == BE_VRFY_WARN) {
-                       irg_verify(irg, VRFY_ENFORCE_SSA);
+               if (be_options.verify_option == BE_VERIFY_WARN) {
+                       irg_verify(irg, VERIFY_ENFORCE_SSA);
                        be_check_dominance(irg);
                        be_verify_schedule(irg);
                        be_verify_register_allocation(irg);
-               } else if (be_options.vrfy_option == BE_VRFY_ASSERT) {
-                       assert(irg_verify(irg, VRFY_ENFORCE_SSA) && "irg verification failed");
+               } else if (be_options.verify_option == BE_VERIFY_ASSERT) {
+                       assert(irg_verify(irg, VERIFY_ENFORCE_SSA) && "irg verification failed");
                        assert(be_check_dominance(irg) && "Dominance verification failed");
                        assert(be_verify_schedule(irg) && "Schedule verification failed");
                        assert(be_verify_register_allocation(irg)
index 3b78684..583d7ea 100644 (file)
@@ -1985,10 +1985,10 @@ static void be_pref_alloc(ir_graph *new_irg)
 
                /* verify schedule and register pressure */
                be_timer_push(T_VERIFY);
-               if (be_get_irg_options(irg)->vrfy_option == BE_VRFY_WARN) {
+               if (be_get_irg_options(irg)->verify_option == BE_VERIFY_WARN) {
                        be_verify_schedule(irg);
                        be_verify_register_pressure(irg, cls);
-               } else if (be_get_irg_options(irg)->vrfy_option == BE_VRFY_ASSERT) {
+               } else if (be_get_irg_options(irg)->verify_option == BE_VERIFY_ASSERT) {
                        assert(be_verify_schedule(irg) && "Schedule verification failed");
                        assert(be_verify_register_pressure(irg, cls)
                                && "Register pressure verification failed");
@@ -2013,9 +2013,9 @@ static void be_pref_alloc(ir_graph *new_irg)
        be_timer_pop(T_RA_SPILL_APPLY);
 
        be_timer_push(T_VERIFY);
-       if (be_get_irg_options(irg)->vrfy_option == BE_VRFY_WARN) {
+       if (be_get_irg_options(irg)->verify_option == BE_VERIFY_WARN) {
                be_verify_register_allocation(irg);
-       } else if (be_get_irg_options(irg)->vrfy_option == BE_VRFY_ASSERT) {
+       } else if (be_get_irg_options(irg)->verify_option == BE_VERIFY_ASSERT) {
                assert(be_verify_register_allocation(irg)
                       && "Register allocation invalid");
        }
index 1b45e45..08ac0f4 100644 (file)
@@ -38,7 +38,7 @@
 #include "ircons_t.h"
 #include "iropt_t.h"
 #include "irop.h"
-#include "irvrfy_t.h"
+#include "irverify_t.h"
 #include "irprintf.h"
 #include "iredges.h"
 #include "error.h"
index f580cc9..df6a9b3 100644 (file)
@@ -38,7 +38,6 @@
 #include "irprog_t.h"
 #include "iredges_t.h"
 #include "irgmod.h"
-#include "irvrfy.h"
 #include "ircons.h"
 #include "irgwalk.h"
 #include "irprintf.h"
index f08371d..9dc3948 100755 (executable)
@@ -465,7 +465,7 @@ EOF
        $temp .= <<EOF;
        /* optimize node */
        res = optimize_node(res);
-       irn_vrfy_irg(res, current_ir_graph);
+       irn_verify_irg(res, current_ir_graph);
 
        return res;
 EOF
@@ -704,7 +704,9 @@ push(@obst_enum_op, "\n} $arch\_opcodes;\n\n");
 
 open(OUT, ">$target_c") || die("Fatal error: Could not open $target_c, reason: $!\n");
 
-print OUT "#include \"gen_$arch\_regalloc_if.h\"\n\n";
+print OUT "#include \"gen_$arch\_regalloc_if.h\"\n";
+print OUT "#include \"irverify_t.h\"\n";
+print OUT "\n";
 print OUT @obst_cmp_attr;
 print OUT "\n";
 print OUT @obst_opvar;
index eb5d9e4..47ad2f9 100644 (file)
@@ -35,7 +35,6 @@
 #include "ircons_t.h"
 #include "iropt_t.h"
 #include "irop.h"
-#include "irvrfy_t.h"
 #include "irprintf.h"
 #include "xmalloc.h"
 
index ad7a729..78ec7bb 100644 (file)
@@ -29,7 +29,6 @@
 #include "irmode_t.h"
 #include "irgmod.h"
 #include "iredges.h"
-#include "irvrfy.h"
 #include "ircons.h"
 #include "irprintf.h"
 #include "dbginfo.h"
index b650a3e..c571a37 100644 (file)
@@ -38,7 +38,7 @@
 #include "iropt_t.h"
 #include "ircons_t.h"
 #include "irgmod.h"
-#include "irvrfy.h"
+#include "irverify.h"
 #include "tv_t.h"
 #include "dbginfo_t.h"
 #include "iropt_dbg.h"
 
 #define MAX_BITSTR 64
 
-/* when we need verifying */
-#ifdef NDEBUG
-# define IRN_VRFY_IRG(res, irg)
-#else
-# define IRN_VRFY_IRG(res, irg)  irn_vrfy_irg(res, irg)
-#endif
-
 /** The params got from the factory in arch_dep_init(...). */
 static const ir_settings_arch_dep_t *params = NULL;
 
index 8fcb15d..cb3ab44 100644 (file)
@@ -32,7 +32,7 @@
 #include "irnode_t.h"
 #include "irmode_t.h"
 #include "ircons_t.h"
-#include "irvrfy.h"
+#include "irverify.h"
 #include "irop_t.h"
 #include "iropt_t.h"
 #include "irgmod.h"
@@ -46,9 +46,9 @@
 
 /* when we need verifying */
 #ifdef NDEBUG
-# define IRN_VRFY_IRG(res, irg)
+# define IRN_VERIFY_IRG(res, irg)
 #else
-# define IRN_VRFY_IRG(res, irg)  irn_vrfy_irg(res, irg)
+# define IRN_VERIFY_IRG(res, irg)  irn_verify_irg(res, irg)
 #endif /* NDEBUG */
 
 /**
  */
 static uninitialized_local_variable_func_t *default_initialize_local_variable = NULL;
 
-/* creates a bd constructor for a binop */
-#define NEW_BD_BINOP(instr)                                     \
-static ir_node *                                                \
-new_bd_##instr(dbg_info *db, ir_node *block,                    \
-       ir_node *op1, ir_node *op2, ir_mode *mode)               \
-{                                                               \
-  ir_node  *in[2];                                              \
-  ir_node  *res;                                                \
-  ir_graph *irg = current_ir_graph;                             \
-  in[0] = op1;                                                  \
-  in[1] = op2;                                                  \
-  res = new_ir_node(db, irg, block, op_##instr, mode, 2, in);   \
-  res = optimize_node(res);                                     \
-  IRN_VRFY_IRG(res, irg);                                       \
-  return res;                                                   \
-}
-
-/* creates a bd constructor for an unop */
-#define NEW_BD_UNOP(instr)                                      \
-static ir_node *                                                \
-new_bd_##instr(dbg_info *db, ir_node *block,                    \
-              ir_node *op, ir_mode *mode)                       \
-{                                                               \
-  ir_node  *res;                                                \
-  ir_graph *irg = current_ir_graph;                             \
-  res = new_ir_node(db, irg, block, op_##instr, mode, 1, &op);  \
-  res = optimize_node(res);                                     \
-  IRN_VRFY_IRG(res, irg);                                       \
-  return res;                                                   \
-}
-
-/* creates a bd constructor for an divop */
-#define NEW_BD_DIVOP(instr)                                     \
-static ir_node *                                                \
-new_bd_##instr(dbg_info *db, ir_node *block,                    \
-            ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) \
-{                                                               \
-  ir_node  *in[3];                                              \
-  ir_node  *res;                                                \
-  ir_graph *irg = current_ir_graph;                             \
-  in[0] = memop;                                                \
-  in[1] = op1;                                                  \
-  in[2] = op2;                                                  \
-  res = new_ir_node(db, irg, block, op_##instr, mode_T, 3, in); \
-  res->attr.divmod.exc.pin_state = state;                       \
-  res->attr.divmod.resmode = mode;                              \
-  res->attr.divmod.no_remainder = 0;                            \
-  res = optimize_node(res);                                     \
-  IRN_VRFY_IRG(res, irg);                                       \
-  return res;                                                   \
-}
-
-/* creates a rd constructor for a binop */
-#define NEW_RD_BINOP(instr)                                     \
-ir_node *                                                       \
-new_rd_##instr(dbg_info *db, ir_graph *irg, ir_node *block,     \
-       ir_node *op1, ir_node *op2, ir_mode *mode)               \
-{                                                               \
-  ir_node  *res;                                                \
-  ir_graph *rem = current_ir_graph;                             \
-  current_ir_graph = irg;                                       \
-  res = new_bd_##instr(db, block, op1, op2, mode);              \
-  current_ir_graph = rem;                                       \
-  return res;                                                   \
-}
-
-/* creates a rd constructor for an unop */
-#define NEW_RD_UNOP(instr)                                      \
-ir_node *                                                       \
-new_rd_##instr(dbg_info *db, ir_graph *irg, ir_node *block,     \
-              ir_node *op, ir_mode *mode)                       \
-{                                                               \
-  ir_node  *res;                                                \
-  ir_graph *rem = current_ir_graph;                             \
-  current_ir_graph = irg;                                       \
-  res = new_bd_##instr(db, block, op, mode);                    \
-  current_ir_graph = rem;                                       \
-  return res;                                                   \
-}
-
-/* creates a rd constructor for an divop */
-#define NEW_RD_DIVOP(instr)                                     \
-ir_node *                                                       \
-new_rd_##instr(dbg_info *db, ir_graph *irg, ir_node *block,     \
-            ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state) \
-{                                                               \
-  ir_node  *res;                                                \
-  ir_graph *rem = current_ir_graph;                             \
-  current_ir_graph = irg;                                       \
-  res = new_bd_##instr(db, block, memop, op1, op2, mode, state);\
-  current_ir_graph = rem;                                       \
-  return res;                                                   \
-}
-
-/* creates a d constructor for an binop */
-#define NEW_D_BINOP(instr)                                                    \
-ir_node *                                                                     \
-new_d_##instr(dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode) {      \
-  return new_bd_##instr(db, current_ir_graph->current_block, op1, op2, mode); \
-}
-
-/* creates a d constructor for an unop */
-#define NEW_D_UNOP(instr)                                                     \
-ir_node *                                                                     \
-new_d_##instr(dbg_info *db, ir_node *op, ir_mode *mode) {                     \
-  return new_bd_##instr(db, current_ir_graph->current_block, op, mode);       \
-}
-
 #include "gen_ir_cons.c.inl"
 
 static ir_node *new_bd_Start(dbg_info *db, ir_node *block)
@@ -173,7 +65,7 @@ static ir_node *new_bd_Start(dbg_info *db, ir_node *block)
 
        res = new_ir_node(db, irg, block, op_Start, mode_T, 0, NULL);
 
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
        return res;
 }  /* new_bd_Start */
 
@@ -184,7 +76,7 @@ static ir_node *new_bd_End(dbg_info *db, ir_node *block)
 
        res = new_ir_node(db, irg, block, op_End, mode_X, -1, NULL);
 
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
        return res;
 }  /* new_bd_End */
 
@@ -215,7 +107,7 @@ static ir_node *new_bd_Phi(dbg_info *db, ir_node *block, int arity, ir_node **in
                }
 
        if (!has_unknown) res = optimize_node(res);
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
 
        /* Memory Phis in endless loops must be kept alive.
           As we can't distinguish these easily we keep all of them alive. */
@@ -234,7 +126,7 @@ static ir_node *new_bd_Const_type(dbg_info *db, tarval *con, ir_type *tp)
        set_Const_type(res, tp);  /* Call method because of complex assertion. */
        res = optimize_node (res);
        assert(get_Const_type(res) == tp);
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
 
        return res;
 }  /* new_bd_Const_type */
@@ -286,7 +178,7 @@ static ir_node *new_bd_Sel(dbg_info *db, ir_node *block, ir_node *store,
        res = new_ir_node(db, irg, block, op_Sel, mode, r_arity, r_in);
        res->attr.sel.entity = ent;
        res = optimize_node(res);
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
        return res;
 }  /* new_bd_Sel */
 
@@ -302,7 +194,7 @@ static ir_node *new_bd_SymConst_type(dbg_info *db, ir_node *block,
        res->attr.symc.tp   = tp;
 
        res = optimize_node(res);
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
        return res;
 }  /* new_bd_SymConst_type */
 
@@ -313,7 +205,7 @@ static ir_node *new_bd_Sync(dbg_info *db, ir_node *block)
 
        res = new_ir_node(db, irg, block, op_Sync, mode_M, -1, NULL);
        /* no need to call optimize node here, Sync are always created with no predecessors */
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
        return res;
 }  /* new_bd_Sync */
 
@@ -339,7 +231,7 @@ static ir_node *new_bd_ASM(dbg_info *db, ir_node *block, int arity,
        memcpy(res->attr.assem.clobbers, clobber, sizeof(clobber[0]) * n_clobber);
 
        res = optimize_node(res);
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
        return res;
 }  /* new_bd_ASM */
 
@@ -593,7 +485,7 @@ ir_node *new_d_Start(dbg_info *db)
                          op_Start, mode_T, 0, NULL);
 
        res = optimize_node(res);
-       IRN_VRFY_IRG(res, current_ir_graph);
+       IRN_VERIFY_IRG(res, current_ir_graph);
        return res;
 }  /* new_d_Start */
 
@@ -603,7 +495,7 @@ ir_node *new_d_End(dbg_info *db)
        res = new_ir_node(db, current_ir_graph,  current_ir_graph->current_block,
                          op_End, mode_X, -1, NULL);
        res = optimize_node(res);
-       IRN_VRFY_IRG(res, current_ir_graph);
+       IRN_VERIFY_IRG(res, current_ir_graph);
 
        return res;
 }  /* new_d_End */
@@ -640,7 +532,7 @@ static inline ir_node *new_rd_Phi0(ir_graph *irg, ir_node *block, ir_mode *mode)
        ir_node *res;
 
        res = new_ir_node(NULL, irg, block, op_Phi, mode, 0, NULL);
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
        return res;
 }  /* new_rd_Phi0 */
 
@@ -713,7 +605,7 @@ static inline ir_node *new_rd_Phi_in(ir_graph *irg, ir_node *block,
                }
        } else {
                res = optimize_node(res);  /* This is necessary to add the node to the hash table for cse. */
-               IRN_VRFY_IRG(res, irg);
+               IRN_VERIFY_IRG(res, irg);
                /* Memory Phis in endless loops must be kept alive.
                   As we can't distinguish these easily we keep all of them alive. */
                if (is_Phi(res) && mode == mode_M)
@@ -1120,7 +1012,7 @@ void mature_immBlock(ir_node *block)
                   nodes refer to the unoptimized node.
                   We can call optimize_in_place_2(), as global cse has no effect on blocks. */
                block = optimize_in_place_2(block);
-               IRN_VRFY_IRG(block, irg);
+               IRN_VERIFY_IRG(block, irg);
        }
 }  /* mature_immBlock */
 
@@ -1244,7 +1136,7 @@ ir_node *new_d_immBlock(dbg_info *db)
        memset(res->attr.block.graph_arr, 0, sizeof(ir_node *)*current_ir_graph->n_loc);
 
        /* Immature block may not be optimized! */
-       IRN_VRFY_IRG(res, current_ir_graph);
+       IRN_VERIFY_IRG(res, current_ir_graph);
 
        return res;
 }  /* new_d_immBlock */
index 44a1e38..c479944 100644 (file)
@@ -56,7 +56,7 @@
 #include "irtools.h"
 #include "irprintf.h"
 
-#include "irvrfy.h"
+#include "irverify.h"
 
 #include "error.h"
 #include "array.h"
@@ -1319,7 +1319,7 @@ static void dump_node(FILE *F, ir_node *n)
        fputs("\"", F);
 
        fputs(" label: \"", F);
-       bad = ! irn_vrfy_irg_dump(n, current_ir_graph, &p);
+       bad = ! irn_verify_irg_dump(n, current_ir_graph, &p);
        dump_node_label(F, n);
        dump_node_ana_vals(F, n);
        //dump_node_ana_info(F, n);
index d9cc658..babb240 100644 (file)
@@ -297,7 +297,7 @@ static inline void edge_change_cnt(ir_node *tgt, ir_edge_kind_t kind, int ofs)
  * Verify the edge list of a node, ie. ensure it's a loop:
  * head -> e_1 -> ... -> e_n -> head
  */
-static inline void vrfy_list_head(ir_node *irn, ir_edge_kind_t kind)
+static inline void verify_list_head(ir_node *irn, ir_edge_kind_t kind)
 {
        int                    err       = 0;
        int                    num       = 0;
@@ -455,9 +455,9 @@ void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt,
        /* verify list heads */
        if (edges_dbg) {
                if (tgt)
-                       vrfy_list_head(tgt, kind);
+                       verify_list_head(tgt, kind);
                if (old_tgt)
-                       vrfy_list_head(old_tgt, kind);
+                       verify_list_head(old_tgt, kind);
        }
 #endif
 
@@ -751,7 +751,7 @@ static void verify_list_presence(ir_node *irn, void *data)
        bitset_set(w->reachable, get_irn_idx(irn));
 
        /* check list heads */
-       vrfy_list_head(irn, w->kind);
+       verify_list_head(irn, w->kind);
 
        foreach_out_edge_kind(irn, e, w->kind) {
                ir_node *tgt;
index bae5974..ff59677 100644 (file)
@@ -25,7 +25,6 @@
  */
 #include "config.h"
 
-#include "irvrfy.h"
 #include "irflag_t.h"
 #include "irgwalk.h"
 #include "irnode_t.h"
index d780ae9..fc91c81 100644 (file)
@@ -33,7 +33,7 @@
 #include "irbackedge_t.h"
 
 #include "iropt_t.h"
-#include "irvrfy_t.h"
+#include "irverify_t.h"
 #include "reassoc_t.h"
 
 #include "xmalloc.h"
index 26ca2a4..8abe0c2 100644 (file)
@@ -34,7 +34,7 @@
 #include "iropt_t.h"
 #include "ircons_t.h"
 #include "irgmod.h"
-#include "irvrfy.h"
+#include "irverify.h"
 #include "tv_t.h"
 #include "dbginfo_t.h"
 #include "iropt_dbg.h"
@@ -6852,7 +6852,7 @@ ir_node *optimize_in_place_2(ir_node *n)
        n = gigo(n);
 
        /* Now we can verify the node, as it has no dead inputs any more. */
-       irn_vrfy(n);
+       irn_verify(n);
 
        /* Now we have a legal, useful node. Enter it in hash table for cse.
           Blocks should be unique anyways.  (Except the successor of start:
index 201ac41..adc75a8 100644 (file)
@@ -31,7 +31,7 @@
 #include "irgraph_t.h"
 #include "irprog_t.h"
 #include "irdump.h"
-#include "irvrfy.h"
+#include "irverify.h"
 #include "xmalloc.h"
 
 /*Add a graph pass to a graph pass manager. */
diff --git a/ir/ir/irverify.c b/ir/ir/irverify.c
new file mode 100644 (file)
index 0000000..5dbff2f
--- /dev/null
@@ -0,0 +1,2322 @@
+/*
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/**
+ * @file
+ * @brief    Check irnodes for correctness.
+ * @author   Christian Schaefer, Goetz Lindenmaier, Till Riedel, Michael Beck
+ * @version  $Id$
+ */
+#include "config.h"
+
+#include "irprog.h"
+#include "irop_t.h"
+#include "irgraph_t.h"
+#include "irverify_t.h"
+#include "irgwalk.h"
+#include "irdump.h"
+#include "irdom_t.h"
+#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 verify_entities = 0;
+
+const char *firm_verify_failure_msg;
+
+/* enable verification of Load/Store entities */
+void verify_enable_entity_tests(int enable)
+{
+       verify_entities = enable;
+}
+
+#ifndef NDEBUG
+
+/**
+ * little helper for NULL modes
+ */
+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 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);
+
+       if (last_irg_error == irg)
+               return;
+
+       last_irg_error = irg;
+
+       if (irg == get_const_code_irg()) {
+               fprintf(stderr, "\nFIRM: irn_verify_irg() <of CONST_CODE_IRG> failed\n");
+       } else {
+               ir_entity *ent = get_irg_entity(irg);
+
+               if (ent) {
+                       ir_type *ent_type = get_entity_owner(ent);
+
+                       if (ent_type) {
+                               ir_fprintf(stderr, "\nFIRM: irn_verify_irg() %+F::%s failed\n",
+                                          ent_type, get_entity_name(ent));
+                       } else {
+                               fprintf(stderr, "\nFIRM: irn_verify_irg() <NULL>::%s failed\n", get_entity_name(ent));
+                       }
+               } else {
+                       fprintf(stderr, "\nFIRM: irn_verify_irg() <IRG %p> failed\n", (void *)irg);
+               }
+       }
+}
+
+/**
+ * Prints a failure for a Node
+ */
+static void show_node_failure(ir_node *n)
+{
+       show_entity_failure(n);
+       fprintf(stderr, "  node %ld %s%s\n" ,
+               get_irn_node_nr(n),
+               get_irn_opname(n), get_irn_modename(n)
+       );
+}
+
+/**
+ * Prints a failure message for a binop
+ */
+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);
+
+       show_entity_failure(n);
+       fprintf(stderr, "  node %ld %s%s(%s%s, %s%s) did not match (%s)\n",
+               get_irn_node_nr(n),
+               get_irn_opname(n), get_irn_modename(n),
+               get_irn_opname(left), get_irn_modename(left),
+               get_irn_opname(right), get_irn_modename(right),
+               text);
+}
+
+/**
+ * Prints a failure message for an unop
+ */
+static void show_unop_failure(ir_node *n, const char *text)
+{
+       ir_node *op  = get_unop_op(n);
+
+       show_entity_failure(n);
+       fprintf(stderr, "  node %ld %s%s(%s%s) did not match (%s)\n",
+               get_irn_node_nr(n),
+               get_irn_opname(n), get_irn_modename(n),
+               get_irn_opname(op), get_irn_modename(op),
+               text);
+}
+
+/**
+ * Prints a failure message for an op with 3 operands
+ */
+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);
+
+       show_entity_failure(n);
+       fprintf(stderr, "  of node %ld %s%s(%s%s, %s%s, %s%s) did not match (%s)\n",
+               get_irn_node_nr(n),
+               get_irn_opname(n), get_irn_modename(n),
+               get_irn_opname(op0), get_irn_modename(op0),
+               get_irn_opname(op1), get_irn_modename(op1),
+               get_irn_opname(op2), get_irn_modename(op2),
+               text);
+}
+
+/**
+ * Prints a failure message for a proj
+ */
+static void show_proj_failure(ir_node *n)
+{
+       ir_node *op  = get_Proj_pred(n);
+       int proj     = get_Proj_proj(n);
+
+       show_entity_failure(n);
+       fprintf(stderr, "  node %ld %s%s %d(%s%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));
+}
+
+/**
+ * Prints a failure message for a proj from Start
+ */
+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,
+               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)
+{
+       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), 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)
+{
+       ir_fprintf(stderr, "\nFIRM: irn_verify_irg() of %+F, node %+F\n", irg, n);
+}
+
+/**
+ * Show call parameters
+ */
+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(", 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))));
+       }
+       fprintf(stderr, ") != CALL(");
+
+       for (i = 0; i < get_Call_n_params(n); ++i) {
+               fprintf(stderr, "%s ", get_mode_name_ex(get_irn_mode(get_Call_param(n, i))));
+       }
+       fprintf(stderr, ")\n");
+}
+
+/**
+ * Show return modes
+ */
+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);
+       fprintf(stderr, "  Return node %ld in entity \"%s\" mode %s different from type mode %s\n",
+               get_irn_node_nr(n), get_entity_name(ent),
+               get_mode_name_ex(get_irn_mode(get_Return_res(n, i))),
+               get_mode_name_ex(get_type_mode(get_method_res_type(mt, i)))
+       );
+}
+
+/**
+ * Show return number of results
+ */
+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);
+       fprintf(stderr, "  Return node %ld in entity \"%s\" has %d results different from type %d\n",
+               get_irn_node_nr(n), get_entity_name(ent),
+               get_Return_n_ress(n), get_method_n_ress(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)),
+               get_irn_node_nr(pred), get_mode_name_ex(get_irn_mode(pred)));
+}
+
+/**
+ * Show Phi inputs
+ */
+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),
+               get_irn_node_nr(block), get_irn_arity(block));
+}
+
+#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 (is_Sel(ptr)) {
+               return get_Sel_entity(ptr);
+       } else if (is_SymConst_addr_ent(ptr)) {
+               return get_SymConst_entity(ptr);
+       }
+       return NULL;
+}
+
+/**
+ * verify a Proj(Start) node
+ */
+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_tls          && mode_is_reference(mode)) ||
+                       (proj == pn_Start_T_args         && mode == mode_T)
+               ),
+               "wrong Proj from Start", 0,
+               show_proj_failure(p);
+       );
+       return 1;
+}
+
+/**
+ * verify a Proj(Cond) node
+ */
+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);
+
+       ASSERT_AND_RET_DBG(
+               (
+                       (proj >= 0 && mode == mode_X && get_irn_mode(get_Cond_selector(pred)) == mode_b) ||   /* compare */
+                       (mode == mode_X && mode_is_int(get_irn_mode(get_Cond_selector(pred)))) ||             /* switch */
+                       is_Bad(get_Cond_selector(pred))                                                       /* rare */
+               ),
+               "wrong Proj from Cond", 0,
+               show_proj_failure(p);
+       );
+       return 1;
+}
+
+/**
+ * verify a Proj(Raise) node
+ */
+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)),
+               "wrong Proj from Raise", 0,
+               show_proj_failure(p);
+       );
+       return 1;
+}
+
+/**
+ * verify a Proj(InstOf) node
+ */
+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         && 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))
+               ),
+               "wrong Proj from InstOf", 0,
+               show_proj_failure(p);
+       );
+       return 1;
+}
+
+/**
+ * verify a Proj(Call) node
+ */
+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                && 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_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(
+                       !is_NoMem(get_Call_mem(n)),
+                       "Regular Proj from FunctionCall", 0);
+       else if (proj == pn_Call_X_except)
+               ASSERT_AND_RET(
+                       !is_NoMem(get_Call_mem(n)),
+                       "Exception Proj from FunctionCall", 0);
+       return 1;
+}
+
+/**
+ * verify a Proj(Quot) node
+ */
+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);
+
+       ASSERT_AND_RET_DBG(
+               (
+                       (proj == pn_Quot_M         && mode == mode_M) ||
+                       (proj == pn_Quot_X_regular && mode == mode_X) ||
+                       (proj == pn_Quot_X_except  && mode == mode_X) ||
+                       (proj == pn_Quot_res       && mode_is_float(mode) && mode == get_Quot_resmode(n))
+               ),
+               "wrong Proj from Quot", 0,
+               show_proj_failure(p);
+       );
+       if (proj == pn_Quot_X_regular)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Regular Proj from unpinned Quot", 0);
+       else if (proj == pn_Quot_X_except)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Exception Proj from unpinned Quot", 0);
+       else if (proj == pn_Quot_M)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Memory Proj from unpinned Quot", 0);
+       return 1;
+}
+
+/**
+ * verify a Proj(DivMod) node
+ */
+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);
+
+       ASSERT_AND_RET_DBG(
+               (
+                       (proj == pn_DivMod_M         && mode == mode_M) ||
+                       (proj == pn_DivMod_X_regular && mode == mode_X) ||
+                       (proj == pn_DivMod_X_except  && mode == mode_X) ||
+                       (proj == pn_DivMod_res_div   && mode_is_int(mode) && mode == get_DivMod_resmode(n)) ||
+                       (proj == pn_DivMod_res_mod   && mode_is_int(mode) && mode == get_DivMod_resmode(n))
+               ),
+               "wrong Proj from DivMod", 0,
+               show_proj_failure(p);
+       );
+       if (proj == pn_DivMod_X_regular)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Regular Proj from unpinned DivMod", 0);
+       else if (proj == pn_DivMod_X_except)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Exception Proj from unpinned DivMod", 0);
+       else if (proj == pn_DivMod_M)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Memory Proj from unpinned DivMod", 0);
+       return 1;
+}
+
+/**
+ * verify a Proj(Div) node
+ */
+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);
+
+       ASSERT_AND_RET_DBG(
+               (
+                       (proj == pn_Div_M         && mode == mode_M) ||
+                       (proj == pn_Div_X_regular && mode == mode_X) ||
+                       (proj == pn_Div_X_except  && mode == mode_X) ||
+                       (proj == pn_Div_res       && mode_is_int(mode) && mode == get_Div_resmode(n))
+               ),
+               "wrong Proj from Div", 0,
+               show_proj_failure(p);
+       );
+       if (proj == pn_Div_X_regular)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Regular Proj from unpinned Div", 0);
+       else if (proj == pn_Div_X_except)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Exception Proj from unpinned Div", 0);
+       else if (proj == pn_Div_M)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Memory Proj from unpinned Div", 0);
+       return 1;
+}
+
+/**
+ * verify a Proj(Mod) node
+ */
+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);
+
+       ASSERT_AND_RET_DBG(
+               (
+                       (proj == pn_Mod_M         && mode == mode_M) ||
+                       (proj == pn_Mod_X_regular && mode == mode_X) ||
+                       (proj == pn_Mod_X_except  && mode == mode_X) ||
+                       (proj == pn_Mod_res       && mode_is_int(mode) && mode == get_Mod_resmode(n))
+               ),
+               "wrong Proj from Mod", 0,
+               show_proj_failure(p);
+       );
+       if (proj == pn_Mod_X_regular)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Regular Proj from unpinned Mod", 0);
+       else if (proj == pn_Mod_X_except)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Exception Proj from unpinned Mod", 0);
+       else if (proj == pn_Mod_M)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Memory Proj from unpinned Div", 0);
+       return 1;
+}
+
+/**
+ * verify a Proj(Cmp) node
+ */
+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;
+}
+
+/**
+ * verify a Proj(Load) node
+ */
+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);
+
+       if (proj == pn_Load_res) {
+               ir_node *ptr = get_Load_ptr(n);
+               ir_entity *ent = get_ptr_entity(ptr);
+
+               if (verify_entities && ent && get_irg_phase_state(current_ir_graph) == phase_high) {
+                       /* do NOT check this for lowered phases, see comment on Store */
+                       ASSERT_AND_RET_DBG(
+                               (mode == get_type_mode(get_entity_type(ent))),
+                               "wrong data Proj from Load, entity type_mode failed", 0,
+                               show_proj_failure_ent(p, ent);
+                       );
+               }
+               else {
+                       ASSERT_AND_RET_DBG(
+                               mode_is_data(mode) && mode == get_Load_mode(n),
+                               "wrong data Proj from Load", 0,
+                               show_proj_failure(p);
+                       );
+               }
+       }
+       else {
+               ASSERT_AND_RET_DBG(
+                       (
+                               (proj == pn_Load_M         && mode == mode_M) ||
+                               (proj == pn_Load_X_regular && mode == mode_X) ||
+                               (proj == pn_Load_X_except  && mode == mode_X)
+                       ),
+                       "wrong Proj from Load", 0,
+                       show_proj_failure(p);
+               );
+       }
+       if (proj == pn_Load_X_regular) {
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Regular Proj from unpinned Load", 0);
+       } else if (proj == pn_Load_X_except) {
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Exception Proj from unpinned Load", 0);
+       }
+       return 1;
+}
+
+/**
+ * verify a Proj(Store) node
+ */
+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);
+
+       ASSERT_AND_RET_DBG(
+               (
+                       (proj == pn_Store_M         && mode == mode_M) ||
+                       (proj == pn_Store_X_regular && mode == mode_X) ||
+                       (proj == pn_Store_X_except  && mode == mode_X)
+               ),
+               "wrong Proj from Store", 0,
+               show_proj_failure(p);
+       );
+       if (proj == pn_Store_X_regular) {
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Regular Proj from unpinned Store", 0);
+       } else if (proj == pn_Store_X_except) {
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Exception Proj from unpinned Store", 0);
+       }
+       return 1;
+}
+
+/**
+ * verify a Proj(Alloc) node
+ */
+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(
+               (
+                       (proj == pn_Alloc_M         && mode == mode_M) ||
+                       (proj == pn_Alloc_X_regular && mode == mode_X) ||
+                       (proj == pn_Alloc_X_except  && mode == mode_X) ||
+                       (proj == pn_Alloc_res       && mode_is_reference(mode))
+               ),
+               "wrong Proj from Alloc", 0,
+               show_proj_failure(p);
+       );
+       return 1;
+}
+
+/**
+ * verify a Proj(Proj) node
+ */
+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);
+       ir_type *mt; /* A method type */
+
+       pred = skip_Id(get_Proj_pred(pred));
+       ASSERT_AND_RET((get_irn_mode(pred) == mode_T), "Proj from something not a tuple", 0);
+
+       switch (get_irn_opcode(pred)) {
+       case iro_Start:
+               mt = get_entity_type(get_irg_entity(get_irn_irg(pred)));
+
+               if (nr == pn_Start_T_args) {
+                       ASSERT_AND_RET(
+                               (proj >= 0 && mode_is_datab(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
+                               );
+                       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));
+                                               );
+                       }
+               }
+               break;
+
+       case iro_Call:
+               {
+                       ASSERT_AND_RET(
+                               (proj >= 0 && mode_is_datab(mode)),
+                               "wrong Proj from Proj from Call", 0);
+                       mt = get_Call_type(pred);
+                       ASSERT_AND_RET(mt == get_unknown_type() || is_Method_type(mt),
+                                       "wrong call type on call", 0);
+                       ASSERT_AND_RET(
+                               (proj < get_method_n_ress(mt)),
+                               "More Projs for results than results in type.", 0);
+                       if ((mode_is_reference(mode)) && is_compound_type(get_method_res_type(mt, proj)))
+                               /* value result */ break;
+
+                               ASSERT_AND_RET(
+                               (mode == get_type_mode(get_method_res_type(mt, proj))),
+                               "Mode of Proj from Call doesn't match mode of result type.", 0);
+               }
+               break;
+
+       case iro_Tuple:
+               /* We don't test */
+               break;
+
+       case iro_Bad:
+               /* hmm, optimization did not remove it */
+               break;
+
+       default:
+               /* ASSERT_AND_RET(0, "Unknown opcode", 0); */
+               break;
+       }
+       return 1;
+}
+
+/**
+ * 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;
+}
+
+/**
+ * verify a Proj(CopyB) node
+ */
+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         && mode == mode_M) ||
+                       (proj == pn_CopyB_X_regular && mode == mode_X) ||
+                       (proj == pn_CopyB_X_except  && mode == mode_X)
+               ),
+               "wrong Proj from CopyB", 0,
+               show_proj_failure(p);
+       );
+       if (proj == pn_CopyB_X_regular)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Regular Proj from unpinned CopyB", 0);
+       else if (proj == pn_CopyB_X_except)
+               ASSERT_AND_RET(
+                       get_irn_pinned(n) == op_pin_state_pinned,
+                       "Exception Proj from unpinned CopyB", 0);
+       return 1;
+}
+
+/**
+ * verify a Proj(Bound) node
+ */
+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);
+
+       /* ignore Bound checks of Bad */
+       if (is_Bad(get_Bound_index(n)))
+               return 1;
+       ASSERT_AND_RET_DBG(
+               (
+                       (proj == pn_Bound_M         && mode == mode_M) ||
+                       (proj == pn_Bound_X_regular && mode == mode_X) ||
+                       (proj == pn_Bound_X_except  && mode == mode_X) ||
+                       (proj == pn_Bound_res       && mode == get_irn_mode(get_Bound_index(n)))
+               ),
+               "wrong Proj from Bound", 0,
+               show_proj_failure(p);
+       );
+       return 1;
+}
+
+/**
+ * verify a Proj node
+ */
+static int verify_node_Proj(ir_node *p, ir_graph *irg)
+{
+       ir_node *pred;
+       ir_op *op;
+
+       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);
+
+       if (op->ops.verify_proj_node)
+               return op->ops.verify_proj_node(pred, p);
+
+       /* all went ok */
+       return 1;
+}
+
+/**
+ * verify a Block node
+ */
+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) || (get_irn_mode(pred) == mode_X),
+                       "Block node must have a mode_X predecessor", 0);
+       }
+
+       if (n == get_irg_start_block(irg)) {
+               ASSERT_AND_RET(get_Block_n_cfgpreds(n) == 0, "Start Block node", 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. */
+               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))
+                               break;   /*  We can not test properly.  How many tuples are there? */
+                       ASSERT_AND_RET(
+                               (
+                                       is_Return(pred) ||
+                                       is_Bad(pred)    ||
+                                       is_Raise(pred)  ||
+                                       is_fragile_op(pred)
+                               ),
+                               "End Block node", 0);
+               }
+               /*  irg attr must == graph we are in. */
+               ASSERT_AND_RET(((get_irn_irg(n) && get_irn_irg(n) == irg)), "Block node has wrong irg attribute", 0);
+               return 1;
+}
+
+/**
+ * verify a Start node
+ */
+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 */
+               mymode == mode_T, "Start node", 0
+               );
+       return 1;
+}
+
+/**
+ * verify a Jmp node
+ */
+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 */
+               mymode == mode_X, "Jmp node", 0
+       );
+       return 1;
+}
+
+/**
+ * verify an IJmp node
+ */
+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 */
+               mymode == mode_X && mode_is_reference(op1mode), "IJmp node", 0
+       );
+       return 1;
+}
+
+/**
+ * verify a Cond node
+ */
+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 */
+               (op1mode == mode_b ||
+               /* Cond: BB x int --> X^n */
+               mode_is_int(op1mode) ),  "Cond node", 0
+               );
+       ASSERT_AND_RET(mymode == mode_T, "Cond mode is not a tuple", 0);
+
+       return 1;
+}
+
+/**
+ * verify a Return node
+ */
+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));
+       ir_type *mt;
+
+       /* Return: BB x M x data1 x ... x datan --> X */
+
+       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_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 */
+       mt = get_entity_type(get_irg_entity(irg));
+       ASSERT_AND_RET_DBG( get_Return_n_ress(n) == get_method_n_ress(mt),
+               "Number of results for Return doesn't match number of results in type.", 0,
+               show_return_nres(irg, n, mt););
+       for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
+               ir_type *res_type = get_method_res_type(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;
+}
+
+/**
+ * verify a Raise node
+ */
+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 */
+               op1mode == mode_M && mode_is_reference(op2mode) &&
+               mymode == mode_T, "Raise node", 0
+       );
+       return 1;
+}
+
+/**
+ * verify a Const node
+ */
+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 */
+               (mode_is_data(mymode) ||
+               mymode == mode_b)      /* we want boolean constants for static evaluation */
+               ,"Const node", 0       /* of Cmp. */
+       );
+       ASSERT_AND_RET(
+               /* the modes of the constant and teh tarval must match */
+               mymode == get_tarval_mode(get_Const_tarval(n)),
+               "Const node, tarval and node mode mismatch", 0
+       );
+       return 1;
+}
+
+/**
+ * verify a SymConst node
+ */
+static int verify_node_SymConst(ir_node *n, ir_graph *irg)
+{
+       ir_mode *mymode = get_irn_mode(n);
+       (void) irg;
+
+       ASSERT_AND_RET(
+               /* SymConst: BB --> int*/
+               (mode_is_int(mymode) ||
+               /* SymConst: BB --> ref */
+               mode_is_reference(mymode))
+               ,"SymConst node", 0);
+       return 1;
+}
+
+/**
+ * verify a Sel node
+ */
+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));
+       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 */
+               (op1mode == mode_M && op2mode == mymode && mode_is_reference(mymode)),
+               "Sel node", 0, show_node_failure(n)
+       );
+
+       for (i = get_Sel_n_indexs(n) - 1; i >= 0; --i) {
+               ASSERT_AND_RET_DBG(mode_is_int(get_irn_mode(get_Sel_index(n, i))), "Sel node", 0, show_node_failure(n));
+       }
+       ent = get_Sel_entity(n);
+       ASSERT_AND_RET_DBG(ent, "Sel node with empty entity", 0, show_node_failure(n));
+       return 1;
+}
+
+/**
+ * verify an InstOf node
+ */
+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
+ */
+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));
+       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(verify_right_pinned(n),"Call node with wrong memory input", 0 );
+
+       mt = get_Call_type(n);
+       if (get_unknown_type() == mt) {
+               return 1;
+       }
+
+       for (i = get_Call_n_params(n) - 1; i >= 0; --i) {
+               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 */
+       /* Compare arguments of node with those of type */
+
+       if (get_method_variadicity(mt) == variadicity_variadic) {
+               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 variadic type.",
+                       0,
+                       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_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,
+                       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 (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);
+                               );
+                       }
+               }
+       }
+
+#if 0
+       if (Call_has_callees(n)) {
+               for (i = 0; i < get_Call_n_callees(n); i++) {
+                       ASSERT_AND_RET(is_entity(get_Call_callee(n, i)), "callee array must contain entities.", 0);
+               }
+       }
+#endif
+       return 1;
+}
+
+/**
+ * verify an Add node
+ */
+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_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 */
+                       (mode_is_int(op1mode) && op2mode == mymode && mode_is_reference(mymode))
+               ),
+               "Add node", 0,
+               show_binop_failure(n, "/* common Add: BB x numP x numP --> numP */ |\n"
+                       "/* Pointer Add: BB x ref x int --> ref */   |\n"
+                       "/* Pointer Add: BB x int x ref --> ref */");
+       );
+       return 1;
+}
+
+/**
+ * verify a Sub node
+ */
+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_data(op1mode)) ||
+                       /* Pointer Sub: BB x ref x int --> ref */
+                       (op1mode == mymode && mode_is_int(op2mode) && 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 ref x ref --> int */" );
+               );
+       return 1;
+}
+
+/**
+ * verify a Minus node
+ */
+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 */
+               op1mode == mymode && mode_is_num(op1mode), "Minus node", 0,
+               show_unop_failure(n , "/* Minus: BB x num --> num */");
+       );
+       return 1;
+}
+
+/**
+ * verify a Mul node
+ */
+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 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 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
+ */
+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));
+       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 */
+               op1mode == mode_M && op2mode == op3mode &&
+               get_mode_sort(op2mode) == irms_float_number &&
+               mymode == mode_T,
+               "Quot node",0,
+               show_binop_failure(n, "/* Quot: BB x M x float x float --> M x X x float */");
+       );
+       return 1;
+}
+
+/**
+ * verify a DivMod node
+ */
+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));
+       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 */
+               op1mode == mode_M &&
+               mode_is_int(op2mode) &&
+               op3mode == op2mode &&
+               mymode == mode_T,
+               "DivMod node", 0
+               );
+       return 1;
+}
+
+/**
+ * verify a Div node
+ */
+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));
+       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 */
+               op1mode == mode_M &&
+               op2mode == op3mode &&
+               mode_is_int(op2mode) &&
+               mymode == mode_T,
+               "Div node", 0
+               );
+       return 1;
+}
+
+/**
+ * verify a Mod node
+ */
+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));
+       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 */
+               op1mode == mode_M &&
+               op2mode == op3mode &&
+               mode_is_int(op2mode) &&
+               mymode == mode_T,
+               "Mod node", 0
+               );
+       return 1;
+}
+
+/**
+ * verify an Abs node
+ */
+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 */
+               op1mode == mymode &&
+               mode_is_num (op1mode),
+               "Abs node", 0,
+               show_unop_failure(n, "/* Abs: BB x num --> num */");
+       );
+       return 1;
+}
+
+/**
+ * verify a logical And, Or, Eor node
+ */
+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 */
+               (mode_is_int(mymode) || mymode == mode_b) &&
+               op2mode == op1mode &&
+               mymode == op2mode,
+               "And, Or or Eor node", 0,
+               show_binop_failure(n, "/* And or Or or Eor: BB x int x int --> int */");
+       );
+       return 1;
+}
+
+#define verify_node_And   verify_node_Logic
+#define verify_node_Or    verify_node_Logic
+#define verify_node_Eor   verify_node_Logic
+
+/**
+ * verify a Not node
+ */
+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) || mymode == mode_b) &&
+               mymode == op1mode,
+               "Not node", 0,
+               show_unop_failure(n, "/* Not: BB x int --> int */");
+       );
+       return 1;
+}
+
+/**
+ * verify a Cmp node
+ */
+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_datab(op1mode) &&
+               op2mode == op1mode &&
+               mymode == mode_T,
+               "Cmp node", 0,
+               show_binop_failure(n, "/* Cmp: BB x datab x datab --> b16 */");
+       );
+       return 1;
+}
+
+/**
+ * verify a Shift node
+ */
+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 */
+               mode_is_int(op1mode) &&
+               mode_is_int(op2mode) &&
+               !mode_is_signed(op2mode) &&
+               mymode == op1mode,
+               "Shl, Shr or Shrs node", 0,
+               show_binop_failure(n, "/* Shl, Shr or Shrs: BB x int x int_u --> int */");
+       );
+       return 1;
+}
+
+#define verify_node_Shl   verify_node_Shift
+#define verify_node_Shr   verify_node_Shift
+#define verify_node_Shrs  verify_node_Shift
+
+/**
+ * verify a Rotl node
+ */
+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_Rotl_left(n));
+       ir_mode *op2mode = get_irn_mode(get_Rotl_right(n));
+       (void) irg;
+
+       ASSERT_AND_RET_DBG(
+               /* Rotl: BB x int x int --> int */
+               mode_is_int(op1mode) &&
+               mode_is_int(op2mode) &&
+               mymode == op1mode,
+               "Rotl node", 0,
+               show_binop_failure(n, "/* Rotl: BB x int x int --> int */");
+       );
+       return 1;
+}
+
+/**
+ * verify a Conv node
+ */
+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(
+               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 datab --> data */");
+       );
+       return 1;
+}
+
+/**
+ * verify a Cast node
+ */
+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 */
+               mode_is_data(op1mode) && op1mode == mymode,
+               "Cast node", 0,
+               show_unop_failure(n, "/* Conv: BB x datab1 --> datab2 */");
+       );
+       return 1;
+}
+
+/**
+ * verify a Phi node
+ */
+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) {
+               ASSERT_AND_RET_DBG(
+                       get_irn_arity(n) == get_irn_arity(block),
+                       "wrong number of inputs in Phi node", 0,
+                       show_phi_inputs(n, block);
+               );
+       }
+
+       /* Phi: BB x dataM^n --> dataM */
+       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,
+                               show_phi_failure(n, pred, i);
+                       );
+               }
+       }
+       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) {
+                       int j;
+                       ir_node *pred_i = get_Phi_pred(n, i);
+
+                       if (is_Bad(pred_i))
+                               continue;
+                       for (j = i - 1; j >= 0; --j) {
+                               ir_node *pred_j = get_Phi_pred(n, j);
+
+                               if (is_Bad(pred_j))
+                                       continue;
+#if 0
+                               /* currently this checks fails for blocks with exception
+                                  outputs (and these are NOT basic blocks).  So it is disabled yet. */
+                               ASSERT_AND_RET_DBG(
+                                       (pred_i == pred_j) || (get_irn_n(pred_i, -1) != get_irn_n(pred_j, -1)),
+                                       "At least two different PhiM predecessors are in the same block",
+                                       0,
+                                       ir_printf("%+F and %+F of %+F are in %+F\n", pred_i, pred_j, n, get_irn_n(pred_i, -1))
+                               );
+#endif
+                       }
+               }
+       }
+       return 1;
+}
+
+/**
+ * verify a Load node
+ */
+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));
+
+       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 );
+       }
+       ASSERT_AND_RET( mymode == mode_T, "Load node", 0 );
+
+       /*
+        * jack's gen_add_firm_code:simpleSel seems to build Load (Load
+        * (Proj (Proj))) sometimes ...
+
+        * interprete.c:ai_eval seems to assume that this happens, too
+
+        * obset.c:get_abstval_any can't deal with this if the load has
+        * mode_T
+        *
+         {
+         ir_entity *ent = hunt_for_entity (get_Load_ptr (n), n);
+         assert ((NULL != ent) || (mymode != mode_T));
+         }
+        */
+
+       return 1;
+}
+
+/**
+ * verify a Store node
+ */
+static int verify_node_Store(ir_node *n, ir_graph *irg)
+{
+       ir_entity *target;
+
+       ir_mode *mymode  = get_irn_mode(n);
+       ir_mode *op1mode = get_irn_mode(get_Store_mem(n));
+       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_datab(op3mode), "Store node", 0 );
+       if (get_irg_phase_state(irg) != phase_backend) {
+               ASSERT_AND_RET(mode_is_reference(op2mode), "Store node", 0 );
+       }
+       ASSERT_AND_RET(mymode == mode_T, "Store node", 0);
+
+       target = get_ptr_entity(get_Store_ptr(n));
+       if (verify_entities && target && get_irg_phase_state(current_ir_graph) == phase_high) {
+               /*
+                * If lowered code, any Sels that add 0 may be removed, causing
+                * an direct access to entities of array or compound type.
+                * Prevent this by checking the phase.
+                */
+               ASSERT_AND_RET( op3mode == get_type_mode(get_entity_type(target)),
+                       "Store node", 0);
+       }
+
+       return 1;
+}
+
+/**
+ * verify an Alloc node
+ */
+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_count(n));
+       (void) irg;
+
+       ASSERT_AND_RET_DBG(
+               /* Alloc: BB x M x int_u --> M x X x ref */
+               op1mode == mode_M &&
+               mode_is_int(op2mode) &&
+               !mode_is_signed(op2mode) &&
+               mymode == mode_T,
+               "Alloc node", 0,
+               show_node_failure(n);
+       );
+       return 1;
+}
+
+/**
+ * verify a Free node
+ */
+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));
+       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 */
+               op1mode == mode_M && mode_is_reference(op2mode) &&
+               mode_is_int(op3mode) &&
+               !mode_is_signed(op3mode) &&
+               mymode == mode_M,
+               "Free node", 0,
+               show_triop_failure(n, "/* Free: BB x M x ref x int_u --> M */");
+       );
+       return 1;
+}
+
+/**
+ * verify a Sync node
+ */
+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) {
+               ASSERT_AND_RET( get_irn_mode(get_Sync_pred(n, i)) == mode_M, "Sync node", 0 );
+       };
+       ASSERT_AND_RET( mymode == mode_M, "Sync node", 0 );
+       return 1;
+}
+
+/**
+ * verify a Confirm node
+ */
+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 */
+               op1mode == mymode &&
+               op2mode == mymode,
+               "Confirm node", 0,
+               show_binop_failure(n, "/* Confirm: BB x T x T --> T */");
+       );
+       return 1;
+}
+
+/**
+ * verify a Mux node
+ */
+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));
+       ir_mode *op3mode = get_irn_mode(get_Mux_false(n));
+       (void) irg;
+
+       ASSERT_AND_RET(
+               /* Mux: BB x b x datab x datab --> datab */
+               op1mode == mode_b &&
+               op2mode == mymode &&
+               op3mode == mymode &&
+               mode_is_datab(mymode),
+               "Mux node", 0
+               );
+       return 1;
+}
+
+/**
+ * verify a CopyB node
+ */
+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));
+       ir_mode *op3mode = get_irn_mode(get_CopyB_src(n));
+       ir_type *t = get_CopyB_type(n);
+
+       /* CopyB: BB x M x ref x ref --> M x X */
+       ASSERT_AND_RET(mymode == mode_T && op1mode == mode_M, "CopyB node", 0);
+       if (get_irg_phase_state(irg) != phase_backend) {
+               ASSERT_AND_RET(mode_is_reference(op2mode) && mode_is_reference(op3mode),
+                       "CopyB node", 0 );
+       }
+
+       ASSERT_AND_RET(
+               is_compound_type(t) || is_Array_type(t),
+               "CopyB node should copy compound types only", 0 );
+
+       /* 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(verify_right_pinned(n), "CopyB node with wrong memory input", 0 );
+       return 1;
+}
+
+/**
+ * verify a Bound node
+ */
+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));
+       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(
+               mymode == mode_T &&
+               op1mode == mode_M &&
+               op2mode == op3mode &&
+               op3mode == op4mode &&
+               mode_is_int(op3mode),
+               "Bound node", 0 );
+       return 1;
+}
+
+/**
+ * Check dominance.
+ * For each usage of a node, it is checked, if the block of the
+ * node dominates the block of the usage (for phis: the predecessor
+ * block of the phi for the corresponding edge).
+ *
+ * @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 */
+       else if (use != get_irg_end(current_ir_graph) && use != current_ir_graph->anchor) {
+               int i;
+               ir_node *bl = get_nodes_block(use);
+
+               for (i = get_irn_arity(use) - 1; i >= 0; --i) {
+                       ir_node *def    = get_irn_n(use, i);
+                       ir_node *def_bl = get_nodes_block(def);
+                       ir_node *use_bl = bl;
+
+                       /* ignore dead definition blocks, will be removed */
+                       if (is_Block_dead(def_bl) || get_Block_dom_depth(def_bl) == -1)
+                               continue;
+
+                       if (is_Phi(use))
+                               use_bl = get_Block_cfgpred_block(bl, i);
+
+                       /* ignore dead use blocks, will be removed */
+                       if (is_Block_dead(use_bl) || get_Block_dom_depth(use_bl) == -1)
+                               continue;
+
+                       ASSERT_AND_RET_DBG(
+                               block_dominates(def_bl, use_bl),
+                               "the definition of a value used violates the dominance property", 0,
+                               ir_fprintf(stderr,
+                               "graph %+F: %+F of %+F must dominate %+F of user %+F input %d\n",
+                               current_ir_graph, def_bl, def, use_bl, use, i
+                               );
+                       );
+               }
+       }
+       return 1;
+}
+
+/* Tests the modes of n and its predecessors. */
+int irn_verify_irg(ir_node *n, ir_graph *irg)
+{
+       int i;
+       ir_op *op;
+
+       if (!get_node_verification_mode())
+               return 1;
+
+       /*
+        * do NOT check placement in interprocedural view, as we don't always
+        * know the "right" graph ...
+        */
+
+#ifndef NDEBUG
+       /* this is an expensive check for large graphs (it has a quadratic
+        * runtime but with a small constant); 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", n, node_from_map, node_from_map));
+       }
+
+       op = get_irn_op(n);
+
+       /* 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) {
+               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);
+
+       /* All went ok */
+       return 1;
+}
+
+int irn_verify(ir_node *n)
+{
+#ifdef DEBUG_libfirm
+       return irn_verify_irg(n, current_ir_graph);
+#else
+       (void)n;
+       return 1;
+#endif
+}
+
+/*-----------------------------------------------------------------*/
+/* Verify the whole graph.                                         */
+/*-----------------------------------------------------------------*/
+
+#ifdef DEBUG_libfirm
+/**
+ * Walker to check every node
+ */
+static void verify_wrap(ir_node *node, void *env)
+{
+       int *res = env;
+       *res = irn_verify_irg(node, current_ir_graph);
+}
+
+/**
+ * Walker to check every node including SSA property.
+ * Only called if dominance info is available.
+ */
+static void verify_wrap_ssa(ir_node *node, void *env)
+{
+       int *res = env;
+
+       *res = irn_verify_irg(node, current_ir_graph);
+       if (*res) {
+               *res = check_dominance_for_node(node);
+       }
+}
+
+#endif /* DEBUG_libfirm */
+
+/*
+ * Calls irn_verify for each node in irg.
+ * 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 res = 1;
+#ifdef DEBUG_libfirm
+       ir_graph *rem;
+
+       rem = current_ir_graph;
+       current_ir_graph = irg;
+
+#ifndef NDEBUG
+    last_irg_error = NULL;
+#endif /* NDEBUG */
+
+       assert(get_irg_pinned(irg) == op_pin_state_pinned && "Verification need pinned graph");
+
+       if (flags & VERIFY_ENFORCE_SSA)
+               compute_doms(irg);
+
+       irg_walk_anchors(
+               irg,
+               get_irg_dom_state(irg) == dom_consistent &&
+               get_irg_pinned(irg) == op_pin_state_pinned ? verify_wrap_ssa : verify_wrap,
+               NULL, &res
+       );
+
+       if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT && ! res) {
+               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 *)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_verify_irg_dump(ir_node *n, ir_graph *irg, const char **bad_string)
+{
+       int res;
+       firm_verification_t old = get_node_verification_mode();
+
+       firm_verify_failure_msg = NULL;
+       do_node_verification(FIRM_VERIFICATION_ERROR_ONLY);
+       res = irn_verify_irg(n, irg);
+       if (res && get_irg_dom_state(irg) == dom_consistent &&
+           get_irg_pinned(irg) == op_pin_state_pinned)
+               res = check_dominance_for_node(n);
+       do_node_verification(old);
+       *bad_string = firm_verify_failure_msg;
+
+       return res;
+}
+
+typedef struct verify_bad_env_t {
+       int flags;
+       int res;
+} verify_bad_env_t;
+
+/**
+ * Pre-Walker: check Bad predecessors of node.
+ */
+static void check_bads(ir_node *node, void *env)
+{
+       verify_bad_env_t *venv = env;
+       int i, arity = get_irn_arity(node);
+
+       if (is_Block(node)) {
+               if ((venv->flags & BAD_CF) == 0) {
+
+                       /* check for Bad Block predecessor */
+                       for (i = 0; i < arity; ++i) {
+                               ir_node *pred = get_irn_n(node, i);
+
+                               if (is_Bad(pred)) {
+                                       venv->res |= BAD_CF;
+
+                                       if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
+                                               fprintf(stderr, "irg_verify_bads: Block %ld has Bad predecessor\n", get_irn_node_nr(node));
+                                       }
+                                       if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
+                                               dump_ir_graph(current_ir_graph, "-assert");
+                                               assert(0 && "Bad CF detected");
+                                       }
+                               }
+                       }
+               }
+       } else {
+               if ((venv->flags & BAD_BLOCK) == 0) {
+
+                       /* check for Bad Block */
+                       if (is_Bad(get_nodes_block(node))) {
+                               venv->res |= BAD_BLOCK;
+
+                               if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
+                                       fprintf(stderr, "irg_verify_bads: node %ld has Bad Block\n", get_irn_node_nr(node));
+                               }
+                               if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
+                                       dump_ir_graph(current_ir_graph, "-assert");
+                                       assert(0 && "Bad CF detected");
+                               }
+                       }
+               }
+
+               if ((venv->flags & TUPLE) == 0) {
+                       if (is_Tuple(node)) {
+                               venv->res |= TUPLE;
+
+                               if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
+                                       fprintf(stderr, "irg_verify_bads: node %ld is a Tuple\n", get_irn_node_nr(node));
+                               }
+                               if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
+                                       dump_ir_graph(current_ir_graph, "-assert");
+                                       assert(0 && "Tuple detected");
+                               }
+                       }
+               }
+
+               for (i = 0; i < arity; ++i) {
+                       ir_node *pred = get_irn_n(node, i);
+
+                       if (is_Bad(pred)) {
+                               /* check for Phi with Bad inputs */
+                               if (is_Phi(node) && !is_Bad(get_nodes_block(node)) && is_Bad(get_irn_n(get_nodes_block(node), i))) {
+                                       if (venv->flags & BAD_CF)
+                                               continue;
+                                       else {
+                                               venv->res |= BAD_CF;
+
+                                               if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
+                                                       fprintf(stderr, "irg_verify_bads: Phi %ld has Bad Input\n", get_irn_node_nr(node));
+                                               }
+                                               if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
+                                                       dump_ir_graph(current_ir_graph, "-assert");
+                                                       assert(0 && "Bad CF detected");
+                                               }
+                                       }
+                               }
+
+                               /* Bad node input */
+                               if ((venv->flags & BAD_DF) == 0) {
+                                       venv->res |= BAD_DF;
+
+                                       if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
+                                               fprintf(stderr, "irg_verify_bads: node %ld has Bad Input\n", get_irn_node_nr(node));
+                                       }
+                                       if (get_node_verification_mode() == FIRM_VERIFICATION_ON) {
+                                               dump_ir_graph(current_ir_graph, "-assert");
+                                               assert(0 && "Bad NON-CF detected");
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+/*
+ * verify occurrence of bad nodes
+ */
+int irg_verify_bads(ir_graph *irg, int flags)
+{
+       verify_bad_env_t env;
+
+       env.flags = flags;
+       env.res   = 0;
+
+       irg_walk_graph(irg, check_bads, NULL, &env);
+
+       return env.res;
+}
+
+/*
+ * set the default verify operation
+ */
+void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops)
+{
+#define CASE(a)                           \
+   case iro_##a:                          \
+     ops->verify_node  = verify_node_##a; \
+     break
+
+       switch (code) {
+       CASE(Proj);
+       CASE(Block);
+       CASE(Start);
+       CASE(Jmp);
+       CASE(IJmp);
+       CASE(Cond);
+       CASE(Return);
+       CASE(Raise);
+       CASE(Const);
+       CASE(SymConst);
+       CASE(Sel);
+       CASE(InstOf);
+       CASE(Call);
+       CASE(Add);
+       CASE(Sub);
+       CASE(Minus);
+       CASE(Mul);
+       CASE(Mulh);
+       CASE(Quot);
+       CASE(DivMod);
+       CASE(Div);
+       CASE(Mod);
+       CASE(Abs);
+       CASE(And);
+       CASE(Or);
+       CASE(Eor);
+       CASE(Not);
+       CASE(Cmp);
+       CASE(Shl);
+       CASE(Shr);
+       CASE(Shrs);
+       CASE(Rotl);
+       CASE(Conv);
+       CASE(Cast);
+       CASE(Phi);
+       CASE(Load);
+       CASE(Store);
+       CASE(Alloc);
+       CASE(Free);
+       CASE(Sync);
+       CASE(Confirm);
+       CASE(Mux);
+       CASE(CopyB);
+       CASE(Bound);
+       default:
+               /* leave NULL */;
+       }
+#undef CASE
+
+#define CASE(a)                          \
+   case iro_##a:                         \
+     ops->verify_proj_node  = verify_node_Proj_##a; \
+     break
+
+       switch (code) {
+       CASE(Start);
+       CASE(Cond);
+       CASE(Raise);
+       CASE(InstOf);
+       CASE(Call);
+       CASE(Quot);
+       CASE(DivMod);
+       CASE(Div);
+       CASE(Mod);
+       CASE(Cmp);
+       CASE(Load);
+       CASE(Store);
+       CASE(Alloc);
+       CASE(Proj);
+       CASE(Tuple);
+       CASE(CopyB);
+       CASE(Bound);
+       default:
+               /* leave NULL */;
+       }
+#undef CASE
+}
diff --git a/ir/ir/irverify_t.h b/ir/ir/irverify_t.h
new file mode 100644 (file)
index 0000000..8adb502
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/**
+ * @file
+ * @brief    New checker of irnodes for correctness.
+ * @author   Michael Beck
+ * @version  $Id$
+ */
+#ifndef FIRM_IR_IRVERIFY_T_H
+#define FIRM_IR_IRVERIFY_T_H
+
+#include "irflag_t.h"
+#include "irverify.h"
+#include "irdump.h"
+
+#include "beutil.h"
+
+extern const char *firm_verify_failure_msg;
+
+#ifdef NDEBUG
+/*
+ * in RELEASE mode, returns ret if the expression expr evaluates to zero
+ * in ASSERT mode, asserts the expression expr (and the string string).
+ */
+#define ASSERT_AND_RET(expr, string, ret)       do { if (!(expr)) return (ret); } while (0)
+
+/*
+ * in RELEASE mode, returns ret if the expression expr evaluates to zero
+ * in ASSERT mode, executes blk if the expression expr evaluates to zero and asserts expr
+ */
+#define ASSERT_AND_RET_DBG(expr, string, ret, blk)     do { if (!(expr)) return (ret); } while (0)
+#else
+#define ASSERT_AND_RET(expr, string, ret) \
+do { \
+  if (opt_do_node_verification == FIRM_VERIFICATION_ON) {\
+    if (!(expr) && current_ir_graph != get_const_code_irg()) \
+      dump_ir_graph(current_ir_graph, "-assert"); \
+    assert((expr) && string); } \
+  if (!(expr)) { \
+    if (opt_do_node_verification == FIRM_VERIFICATION_REPORT) \
+      fprintf(stderr, #expr " : " string "\n"); \
+    firm_verify_failure_msg = #expr " && " string; \
+    return (ret); \
+  } \
+} while(0)
+
+#define ASSERT_AND_RET_DBG(expr, string, ret, blk) \
+do { \
+  if (!(expr)) { \
+    firm_verify_failure_msg = #expr " && " string; \
+    if (opt_do_node_verification != FIRM_VERIFICATION_ERROR_ONLY) { blk; } \
+    if (opt_do_node_verification == FIRM_VERIFICATION_REPORT) \
+      fprintf(stderr, #expr " : " string "\n"); \
+    else if (opt_do_node_verification == FIRM_VERIFICATION_ON) { \
+      if (!(expr) && current_ir_graph != get_const_code_irg()) \
+        dump_ir_graph(current_ir_graph, "-assert"); \
+      assert((expr) && string); \
+    } \
+    return (ret); \
+  } \
+} while(0)
+
+#endif
+
+/**
+ * Set the default verify_node and verify_proj_node operation for an ir_op_ops.
+ */
+void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops);
+
+#endif
diff --git a/ir/ir/irvrfy.c b/ir/ir/irvrfy.c
deleted file mode 100644 (file)
index fe56d2d..0000000
+++ /dev/null
@@ -1,2323 +0,0 @@
-/*
- * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
- *
- * This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
- */
-
-/**
- * @file
- * @brief    Check irnodes for correctness.
- * @author   Christian Schaefer, Goetz Lindenmaier, Till Riedel, Michael Beck
- * @version  $Id$
- */
-#include "config.h"
-
-#include "irprog.h"
-#include "irop_t.h"
-#include "irgraph_t.h"
-#include "irvrfy_t.h"
-#include "irgwalk.h"
-#include "irdump.h"
-#include "irdom_t.h"
-#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;
-
-const char *firm_vrfy_failure_msg;
-
-/* enable verification of Load/Store entities */
-void vrfy_enable_entity_tests(int enable)
-{
-       vrfy_entities = enable;
-}
-
-#ifndef NDEBUG
-
-/**
- * little helper for NULL modes
- */
-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 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);
-
-       if (last_irg_error == irg)
-               return;
-
-       last_irg_error = irg;
-
-       if (irg == get_const_code_irg()) {
-               fprintf(stderr, "\nFIRM: irn_vrfy_irg() <of CONST_CODE_IRG> failed\n");
-       } else {
-               ir_entity *ent = get_irg_entity(irg);
-
-               if (ent) {
-                       ir_type *ent_type = get_entity_owner(ent);
-
-                       if (ent_type) {
-                               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));
-                       }
-               } else {
-                       fprintf(stderr, "\nFIRM: irn_vrfy_irg() <IRG %p> failed\n", (void *)irg);
-               }
-       }
-}
-
-/**
- * Prints a failure for a Node
- */
-static void show_node_failure(ir_node *n)
-{
-       show_entity_failure(n);
-       fprintf(stderr, "  node %ld %s%s\n" ,
-               get_irn_node_nr(n),
-               get_irn_opname(n), get_irn_modename(n)
-       );
-}
-
-/**
- * Prints a failure message for a binop
- */
-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);
-
-       show_entity_failure(n);
-       fprintf(stderr, "  node %ld %s%s(%s%s, %s%s) did not match (%s)\n",
-               get_irn_node_nr(n),
-               get_irn_opname(n), get_irn_modename(n),
-               get_irn_opname(left), get_irn_modename(left),
-               get_irn_opname(right), get_irn_modename(right),
-               text);
-}
-
-/**
- * Prints a failure message for an unop
- */
-static void show_unop_failure(ir_node *n, const char *text)
-{
-       ir_node *op  = get_unop_op(n);
-
-       show_entity_failure(n);
-       fprintf(stderr, "  node %ld %s%s(%s%s) did not match (%s)\n",
-               get_irn_node_nr(n),
-               get_irn_opname(n), get_irn_modename(n),
-               get_irn_opname(op), get_irn_modename(op),
-               text);
-}
-
-/**
- * Prints a failure message for an op with 3 operands
- */
-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);
-
-       show_entity_failure(n);
-       fprintf(stderr, "  of node %ld %s%s(%s%s, %s%s, %s%s) did not match (%s)\n",
-               get_irn_node_nr(n),
-               get_irn_opname(n), get_irn_modename(n),
-               get_irn_opname(op0), get_irn_modename(op0),
-               get_irn_opname(op1), get_irn_modename(op1),
-               get_irn_opname(op2), get_irn_modename(op2),
-               text);
-}
-
-/**
- * Prints a failure message for a proj
- */
-static void show_proj_failure(ir_node *n)
-{
-       ir_node *op  = get_Proj_pred(n);
-       int proj     = get_Proj_proj(n);
-
-       show_entity_failure(n);
-       fprintf(stderr, "  node %ld %s%s %d(%s%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));
-}
-
-/**
- * Prints a failure message for a proj from Start
- */
-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,
-               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)
-{
-       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), 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)
-{
-       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)
-{
-       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(", 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))));
-       }
-       fprintf(stderr, ") != CALL(");
-
-       for (i = 0; i < get_Call_n_params(n); ++i) {
-               fprintf(stderr, "%s ", get_mode_name_ex(get_irn_mode(get_Call_param(n, i))));
-       }
-       fprintf(stderr, ")\n");
-}
-
-/**
- * Show return modes
- */
-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);
-       fprintf(stderr, "  Return node %ld in entity \"%s\" mode %s different from type mode %s\n",
-               get_irn_node_nr(n), get_entity_name(ent),
-               get_mode_name_ex(get_irn_mode(get_Return_res(n, i))),
-               get_mode_name_ex(get_type_mode(get_method_res_type(mt, i)))
-       );
-}
-
-/**
- * Show return number of results
- */
-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);
-       fprintf(stderr, "  Return node %ld in entity \"%s\" has %d results different from type %d\n",
-               get_irn_node_nr(n), get_entity_name(ent),
-               get_Return_n_ress(n), get_method_n_ress(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)),
-               get_irn_node_nr(pred), get_mode_name_ex(get_irn_mode(pred)));
-}
-
-/**
- * Show Phi inputs
- */
-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),
-               get_irn_node_nr(block), get_irn_arity(block));
-}
-
-#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 (is_Sel(ptr)) {
-               return get_Sel_entity(ptr);
-       } else if (is_SymConst_addr_ent(ptr)) {
-               return get_SymConst_entity(ptr);
-       }
-       return NULL;
-}
-
-/**
- * verify a Proj(Start) node
- */
-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_tls          && mode_is_reference(mode)) ||
-                       (proj == pn_Start_T_args         && mode == mode_T)
-               ),
-               "wrong Proj from Start", 0,
-               show_proj_failure(p);
-       );
-       return 1;
-}
-
-/**
- * verify a Proj(Cond) node
- */
-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);
-
-       ASSERT_AND_RET_DBG(
-               (
-                       (proj >= 0 && mode == mode_X && get_irn_mode(get_Cond_selector(pred)) == mode_b) ||   /* compare */
-                       (mode == mode_X && mode_is_int(get_irn_mode(get_Cond_selector(pred)))) ||             /* switch */
-                       is_Bad(get_Cond_selector(pred))                                                       /* rare */
-               ),
-               "wrong Proj from Cond", 0,
-               show_proj_failure(p);
-       );
-       return 1;
-}
-
-/**
- * verify a Proj(Raise) node
- */
-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)),
-               "wrong Proj from Raise", 0,
-               show_proj_failure(p);
-       );
-       return 1;
-}
-
-/**
- * verify a Proj(InstOf) node
- */
-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         && 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))
-               ),
-               "wrong Proj from InstOf", 0,
-               show_proj_failure(p);
-       );
-       return 1;
-}
-
-/**
- * verify a Proj(Call) node
- */
-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                && 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_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(
-                       !is_NoMem(get_Call_mem(n)),
-                       "Regular Proj from FunctionCall", 0);
-       else if (proj == pn_Call_X_except)
-               ASSERT_AND_RET(
-                       !is_NoMem(get_Call_mem(n)),
-                       "Exception Proj from FunctionCall", 0);
-       return 1;
-}
-
-/**
- * verify a Proj(Quot) node
- */
-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);
-
-       ASSERT_AND_RET_DBG(
-               (
-                       (proj == pn_Quot_M         && mode == mode_M) ||
-                       (proj == pn_Quot_X_regular && mode == mode_X) ||
-                       (proj == pn_Quot_X_except  && mode == mode_X) ||
-                       (proj == pn_Quot_res       && mode_is_float(mode) && mode == get_Quot_resmode(n))
-               ),
-               "wrong Proj from Quot", 0,
-               show_proj_failure(p);
-       );
-       if (proj == pn_Quot_X_regular)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Regular Proj from unpinned Quot", 0);
-       else if (proj == pn_Quot_X_except)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Exception Proj from unpinned Quot", 0);
-       else if (proj == pn_Quot_M)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Memory Proj from unpinned Quot", 0);
-       return 1;
-}
-
-/**
- * verify a Proj(DivMod) node
- */
-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);
-
-       ASSERT_AND_RET_DBG(
-               (
-                       (proj == pn_DivMod_M         && mode == mode_M) ||
-                       (proj == pn_DivMod_X_regular && mode == mode_X) ||
-                       (proj == pn_DivMod_X_except  && mode == mode_X) ||
-                       (proj == pn_DivMod_res_div   && mode_is_int(mode) && mode == get_DivMod_resmode(n)) ||
-                       (proj == pn_DivMod_res_mod   && mode_is_int(mode) && mode == get_DivMod_resmode(n))
-               ),
-               "wrong Proj from DivMod", 0,
-               show_proj_failure(p);
-       );
-       if (proj == pn_DivMod_X_regular)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Regular Proj from unpinned DivMod", 0);
-       else if (proj == pn_DivMod_X_except)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Exception Proj from unpinned DivMod", 0);
-       else if (proj == pn_DivMod_M)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Memory Proj from unpinned DivMod", 0);
-       return 1;
-}
-
-/**
- * verify a Proj(Div) node
- */
-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);
-
-       ASSERT_AND_RET_DBG(
-               (
-                       (proj == pn_Div_M         && mode == mode_M) ||
-                       (proj == pn_Div_X_regular && mode == mode_X) ||
-                       (proj == pn_Div_X_except  && mode == mode_X) ||
-                       (proj == pn_Div_res       && mode_is_int(mode) && mode == get_Div_resmode(n))
-               ),
-               "wrong Proj from Div", 0,
-               show_proj_failure(p);
-       );
-       if (proj == pn_Div_X_regular)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Regular Proj from unpinned Div", 0);
-       else if (proj == pn_Div_X_except)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Exception Proj from unpinned Div", 0);
-       else if (proj == pn_Div_M)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Memory Proj from unpinned Div", 0);
-       return 1;
-}
-
-/**
- * verify a Proj(Mod) node
- */
-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);
-
-       ASSERT_AND_RET_DBG(
-               (
-                       (proj == pn_Mod_M         && mode == mode_M) ||
-                       (proj == pn_Mod_X_regular && mode == mode_X) ||
-                       (proj == pn_Mod_X_except  && mode == mode_X) ||
-                       (proj == pn_Mod_res       && mode_is_int(mode) && mode == get_Mod_resmode(n))
-               ),
-               "wrong Proj from Mod", 0,
-               show_proj_failure(p);
-       );
-       if (proj == pn_Mod_X_regular)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Regular Proj from unpinned Mod", 0);
-       else if (proj == pn_Mod_X_except)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Exception Proj from unpinned Mod", 0);
-       else if (proj == pn_Mod_M)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Memory Proj from unpinned Div", 0);
-       return 1;
-}
-
-/**
- * verify a Proj(Cmp) node
- */
-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;
-}
-
-/**
- * verify a Proj(Load) node
- */
-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);
-
-       if (proj == pn_Load_res) {
-               ir_node *ptr = get_Load_ptr(n);
-               ir_entity *ent = get_ptr_entity(ptr);
-
-               if (vrfy_entities && ent && get_irg_phase_state(current_ir_graph) == phase_high) {
-                       /* do NOT check this for lowered phases, see comment on Store */
-                       ASSERT_AND_RET_DBG(
-                               (mode == get_type_mode(get_entity_type(ent))),
-                               "wrong data Proj from Load, entity type_mode failed", 0,
-                               show_proj_failure_ent(p, ent);
-                       );
-               }
-               else {
-                       ASSERT_AND_RET_DBG(
-                               mode_is_data(mode) && mode == get_Load_mode(n),
-                               "wrong data Proj from Load", 0,
-                               show_proj_failure(p);
-                       );
-               }
-       }
-       else {
-               ASSERT_AND_RET_DBG(
-                       (
-                               (proj == pn_Load_M         && mode == mode_M) ||
-                               (proj == pn_Load_X_regular && mode == mode_X) ||
-                               (proj == pn_Load_X_except  && mode == mode_X)
-                       ),
-                       "wrong Proj from Load", 0,
-                       show_proj_failure(p);
-               );
-       }
-       if (proj == pn_Load_X_regular) {
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Regular Proj from unpinned Load", 0);
-       } else if (proj == pn_Load_X_except) {
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Exception Proj from unpinned Load", 0);
-       }
-       return 1;
-}
-
-/**
- * verify a Proj(Store) node
- */
-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);
-
-       ASSERT_AND_RET_DBG(
-               (
-                       (proj == pn_Store_M         && mode == mode_M) ||
-                       (proj == pn_Store_X_regular && mode == mode_X) ||
-                       (proj == pn_Store_X_except  && mode == mode_X)
-               ),
-               "wrong Proj from Store", 0,
-               show_proj_failure(p);
-       );
-       if (proj == pn_Store_X_regular) {
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Regular Proj from unpinned Store", 0);
-       } else if (proj == pn_Store_X_except) {
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Exception Proj from unpinned Store", 0);
-       }
-       return 1;
-}
-
-/**
- * verify a Proj(Alloc) node
- */
-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(
-               (
-                       (proj == pn_Alloc_M         && mode == mode_M) ||
-                       (proj == pn_Alloc_X_regular && mode == mode_X) ||
-                       (proj == pn_Alloc_X_except  && mode == mode_X) ||
-                       (proj == pn_Alloc_res       && mode_is_reference(mode))
-               ),
-               "wrong Proj from Alloc", 0,
-               show_proj_failure(p);
-       );
-       return 1;
-}
-
-/**
- * verify a Proj(Proj) node
- */
-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);
-       ir_type *mt; /* A method type */
-
-       pred = skip_Id(get_Proj_pred(pred));
-       ASSERT_AND_RET((get_irn_mode(pred) == mode_T), "Proj from something not a tuple", 0);
-
-       switch (get_irn_opcode(pred)) {
-       case iro_Start:
-               mt = get_entity_type(get_irg_entity(get_irn_irg(pred)));
-
-               if (nr == pn_Start_T_args) {
-                       ASSERT_AND_RET(
-                               (proj >= 0 && mode_is_datab(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
-                               );
-                       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));
-                                               );
-                       }
-               }
-               break;
-
-       case iro_Call:
-               {
-                       ASSERT_AND_RET(
-                               (proj >= 0 && mode_is_datab(mode)),
-                               "wrong Proj from Proj from Call", 0);
-                       mt = get_Call_type(pred);
-                       ASSERT_AND_RET(mt == get_unknown_type() || is_Method_type(mt),
-                                       "wrong call type on call", 0);
-                       ASSERT_AND_RET(
-                               (proj < get_method_n_ress(mt)),
-                               "More Projs for results than results in type.", 0);
-                       if ((mode_is_reference(mode)) && is_compound_type(get_method_res_type(mt, proj)))
-                               /* value result */ break;
-
-                               ASSERT_AND_RET(
-                               (mode == get_type_mode(get_method_res_type(mt, proj))),
-                               "Mode of Proj from Call doesn't match mode of result type.", 0);
-               }
-               break;
-
-       case iro_Tuple:
-               /* We don't test */
-               break;
-
-       case iro_Bad:
-               /* hmm, optimization did not remove it */
-               break;
-
-       default:
-               /* ASSERT_AND_RET(0, "Unknown opcode", 0); */
-               break;
-       }
-       return 1;
-}
-
-/**
- * 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;
-}
-
-/**
- * verify a Proj(CopyB) node
- */
-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         && mode == mode_M) ||
-                       (proj == pn_CopyB_X_regular && mode == mode_X) ||
-                       (proj == pn_CopyB_X_except  && mode == mode_X)
-               ),
-               "wrong Proj from CopyB", 0,
-               show_proj_failure(p);
-       );
-       if (proj == pn_CopyB_X_regular)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Regular Proj from unpinned CopyB", 0);
-       else if (proj == pn_CopyB_X_except)
-               ASSERT_AND_RET(
-                       get_irn_pinned(n) == op_pin_state_pinned,
-                       "Exception Proj from unpinned CopyB", 0);
-       return 1;
-}
-
-/**
- * verify a Proj(Bound) node
- */
-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);
-
-       /* ignore Bound checks of Bad */
-       if (is_Bad(get_Bound_index(n)))
-               return 1;
-       ASSERT_AND_RET_DBG(
-               (
-                       (proj == pn_Bound_M         && mode == mode_M) ||
-                       (proj == pn_Bound_X_regular && mode == mode_X) ||
-                       (proj == pn_Bound_X_except  && mode == mode_X) ||
-                       (proj == pn_Bound_res       && mode == get_irn_mode(get_Bound_index(n)))
-               ),
-               "wrong Proj from Bound", 0,
-               show_proj_failure(p);
-       );
-       return 1;
-}
-
-/**
- * verify a Proj node
- */
-static int verify_node_Proj(ir_node *p, ir_graph *irg)
-{
-       ir_node *pred;
-       ir_op *op;
-
-       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);
-
-       if (op->ops.verify_proj_node)
-               return op->ops.verify_proj_node(pred, p);
-
-       /* all went ok */
-       return 1;
-}
-
-/**
- * verify a Block node
- */
-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) || (get_irn_mode(pred) == mode_X),
-                       "Block node must have a mode_X predecessor", 0);
-       }
-
-       if (n == get_irg_start_block(irg)) {
-               ASSERT_AND_RET(get_Block_n_cfgpreds(n) == 0, "Start Block node", 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. */
-               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))
-                               break;   /*  We can not test properly.  How many tuples are there? */
-                       ASSERT_AND_RET(
-                               (
-                                       is_Return(pred) ||
-                                       is_Bad(pred)    ||
-                                       is_Raise(pred)  ||
-                                       is_fragile_op(pred)
-                               ),
-                               "End Block node", 0);
-               }
-               /*  irg attr must == graph we are in. */
-               ASSERT_AND_RET(((get_irn_irg(n) && get_irn_irg(n) == irg)), "Block node has wrong irg attribute", 0);
-               return 1;
-}
-
-/**
- * verify a Start node
- */
-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 */
-               mymode == mode_T, "Start node", 0
-               );
-       return 1;
-}
-
-/**
- * verify a Jmp node
- */
-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 */
-               mymode == mode_X, "Jmp node", 0
-       );
-       return 1;
-}
-
-/**
- * verify an IJmp node
- */
-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 */
-               mymode == mode_X && mode_is_reference(op1mode), "IJmp node", 0
-       );
-       return 1;
-}
-
-/**
- * verify a Cond node
- */
-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 */
-               (op1mode == mode_b ||
-               /* Cond: BB x int --> X^n */
-               mode_is_int(op1mode) ),  "Cond node", 0
-               );
-       ASSERT_AND_RET(mymode == mode_T, "Cond mode is not a tuple", 0);
-
-       return 1;
-}
-
-/**
- * verify a Return node
- */
-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));
-       ir_type *mt;
-
-       /* Return: BB x M x data1 x ... x datan --> X */
-
-       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_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 */
-       mt = get_entity_type(get_irg_entity(irg));
-       ASSERT_AND_RET_DBG( get_Return_n_ress(n) == get_method_n_ress(mt),
-               "Number of results for Return doesn't match number of results in type.", 0,
-               show_return_nres(irg, n, mt););
-       for (i = get_Return_n_ress(n) - 1; i >= 0; --i) {
-               ir_type *res_type = get_method_res_type(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;
-}
-
-/**
- * verify a Raise node
- */
-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 */
-               op1mode == mode_M && mode_is_reference(op2mode) &&
-               mymode == mode_T, "Raise node", 0
-       );
-       return 1;
-}
-
-/**
- * verify a Const node
- */
-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 */
-               (mode_is_data(mymode) ||
-               mymode == mode_b)      /* we want boolean constants for static evaluation */
-               ,"Const node", 0       /* of Cmp. */
-       );
-       ASSERT_AND_RET(
-               /* the modes of the constant and teh tarval must match */
-               mymode == get_tarval_mode(get_Const_tarval(n)),
-               "Const node, tarval and node mode mismatch", 0
-       );
-       return 1;
-}
-
-/**
- * verify a SymConst node
- */
-static int verify_node_SymConst(ir_node *n, ir_graph *irg)
-{
-       ir_mode *mymode = get_irn_mode(n);
-       (void) irg;
-
-       ASSERT_AND_RET(
-               /* SymConst: BB --> int*/
-               (mode_is_int(mymode) ||
-               /* SymConst: BB --> ref */
-               mode_is_reference(mymode))
-               ,"SymConst node", 0);
-       return 1;
-}
-
-/**
- * verify a Sel node
- */
-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));
-       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 */
-               (op1mode == mode_M && op2mode == mymode && mode_is_reference(mymode)),
-               "Sel node", 0, show_node_failure(n)
-       );
-
-       for (i = get_Sel_n_indexs(n) - 1; i >= 0; --i) {
-               ASSERT_AND_RET_DBG(mode_is_int(get_irn_mode(get_Sel_index(n, i))), "Sel node", 0, show_node_failure(n));
-       }
-       ent = get_Sel_entity(n);
-       ASSERT_AND_RET_DBG(ent, "Sel node with empty entity", 0, show_node_failure(n));
-       return 1;
-}
-
-/**
- * verify an InstOf node
- */
-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
- */
-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));
-       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(verify_right_pinned(n),"Call node with wrong memory input", 0 );
-
-       mt = get_Call_type(n);
-       if (get_unknown_type() == mt) {
-               return 1;
-       }
-
-       for (i = get_Call_n_params(n) - 1; i >= 0; --i) {
-               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 */
-       /* Compare arguments of node with those of type */
-
-       if (get_method_variadicity(mt) == variadicity_variadic) {
-               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 variadic type.",
-                       0,
-                       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_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,
-                       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 (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);
-                               );
-                       }
-               }
-       }
-
-#if 0
-       if (Call_has_callees(n)) {
-               for (i = 0; i < get_Call_n_callees(n); i++) {
-                       ASSERT_AND_RET(is_entity(get_Call_callee(n, i)), "callee array must contain entities.", 0);
-               }
-       }
-#endif
-       return 1;
-}
-
-/**
- * verify an Add node
- */
-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_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 */
-                       (mode_is_int(op1mode) && op2mode == mymode && mode_is_reference(mymode))
-               ),
-               "Add node", 0,
-               show_binop_failure(n, "/* common Add: BB x numP x numP --> numP */ |\n"
-                       "/* Pointer Add: BB x ref x int --> ref */   |\n"
-                       "/* Pointer Add: BB x int x ref --> ref */");
-       );
-       return 1;
-}
-
-/**
- * verify a Sub node
- */
-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_data(op1mode)) ||
-                       /* Pointer Sub: BB x ref x int --> ref */
-                       (op1mode == mymode && mode_is_int(op2mode) && 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 ref x ref --> int */" );
-               );
-       return 1;
-}
-
-/**
- * verify a Minus node
- */
-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 */
-               op1mode == mymode && mode_is_num(op1mode), "Minus node", 0,
-               show_unop_failure(n , "/* Minus: BB x num --> num */");
-       );
-       return 1;
-}
-
-/**
- * verify a Mul node
- */
-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 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 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
- */
-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));
-       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 */
-               op1mode == mode_M && op2mode == op3mode &&
-               get_mode_sort(op2mode) == irms_float_number &&
-               mymode == mode_T,
-               "Quot node",0,
-               show_binop_failure(n, "/* Quot: BB x M x float x float --> M x X x float */");
-       );
-       return 1;
-}
-
-/**
- * verify a DivMod node
- */
-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));
-       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 */
-               op1mode == mode_M &&
-               mode_is_int(op2mode) &&
-               op3mode == op2mode &&
-               mymode == mode_T,
-               "DivMod node", 0
-               );
-       return 1;
-}
-
-/**
- * verify a Div node
- */
-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));
-       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 */
-               op1mode == mode_M &&
-               op2mode == op3mode &&
-               mode_is_int(op2mode) &&
-               mymode == mode_T,
-               "Div node", 0
-               );
-       return 1;
-}
-
-/**
- * verify a Mod node
- */
-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));
-       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 */
-               op1mode == mode_M &&
-               op2mode == op3mode &&
-               mode_is_int(op2mode) &&
-               mymode == mode_T,
-               "Mod node", 0
-               );
-       return 1;
-}
-
-/**
- * verify an Abs node
- */
-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 */
-               op1mode == mymode &&
-               mode_is_num (op1mode),
-               "Abs node", 0,
-               show_unop_failure(n, "/* Abs: BB x num --> num */");
-       );
-       return 1;
-}
-
-/**
- * verify a logical And, Or, Eor node
- */
-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 */
-               (mode_is_int(mymode) || mymode == mode_b) &&
-               op2mode == op1mode &&
-               mymode == op2mode,
-               "And, Or or Eor node", 0,
-               show_binop_failure(n, "/* And or Or or Eor: BB x int x int --> int */");
-       );
-       return 1;
-}
-
-#define verify_node_And   verify_node_Logic
-#define verify_node_Or    verify_node_Logic
-#define verify_node_Eor   verify_node_Logic
-
-/**
- * verify a Not node
- */
-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) || mymode == mode_b) &&
-               mymode == op1mode,
-               "Not node", 0,
-               show_unop_failure(n, "/* Not: BB x int --> int */");
-       );
-       return 1;
-}
-
-/**
- * verify a Cmp node
- */
-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_datab(op1mode) &&
-               op2mode == op1mode &&
-               mymode == mode_T,
-               "Cmp node", 0,
-               show_binop_failure(n, "/* Cmp: BB x datab x datab --> b16 */");
-       );
-       return 1;
-}
-
-/**
- * verify a Shift node
- */
-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 */
-               mode_is_int(op1mode) &&
-               mode_is_int(op2mode) &&
-               !mode_is_signed(op2mode) &&
-               mymode == op1mode,
-               "Shl, Shr or Shrs node", 0,
-               show_binop_failure(n, "/* Shl, Shr or Shrs: BB x int x int_u --> int */");
-       );
-       return 1;
-}
-
-#define verify_node_Shl   verify_node_Shift
-#define verify_node_Shr   verify_node_Shift
-#define verify_node_Shrs  verify_node_Shift
-
-/**
- * verify a Rotl node
- */
-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_Rotl_left(n));
-       ir_mode *op2mode = get_irn_mode(get_Rotl_right(n));
-       (void) irg;
-
-       ASSERT_AND_RET_DBG(
-               /* Rotl: BB x int x int --> int */
-               mode_is_int(op1mode) &&
-               mode_is_int(op2mode) &&
-               mymode == op1mode,
-               "Rotl node", 0,
-               show_binop_failure(n, "/* Rotl: BB x int x int --> int */");
-       );
-       return 1;
-}
-
-/**
- * verify a Conv node
- */
-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(
-               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 datab --> data */");
-       );
-       return 1;
-}
-
-/**
- * verify a Cast node
- */
-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 */
-               mode_is_data(op1mode) && op1mode == mymode,
-               "Cast node", 0,
-               show_unop_failure(n, "/* Conv: BB x datab1 --> datab2 */");
-       );
-       return 1;
-}
-
-/**
- * verify a Phi node
- */
-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) {
-               ASSERT_AND_RET_DBG(
-                       get_irn_arity(n) == get_irn_arity(block),
-                       "wrong number of inputs in Phi node", 0,
-                       show_phi_inputs(n, block);
-               );
-       }
-
-       /* Phi: BB x dataM^n --> dataM */
-       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,
-                               show_phi_failure(n, pred, i);
-                       );
-               }
-       }
-       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) {
-                       int j;
-                       ir_node *pred_i = get_Phi_pred(n, i);
-
-                       if (is_Bad(pred_i))
-                               continue;
-                       for (j = i - 1; j >= 0; --j) {
-                               ir_node *pred_j = get_Phi_pred(n, j);
-
-                               if (is_Bad(pred_j))
-                                       continue;
-#if 0
-                               /* currently this checks fails for blocks with exception
-                                  outputs (and these are NOT basic blocks).  So it is disabled yet. */
-                               ASSERT_AND_RET_DBG(
-                                       (pred_i == pred_j) || (get_irn_n(pred_i, -1) != get_irn_n(pred_j, -1)),
-                                       "At least two different PhiM predecessors are in the same block",
-                                       0,
-                                       ir_printf("%+F and %+F of %+F are in %+F\n", pred_i, pred_j, n, get_irn_n(pred_i, -1))
-                               );
-#endif
-                       }
-               }
-       }
-       return 1;
-}
-
-/**
- * verify a Load node
- */
-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));
-
-       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 );
-       }
-       ASSERT_AND_RET( mymode == mode_T, "Load node", 0 );
-
-       /*
-        * jack's gen_add_firm_code:simpleSel seems to build Load (Load
-        * (Proj (Proj))) sometimes ...
-
-        * interprete.c:ai_eval seems to assume that this happens, too
-
-        * obset.c:get_abstval_any can't deal with this if the load has
-        * mode_T
-        *
-         {
-         ir_entity *ent = hunt_for_entity (get_Load_ptr (n), n);
-         assert ((NULL != ent) || (mymode != mode_T));
-         }
-        */
-
-       return 1;
-}
-
-/**
- * verify a Store node
- */
-static int verify_node_Store(ir_node *n, ir_graph *irg)
-{
-       ir_entity *target;
-
-       ir_mode *mymode  = get_irn_mode(n);
-       ir_mode *op1mode = get_irn_mode(get_Store_mem(n));
-       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_datab(op3mode), "Store node", 0 );
-       if (get_irg_phase_state(irg) != phase_backend) {
-               ASSERT_AND_RET(mode_is_reference(op2mode), "Store node", 0 );
-       }
-       ASSERT_AND_RET(mymode == mode_T, "Store node", 0);
-
-       target = get_ptr_entity(get_Store_ptr(n));
-       if (vrfy_entities && target && get_irg_phase_state(current_ir_graph) == phase_high) {
-               /*
-                * If lowered code, any Sels that add 0 may be removed, causing
-                * an direct access to entities of array or compound type.
-                * Prevent this by checking the phase.
-                */
-               ASSERT_AND_RET( op3mode == get_type_mode(get_entity_type(target)),
-                       "Store node", 0);
-       }
-
-       return 1;
-}
-
-/**
- * verify an Alloc node
- */
-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_count(n));
-       (void) irg;
-
-       ASSERT_AND_RET_DBG(
-               /* Alloc: BB x M x int_u --> M x X x ref */
-               op1mode == mode_M &&
-               mode_is_int(op2mode) &&
-               !mode_is_signed(op2mode) &&
-               mymode == mode_T,
-               "Alloc node", 0,
-               show_node_failure(n);
-       );
-       return 1;
-}
-
-/**
- * verify a Free node
- */
-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));
-       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 */
-               op1mode == mode_M && mode_is_reference(op2mode) &&
-               mode_is_int(op3mode) &&
-               !mode_is_signed(op3mode) &&
-               mymode == mode_M,
-               "Free node", 0,
-               show_triop_failure(n, "/* Free: BB x M x ref x int_u --> M */");
-       );
-       return 1;
-}
-
-/**
- * verify a Sync node
- */
-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) {
-               ASSERT_AND_RET( get_irn_mode(get_Sync_pred(n, i)) == mode_M, "Sync node", 0 );
-       };
-       ASSERT_AND_RET( mymode == mode_M, "Sync node", 0 );
-       return 1;
-}
-
-/**
- * verify a Confirm node
- */
-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 */
-               op1mode == mymode &&
-               op2mode == mymode,
-               "Confirm node", 0,
-               show_binop_failure(n, "/* Confirm: BB x T x T --> T */");
-       );
-       return 1;
-}
-
-/**
- * verify a Mux node
- */
-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));
-       ir_mode *op3mode = get_irn_mode(get_Mux_false(n));
-       (void) irg;
-
-       ASSERT_AND_RET(
-               /* Mux: BB x b x datab x datab --> datab */
-               op1mode == mode_b &&
-               op2mode == mymode &&
-               op3mode == mymode &&
-               mode_is_datab(mymode),
-               "Mux node", 0
-               );
-       return 1;
-}
-
-/**
- * verify a CopyB node
- */
-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));
-       ir_mode *op3mode = get_irn_mode(get_CopyB_src(n));
-       ir_type *t = get_CopyB_type(n);
-
-       /* CopyB: BB x M x ref x ref --> M x X */
-       ASSERT_AND_RET(mymode == mode_T && op1mode == mode_M, "CopyB node", 0);
-       if (get_irg_phase_state(irg) != phase_backend) {
-               ASSERT_AND_RET(mode_is_reference(op2mode) && mode_is_reference(op3mode),
-                       "CopyB node", 0 );
-       }
-
-       ASSERT_AND_RET(
-               is_compound_type(t) || is_Array_type(t),
-               "CopyB node should copy compound types only", 0 );
-
-       /* 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(verify_right_pinned(n), "CopyB node with wrong memory input", 0 );
-       return 1;
-}
-
-/**
- * verify a Bound node
- */
-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));
-       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(
-               mymode == mode_T &&
-               op1mode == mode_M &&
-               op2mode == op3mode &&
-               op3mode == op4mode &&
-               mode_is_int(op3mode),
-               "Bound node", 0 );
-       return 1;
-}
-
-/**
- * Check dominance.
- * For each usage of a node, it is checked, if the block of the
- * node dominates the block of the usage (for phis: the predecessor
- * block of the phi for the corresponding edge).
- *
- * @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 */
-       else if (use != get_irg_end(current_ir_graph) && use != current_ir_graph->anchor) {
-               int i;
-               ir_node *bl = get_nodes_block(use);
-
-               for (i = get_irn_arity(use) - 1; i >= 0; --i) {
-                       ir_node *def    = get_irn_n(use, i);
-                       ir_node *def_bl = get_nodes_block(def);
-                       ir_node *use_bl = bl;
-
-                       /* ignore dead definition blocks, will be removed */
-                       if (is_Block_dead(def_bl) || get_Block_dom_depth(def_bl) == -1)
-                               continue;
-
-                       if (is_Phi(use))
-                               use_bl = get_Block_cfgpred_block(bl, i);
-
-                       /* ignore dead use blocks, will be removed */
-                       if (is_Block_dead(use_bl) || get_Block_dom_depth(use_bl) == -1)
-                               continue;
-
-                       ASSERT_AND_RET_DBG(
-                               block_dominates(def_bl, use_bl),
-                               "the definition of a value used violates the dominance property", 0,
-                               ir_fprintf(stderr,
-                               "graph %+F: %+F of %+F must dominate %+F of user %+F input %d\n",
-                               current_ir_graph, def_bl, def, use_bl, use, i
-                               );
-                       );
-               }
-       }
-       return 1;
-}
-
-/* Tests the modes of n and its predecessors. */
-int irn_vrfy_irg(ir_node *n, ir_graph *irg)
-{
-       int i;
-       ir_op *op;
-
-       if (!get_node_verification_mode())
-               return 1;
-
-       /*
-        * do NOT check placement in interprocedural view, as we don't always
-        * know the "right" graph ...
-        */
-
-#ifndef NDEBUG
-       /* this is an expensive check for large graphs (it has a quadratic
-        * runtime but with a small constant); 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", n, node_from_map, node_from_map));
-       }
-
-       op = get_irn_op(n);
-
-       /* 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) {
-               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);
-
-       /* All went ok */
-       return 1;
-}
-
-int irn_vrfy(ir_node *n)
-{
-#ifdef DEBUG_libfirm
-       return irn_vrfy_irg(n, current_ir_graph);
-#else
-       (void)n;
-       return 1;
-#endif
-}
-
-/*-----------------------------------------------------------------*/
-/* Verify the whole graph.                                         */
-/*-----------------------------------------------------------------*/
-
-#ifdef DEBUG_libfirm
-/**
- * Walker to check every node
- */
-static void vrfy_wrap(ir_node *node, void *env)
-{
-       int *res = env;
-       *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)
-{
-       int *res = env;
-
-       *res = irn_vrfy_irg(node, current_ir_graph);
-       if (*res) {
-               *res = check_dominance_for_node(node);
-       }
-}
-
-#endif /* DEBUG_libfirm */
-
-/*
- * Calls irn_vrfy for each node in irg.
- * 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 res = 1;
-#ifdef DEBUG_libfirm
-       ir_graph *rem;
-
-       rem = current_ir_graph;
-       current_ir_graph = irg;
-
-#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_anchors(
-               irg,
-               get_irg_dom_state(irg) == dom_consistent &&
-               get_irg_pinned(irg) == op_pin_state_pinned ? vrfy_wrap_ssa : vrfy_wrap,
-               NULL, &res
-       );
-
-       if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT && ! res) {
-               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 *)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();
-
-       firm_vrfy_failure_msg = NULL;
-       do_node_verification(FIRM_VERIFICATION_ERROR_ONLY);
-       res = irn_vrfy_irg(n, irg);
-       if (res && get_irg_dom_state(irg) == dom_consistent &&
-           get_irg_pinned(irg) == op_pin_state_pinned)
-               res = check_dominance_for_node(n);
-       do_node_verification(old);
-       *bad_string = firm_vrfy_failure_msg;
-
-       return res;
-}
-
-
-typedef struct _vrfy_bad_env_t {
-       int flags;
-       int res;
-} vrfy_bad_env_t;
-
-/**
- * Pre-Walker: check Bad predecessors of node.
- */
-static void check_bads(ir_node *node, void *env)
-{
-       vrfy_bad_env_t *venv = env;
-       int i, arity = get_irn_arity(node);
-
-       if (is_Block(node)) {
-               if ((venv->flags & BAD_CF) == 0) {
-
-                       /* check for Bad Block predecessor */
-                       for (i = 0; i < arity; ++i) {
-                               ir_node *pred = get_irn_n(node, i);
-
-                               if (is_Bad(pred)) {
-                                       venv->res |= BAD_CF;
-
-                                       if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
-                                               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_graph(current_ir_graph, "-assert");
-                                               assert(0 && "Bad CF detected");
-                                       }
-                               }
-                       }
-               }
-       } else {
-               if ((venv->flags & BAD_BLOCK) == 0) {
-
-                       /* check for Bad Block */
-                       if (is_Bad(get_nodes_block(node))) {
-                               venv->res |= BAD_BLOCK;
-
-                               if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
-                                       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_graph(current_ir_graph, "-assert");
-                                       assert(0 && "Bad CF detected");
-                               }
-                       }
-               }
-
-               if ((venv->flags & TUPLE) == 0) {
-                       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_graph(current_ir_graph, "-assert");
-                                       assert(0 && "Tuple detected");
-                               }
-                       }
-               }
-
-               for (i = 0; i < arity; ++i) {
-                       ir_node *pred = get_irn_n(node, i);
-
-                       if (is_Bad(pred)) {
-                               /* check for Phi with Bad inputs */
-                               if (is_Phi(node) && !is_Bad(get_nodes_block(node)) && is_Bad(get_irn_n(get_nodes_block(node), i))) {
-                                       if (venv->flags & BAD_CF)
-                                               continue;
-                                       else {
-                                               venv->res |= BAD_CF;
-
-                                               if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
-                                                       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_graph(current_ir_graph, "-assert");
-                                                       assert(0 && "Bad CF detected");
-                                               }
-                                       }
-                               }
-
-                               /* Bad node input */
-                               if ((venv->flags & BAD_DF) == 0) {
-                                       venv->res |= BAD_DF;
-
-                                       if (get_node_verification_mode() == FIRM_VERIFICATION_REPORT) {
-                                               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_graph(current_ir_graph, "-assert");
-                                               assert(0 && "Bad NON-CF detected");
-                                       }
-                               }
-                       }
-               }
-       }
-}
-
-/*
- * verify occurrence of bad nodes
- */
-int irg_vrfy_bads(ir_graph *irg, int flags)
-{
-       vrfy_bad_env_t env;
-
-       env.flags = flags;
-       env.res   = 0;
-
-       irg_walk_graph(irg, check_bads, NULL, &env);
-
-       return env.res;
-}
-
-/*
- * set the default verify operation
- */
-void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops)
-{
-#define CASE(a)                           \
-   case iro_##a:                          \
-     ops->verify_node  = verify_node_##a; \
-     break
-
-       switch (code) {
-       CASE(Proj);
-       CASE(Block);
-       CASE(Start);
-       CASE(Jmp);
-       CASE(IJmp);
-       CASE(Cond);
-       CASE(Return);
-       CASE(Raise);
-       CASE(Const);
-       CASE(SymConst);
-       CASE(Sel);
-       CASE(InstOf);
-       CASE(Call);
-       CASE(Add);
-       CASE(Sub);
-       CASE(Minus);
-       CASE(Mul);
-       CASE(Mulh);
-       CASE(Quot);
-       CASE(DivMod);
-       CASE(Div);
-       CASE(Mod);
-       CASE(Abs);
-       CASE(And);
-       CASE(Or);
-       CASE(Eor);
-       CASE(Not);
-       CASE(Cmp);
-       CASE(Shl);
-       CASE(Shr);
-       CASE(Shrs);
-       CASE(Rotl);
-       CASE(Conv);
-       CASE(Cast);
-       CASE(Phi);
-       CASE(Load);
-       CASE(Store);
-       CASE(Alloc);
-       CASE(Free);
-       CASE(Sync);
-       CASE(Confirm);
-       CASE(Mux);
-       CASE(CopyB);
-       CASE(Bound);
-       default:
-               /* leave NULL */;
-       }
-#undef CASE
-
-#define CASE(a)                          \
-   case iro_##a:                         \
-     ops->verify_proj_node  = verify_node_Proj_##a; \
-     break
-
-       switch (code) {
-       CASE(Start);
-       CASE(Cond);
-       CASE(Raise);
-       CASE(InstOf);
-       CASE(Call);
-       CASE(Quot);
-       CASE(DivMod);
-       CASE(Div);
-       CASE(Mod);
-       CASE(Cmp);
-       CASE(Load);
-       CASE(Store);
-       CASE(Alloc);
-       CASE(Proj);
-       CASE(Tuple);
-       CASE(CopyB);
-       CASE(Bound);
-       default:
-               /* leave NULL */;
-       }
-#undef CASE
-}
diff --git a/ir/ir/irvrfy_t.h b/ir/ir/irvrfy_t.h
deleted file mode 100644 (file)
index db91db3..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
- *
- * This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
- */
-
-/**
- * @file
- * @brief    New checker of irnodes for correctness.
- * @author   Michael Beck
- * @version  $Id$
- */
-#ifndef FIRM_IR_IRVRFY_T_H
-#define FIRM_IR_IRVRFY_T_H
-
-#include "irflag_t.h"
-#include "irvrfy.h"
-#include "irdump.h"
-
-#include "beutil.h"
-
-extern const char *firm_vrfy_failure_msg;
-
-#ifdef NDEBUG
-/*
- * in RELEASE mode, returns ret if the expression expr evaluates to zero
- * in ASSERT mode, asserts the expression expr (and the string string).
- */
-#define ASSERT_AND_RET(expr, string, ret)       do { if (!(expr)) return (ret); } while (0)
-
-/*
- * in RELEASE mode, returns ret if the expression expr evaluates to zero
- * in ASSERT mode, executes blk if the expression expr evaluates to zero and asserts expr
- */
-#define ASSERT_AND_RET_DBG(expr, string, ret, blk)     do { if (!(expr)) return (ret); } while (0)
-#else
-#define ASSERT_AND_RET(expr, string, ret) \
-do { \
-  if (opt_do_node_verification == FIRM_VERIFICATION_ON) {\
-    if (!(expr) && current_ir_graph != get_const_code_irg()) \
-      dump_ir_graph(current_ir_graph, "-assert"); \
-    assert((expr) && string); } \
-  if (!(expr)) { \
-    if (opt_do_node_verification == FIRM_VERIFICATION_REPORT) \
-      fprintf(stderr, #expr " : " string "\n"); \
-    firm_vrfy_failure_msg = #expr " && " string; \
-    return (ret); \
-  } \
-} while(0)
-
-#define ASSERT_AND_RET_DBG(expr, string, ret, blk) \
-do { \
-  if (!(expr)) { \
-    firm_vrfy_failure_msg = #expr " && " string; \
-    if (opt_do_node_verification != FIRM_VERIFICATION_ERROR_ONLY) { blk; } \
-    if (opt_do_node_verification == FIRM_VERIFICATION_REPORT) \
-      fprintf(stderr, #expr " : " string "\n"); \
-    else if (opt_do_node_verification == FIRM_VERIFICATION_ON) { \
-      if (!(expr) && current_ir_graph != get_const_code_irg()) \
-        dump_ir_graph(current_ir_graph, "-assert"); \
-      assert((expr) && string); \
-    } \
-    return (ret); \
-  } \
-} while(0)
-
-#endif
-
-/**
- * Set the default verify_node and verify_proj_node operation for an ir_op_ops.
- */
-void firm_set_default_verifyer(ir_opcode code, ir_op_ops *ops);
-
-#endif
index f496380..1ca8bfb 100644 (file)
@@ -37,7 +37,7 @@
 #include "irgmod.h"
 #include "irgopt.h"
 #include "trouts.h"
-#include "irvrfy.h"
+#include "irverify.h"
 #include "pmap.h"
 #include "array_t.h"
 #include "irpass_t.h"
@@ -149,7 +149,7 @@ unsigned lower_intrinsics(i_record *list, int length, int part_block_used)
                        set_trouts_inconsistent();
 
                        /* verify here */
-                       irg_verify(irg, VRFY_NORMAL);
+                       irg_verify(irg, VERIFY_NORMAL);
 
                        /* Optimize it, tuple might be created. */
                        optimize_graph_df(irg);
index 774e85f..a8c97e3 100644 (file)
@@ -34,7 +34,6 @@
 #include "irgwalk.h"
 #include "irgmod.h"
 #include "ircons.h"
-#include "irvrfy.h"
 #include "irpass_t.h"
 
 typedef struct walk_env {
index 35b68e1..cbd294f 100644 (file)
@@ -40,7 +40,7 @@
 #include "irgwalk.h"
 #include "irgmod.h"
 #include "irdump.h"
-#include "irvrfy.h"
+#include "irverify.h"
 #include "iredges.h"
 
 #include "array_t.h"
@@ -875,9 +875,9 @@ restart:
        /* the verifier doesn't work yet with floating nodes */
        if (get_irg_pinned(irg) == op_pin_state_pinned) {
                /* after optimize_cf(), only Bad data flow may remain. */
-               if (irg_vrfy_bads(irg, BAD_DF | BAD_BLOCK | TUPLE)) {
-                       dump_ir_graph(irg, "-vrfy-cf");
-                       fprintf(stderr, "VRFY_BAD in optimize_cf()\n");
+               if (irg_verify_bads(irg, BAD_DF | BAD_BLOCK | TUPLE)) {
+                       dump_ir_graph(irg, "-verify-cf");
+                       fprintf(stderr, "VERIFY_BAD in optimize_cf()\n");
                }
        }
 
index 83f479f..2aa2c42 100644 (file)
@@ -31,7 +31,6 @@
 #include "irgraph_t.h"
 #include "irgmod.h"
 #include "irgwalk.h"
-#include "irvrfy.h"
 #include "dbginfo_t.h"
 #include "irflag_t.h"
 #include "irloop_t.h"
index 6e4c1ba..fa6ac9e 100644 (file)
@@ -35,7 +35,6 @@
 #include "ircons_t.h"
 #include "irgmod.h"
 #include "irgwalk.h"
-#include "irvrfy.h"
 #include "tv_t.h"
 #include "dbginfo_t.h"
 #include "iropt_dbg.h"
diff --git a/ir/tr/trverify.c b/ir/tr/trverify.c
new file mode 100644 (file)
index 0000000..15b2e91
--- /dev/null
@@ -0,0 +1,469 @@
+/*
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/**
+ * @file    tr_inheritance.c
+ * @brief   Check types and entities for correctness.
+ * @date    29.1.2003
+ * @author  Michael Beck, Goetz Lindenmaier
+ * @version $Id$
+ */
+#include "config.h"
+
+#include "irgraph_t.h"
+#include "irflag_t.h"
+#include "irprintf.h"
+#include "irgwalk.h"
+#include "error.h"
+#include "tv.h"
+
+#ifdef NDEBUG
+/*
+ * in RELEASE mode, returns ret if the expression expr evaluates to zero
+ * in ASSERT mode, asserts the expression expr (and the string string).
+ */
+#define ASSERT_AND_RET(expr, string, ret)       if (!(expr)) return (ret)
+
+/*
+ * in RELEASE mode, returns ret if the expression expr evaluates to zero
+ * in ASSERT mode, executes blk if the expression expr evaluates to zero and asserts expr
+ */
+#define ASSERT_AND_RET_DBG(expr, string, ret, blk)      if (!(expr)) return (ret)
+#else
+#define ASSERT_AND_RET(expr, string, ret) \
+do { \
+  if (opt_do_node_verification == FIRM_VERIFICATION_ON) {\
+    assert((expr) && string); } \
+  if (!(expr)) { \
+    if (opt_do_node_verification == FIRM_VERIFICATION_REPORT) \
+      fprintf(stderr, #expr " : " string "\n"); \
+    firm_verify_failure_msg = #expr " && " string; \
+    return (ret); \
+  } \
+} while (0)
+
+#define ASSERT_AND_RET_DBG(expr, string, ret, blk) \
+do { \
+  if (!(expr)) { \
+    firm_verify_failure_msg = #expr " && " string; \
+    if (opt_do_node_verification != FIRM_VERIFICATION_ERROR_ONLY) { blk; } \
+    if (opt_do_node_verification == FIRM_VERIFICATION_REPORT) \
+      fprintf(stderr, #expr " : " string "\n"); \
+    else if (opt_do_node_verification == FIRM_VERIFICATION_ON) { \
+      assert((expr) && string); \
+    } \
+    return (ret); \
+  } \
+} while (0)
+
+#endif /* NDEBUG */
+
+#ifndef NDEBUG
+
+static const char *firm_verify_failure_msg;
+
+/**
+ * Show diagnostic if an entity overwrites another one not
+ * in direct superclasses.
+ */
+static void show_ent_not_supertp(ir_entity *ent, ir_entity *ovw)
+{
+       ir_type *owner = get_entity_owner(ent);
+       ir_type *ov_own = get_entity_owner(ovw);
+       int i;
+
+       fprintf(stderr, "Type verification error:\n");
+       ir_fprintf(stderr, "Entity %+F::%+e owerwrites ", owner, ent);
+       ir_fprintf(stderr, "Entity %+F::%+e\n", ov_own, ovw);
+
+       ir_fprintf(stderr, "Supertypes of %+F:\n", owner);
+       for (i = 0; i < get_class_n_supertypes(owner); ++i) {
+               ir_type *super = get_class_supertype(owner, i);
+               ir_fprintf(stderr, " %+F:\n", super);
+       }
+}
+
+/**
+ * Show diagnostic if an entity overwrites a wrong number of things.
+ */
+static void show_ent_overwrite_cnt(ir_entity *ent)
+{
+       ir_type *owner = get_entity_owner(ent);
+       int i, j, k, found, show_stp = 0;
+
+       fprintf(stderr, "Type verification error:\n");
+       ir_fprintf(stderr, "Entity %t::%e owerwrites\n", owner, ent);
+       for (i = 0; i < get_entity_n_overwrites(ent); ++i) {
+               ir_entity *ovw = get_entity_overwrites(ent, i);
+               ir_type *ov_own = get_entity_owner(ovw);
+
+               ir_fprintf(stderr, "  %t::%e\n", ov_own, ovw);
+               for (k = 0; k < i; ++k)
+                       if (ovw == get_entity_overwrites(ent, k)) {
+                               ir_fprintf(stderr, "  ->%t::%e entered more than once\n", ov_own, ovw);
+                               break;
+                       }
+
+               found = 0;
+               for (j = get_class_n_supertypes(owner) - 1; j >= 0; --j) {
+                       if (ov_own == get_class_supertype(owner, j)) {
+                               show_stp = found = 1;
+                               break;
+                       }
+               }
+               if (! found)
+                       ir_fprintf(stderr, "  ->%t not in super types of %t\n", ov_own, owner);
+       }
+
+       if (show_stp) {
+               ir_fprintf(stderr, "Supertypes of %t:\n", owner);
+               for (i = 0; i < get_class_n_supertypes(owner); ++i) {
+                       ir_type *super = get_class_supertype(owner, i);
+                       ir_fprintf(stderr, " %t:\n", super);
+               }
+       }
+}
+
+#endif /* #ifndef NDEBUG */
+
+/**
+ * Check a class
+ */
+static int check_class(ir_type *tp)
+{
+       int i, j, k;
+       int found;
+
+       for (i = get_class_n_members(tp) - 1; i >= 0; --i) {
+               ir_entity *mem = get_class_member(tp, i);
+
+               ASSERT_AND_RET_DBG(
+                       tp == get_entity_owner(mem),
+                       "class member with wrong owner",
+                       error_ent_wrong_owner,
+                       ir_fprintf(stderr, "Type verification error:\n%+F %+e(owner %+F)\n",tp, mem, get_entity_owner(mem))
+               );
+               ASSERT_AND_RET_DBG(
+                       mem,
+                       "NULL members not allowed",
+                       error_null_mem,
+                       ir_fprintf(stderr, "Type verification error:\n%+F member %d is NULL\n", tp, i)
+               );
+
+               ASSERT_AND_RET_DBG(
+                       get_entity_n_overwrites(mem) <= get_class_n_supertypes(tp),
+                       "wrong number of entity overwrites",
+                       error_wrong_ent_overwrites,
+                       show_ent_overwrite_cnt(mem)
+               );
+
+               for (j = get_entity_n_overwrites(mem) - 1; j >= 0; --j) {
+                       ir_entity *ovw = get_entity_overwrites(mem, j);
+                       /*printf(" overwrites: "); DDME(ovw);*/
+                       /* Check whether ovw is member of one of tp's supertypes. If so,
+                       the representation is correct. */
+                       found = 0;
+                       for (k = get_class_n_supertypes(tp) - 1; k >= 0; --k) {
+                               if (get_class_member_index(get_class_supertype(tp, k), ovw) >= 0) {
+                                       found = 1;
+                                       break;
+                               }
+                       }
+                       ASSERT_AND_RET_DBG(
+                               found,
+                               "overwrites an entity not contained in direct supertype",
+                               error_ent_not_cont,
+                               show_ent_not_supertp(mem, ovw)
+                       );
+               }
+       }
+       return 0;
+}
+
+/**
+ * Check an array.
+ */
+static int check_array(ir_type *tp)
+{
+       int i, n_dim = get_array_n_dimensions(tp);
+
+       for (i = 0; i < n_dim; ++i) {
+               ASSERT_AND_RET_DBG(
+                       has_array_lower_bound(tp, i) || has_array_upper_bound(tp, i),
+                       "array bound missing",
+                       1,
+                       ir_fprintf(stderr, "%+F in dimension %d\n", tp, i)
+               );
+       }
+       return 0;
+}
+
+
+/**
+ * Check a primitive.
+ */
+static int check_primitive(ir_type *tp)
+{
+       ASSERT_AND_RET_DBG(
+               is_mode(get_type_mode(tp)),
+               "Primitive type without mode",
+               1,
+               ir_fprintf(stderr, "%+F\n", tp)
+       );
+       return 0;
+}
+
+
+/*
+ * Checks a type.
+ *
+ * return
+ *  0   if no error encountered
+ */
+int check_type(ir_type *tp)
+{
+       switch (get_type_tpop_code(tp)) {
+       case tpo_class:
+               return check_class(tp);
+       case tpo_array:
+               return check_array(tp);
+       case tpo_primitive:
+               return check_primitive(tp);
+       default: break;
+       }
+       return 0;
+}
+
+/**
+ * checks the visited flag
+ */
+static int check_visited_flag(ir_graph *irg, ir_node *n)
+{
+       ASSERT_AND_RET_DBG(
+               get_irn_visited(n) <= get_irg_visited(irg),
+               "Visited flag of node is larger than that of corresponding irg.",
+               0,
+               ir_fprintf(stderr, "%+F in %+F\n", n, irg)
+       );
+       return 1;
+}
+
+/**
+ * helper environment struct for constant_on_wrong_obstack()
+ */
+struct myenv {
+       int res;
+       ir_graph *irg;
+};
+
+/**
+ * called by the walker
+ */
+static void on_irg_storage(ir_node *n, void *env)
+{
+       struct myenv *myenv = env;
+
+       /* We also test whether the setting of the visited flag is legal. */
+       myenv->res = node_is_in_irgs_storage(myenv->irg, n) &&
+                    check_visited_flag(myenv->irg, n);
+}
+
+/**
+ * checks whether a given constant IR node is NOT on the
+ * constant IR graph.
+ */
+static int constant_on_wrong_irg(ir_node *n)
+{
+       struct myenv env;
+
+       env.res = 1;  /* on right obstack */
+       env.irg = get_const_code_irg();
+
+       irg_walk(n, on_irg_storage, NULL, (void *)&env);
+       return ! env.res;
+}
+
+static int initializer_constant_on_wrong_irg(ir_initializer_t *initializer)
+{
+       switch (get_initializer_kind(initializer)) {
+       case IR_INITIALIZER_NULL:
+               return 0;
+       case IR_INITIALIZER_TARVAL:
+               return 0;
+       case IR_INITIALIZER_CONST:
+               return constant_on_wrong_irg(get_initializer_const_value(initializer));
+       case IR_INITIALIZER_COMPOUND: {
+               int n = get_initializer_compound_n_entries(initializer);
+               int i;
+               for (i = 0; i < n; ++i) {
+                       ir_initializer_t *sub
+                               = get_initializer_compound_value(initializer, i);
+                       if (initializer_constant_on_wrong_irg(sub))
+                               return 1;
+               }
+               return 0;
+       }
+       }
+       panic("invalid initializer in initializer_on_wrong_irg");
+}
+
+/**
+ * Check if constants node are NOT on the constant IR graph.
+ *
+ * @return NON-zero if an entity initializer constant is NOT on
+ * the current_ir_graph's obstack.
+ */
+static int constants_on_wrong_irg(ir_entity *ent)
+{
+       if (ent->initializer != NULL) {
+               return initializer_constant_on_wrong_irg(ent->initializer);
+       } else if (entity_has_compound_ent_values(ent)) {
+               int i;
+               for (i = get_compound_ent_n_values(ent) - 1; i >= 0; --i) {
+                       if (constant_on_wrong_irg(get_compound_ent_value(ent, i)))
+                               return 1;
+               }
+       }
+       return 0;
+}
+
+/*
+ * Check an entity. Currently, we check only if initialized constants
+ * are build on the const irg graph.
+ *
+ * @return
+ *  0   if no error encountered
+ *  != 0    a trverify_error_codes code
+ */
+int check_entity(ir_entity *ent)
+{
+       ir_type *tp = get_entity_type(ent);
+
+       current_ir_graph =  get_const_code_irg();
+       ASSERT_AND_RET_DBG(
+               constants_on_wrong_irg(ent) == 0,
+               "Contants placed on wrong IRG",
+               error_const_on_wrong_irg,
+               ir_fprintf(stderr, "%+e not on %+F\n", ent, current_ir_graph)
+       );
+
+       /* Originally, this test assumed, that only method entities have
+          pecularity_inherited.  As I changed this, I have to test for method type
+          before doing the test. */
+       if (get_entity_peculiarity(ent) == peculiarity_existent
+           && is_method_entity(ent)) {
+
+               ir_entity *impl = get_SymConst_entity(get_atomic_ent_value(ent));
+               ASSERT_AND_RET_DBG(
+                       impl != NULL,
+                       "inherited method entities must have constant pointing to existent entity.",
+                       error_inherited_ent_without_const,
+                       ir_fprintf(stderr, "%+e points to %+e\n", ent, impl)
+               );
+       }
+
+       if (is_atomic_entity(ent) && ent->initializer != NULL) {
+               ir_mode *mode = NULL;
+               ir_initializer_t *initializer = ent->initializer;
+               switch (initializer->kind) {
+               case IR_INITIALIZER_CONST:
+                       mode = get_irn_mode(get_initializer_const_value(initializer));
+                       break;
+               case IR_INITIALIZER_TARVAL:
+                       mode = get_tarval_mode(get_initializer_tarval_value(initializer));
+                       break;
+               case IR_INITIALIZER_NULL:
+               case IR_INITIALIZER_COMPOUND:
+                       break;
+               }
+               ASSERT_AND_RET_DBG(
+                       mode == NULL || mode == get_type_mode(tp),
+                       "Mode of constant in entity must match type.",
+                       error_ent_const_mode,
+                       ir_fprintf(stderr, "%+e, type %+F(%+F)\n",
+                       ent, tp, get_type_mode(tp))
+               );
+       }
+       return no_error;
+}
+
+/*
+ * check types and entities
+ */
+static void check_tore(type_or_ent tore, void *env)
+{
+       int *res = env;
+       assert(tore.ent);
+       if (is_type(tore.typ)) {
+               *res = check_type(tore.typ);
+       } else {
+               assert(is_entity(tore.ent));
+               *res = check_entity(tore.ent);
+       }
+}
+
+/*
+ * Verify types and entities.
+ */
+int tr_verify(void)
+{
+       int      res = no_error;
+       ir_type *constructors;
+       ir_type *destructors;
+       ir_type *thread_locals;
+       int      i;
+       static ident *empty = NULL;
+
+       if (empty == NULL)
+               empty = new_id_from_chars("", 0);
+
+       type_walk(check_tore, NULL, &res);
+
+       constructors = get_segment_type(IR_SEGMENT_CONSTRUCTORS);
+       for (i = get_compound_n_members(constructors)-1; i >= 0; --i) {
+               const ir_entity *entity = get_compound_member(constructors, i);
+               ASSERT_AND_RET(get_entity_linkage(entity) & IR_LINKAGE_HIDDEN_USER,
+                              "entity without LINKAGE_HIDDEN_USER in constructors is pointless",
+                              1);
+               /* Mach-O doesn't like labels in this section */
+               ASSERT_AND_RET(get_entity_ld_ident(entity),
+                              "entity in constructors should have ld_ident=''", 1);
+       }
+       destructors = get_segment_type(IR_SEGMENT_DESTRUCTORS);
+       for (i = get_compound_n_members(destructors)-1; i >= 0; --i) {
+               const ir_entity *entity = get_compound_member(destructors, i);
+               ASSERT_AND_RET(get_entity_linkage(entity) & IR_LINKAGE_HIDDEN_USER,
+                              "entity without LINKAGE_HIDDEN_USER in destructors is pointless",
+                              1);
+               /* Mach-O doesn't like labels in this section */
+               ASSERT_AND_RET(get_entity_ld_ident(entity),
+                              "entity in destructors should have ld_ident=''", 1);
+       }
+       thread_locals = get_segment_type(IR_SEGMENT_THREAD_LOCAL);
+       for (i = get_compound_n_members(thread_locals)-1; i >= 0; --i) {
+               const ir_entity *entity = get_compound_member(thread_locals, i);
+               /* this is odd and should not be allowed I think */
+               ASSERT_AND_RET(!is_method_entity(entity),
+                              "method in THREAD_LOCAL segment", 1);
+               ASSERT_AND_RET(! (get_entity_linkage(entity) & IR_LINKAGE_CONSTANT),
+                              "thread locals must not be constant", 1);
+       }
+
+       return res;
+}
diff --git a/ir/tr/trvrfy.c b/ir/tr/trvrfy.c
deleted file mode 100644 (file)
index 49e8fea..0000000
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
- *
- * This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
- */
-
-/**
- * @file    tr_inheritance.c
- * @brief   Check types and entities for correctness.
- * @date    29.1.2003
- * @author  Michael Beck, Goetz Lindenmaier
- * @version $Id$
- */
-#include "config.h"
-
-#include "irgraph_t.h"
-#include "irflag_t.h"
-#include "irprintf.h"
-#include "irgwalk.h"
-#include "error.h"
-#include "tv.h"
-
-#ifdef NDEBUG
-/*
- * in RELEASE mode, returns ret if the expression expr evaluates to zero
- * in ASSERT mode, asserts the expression expr (and the string string).
- */
-#define ASSERT_AND_RET(expr, string, ret)       if (!(expr)) return (ret)
-
-/*
- * in RELEASE mode, returns ret if the expression expr evaluates to zero
- * in ASSERT mode, executes blk if the expression expr evaluates to zero and asserts expr
- */
-#define ASSERT_AND_RET_DBG(expr, string, ret, blk)      if (!(expr)) return (ret)
-#else
-#define ASSERT_AND_RET(expr, string, ret) \
-do { \
-  if (opt_do_node_verification == FIRM_VERIFICATION_ON) {\
-    assert((expr) && string); } \
-  if (!(expr)) { \
-    if (opt_do_node_verification == FIRM_VERIFICATION_REPORT) \
-      fprintf(stderr, #expr " : " string "\n"); \
-    firm_vrfy_failure_msg = #expr " && " string; \
-    return (ret); \
-  } \
-} while (0)
-
-#define ASSERT_AND_RET_DBG(expr, string, ret, blk) \
-do { \
-  if (!(expr)) { \
-    firm_vrfy_failure_msg = #expr " && " string; \
-    if (opt_do_node_verification != FIRM_VERIFICATION_ERROR_ONLY) { blk; } \
-    if (opt_do_node_verification == FIRM_VERIFICATION_REPORT) \
-      fprintf(stderr, #expr " : " string "\n"); \
-    else if (opt_do_node_verification == FIRM_VERIFICATION_ON) { \
-      assert((expr) && string); \
-    } \
-    return (ret); \
-  } \
-} while (0)
-
-#endif /* NDEBUG */
-
-#ifndef NDEBUG
-
-static const char *firm_vrfy_failure_msg;
-
-/**
- * Show diagnostic if an entity overwrites another one not
- * in direct superclasses.
- */
-static void show_ent_not_supertp(ir_entity *ent, ir_entity *ovw)
-{
-       ir_type *owner = get_entity_owner(ent);
-       ir_type *ov_own = get_entity_owner(ovw);
-       int i;
-
-       fprintf(stderr, "Type verification error:\n");
-       ir_fprintf(stderr, "Entity %+F::%+e owerwrites ", owner, ent);
-       ir_fprintf(stderr, "Entity %+F::%+e\n", ov_own, ovw);
-
-       ir_fprintf(stderr, "Supertypes of %+F:\n", owner);
-       for (i = 0; i < get_class_n_supertypes(owner); ++i) {
-               ir_type *super = get_class_supertype(owner, i);
-               ir_fprintf(stderr, " %+F:\n", super);
-       }
-}
-
-/**
- * Show diagnostic if an entity overwrites a wrong number of things.
- */
-static void show_ent_overwrite_cnt(ir_entity *ent)
-{
-       ir_type *owner = get_entity_owner(ent);
-       int i, j, k, found, show_stp = 0;
-
-       fprintf(stderr, "Type verification error:\n");
-       ir_fprintf(stderr, "Entity %t::%e owerwrites\n", owner, ent);
-       for (i = 0; i < get_entity_n_overwrites(ent); ++i) {
-               ir_entity *ovw = get_entity_overwrites(ent, i);
-               ir_type *ov_own = get_entity_owner(ovw);
-
-               ir_fprintf(stderr, "  %t::%e\n", ov_own, ovw);
-               for (k = 0; k < i; ++k)
-                       if (ovw == get_entity_overwrites(ent, k)) {
-                               ir_fprintf(stderr, "  ->%t::%e entered more than once\n", ov_own, ovw);
-                               break;
-                       }
-
-               found = 0;
-               for (j = get_class_n_supertypes(owner) - 1; j >= 0; --j) {
-                       if (ov_own == get_class_supertype(owner, j)) {
-                               show_stp = found = 1;
-                               break;
-                       }
-               }
-               if (! found)
-                       ir_fprintf(stderr, "  ->%t not in super types of %t\n", ov_own, owner);
-       }
-
-       if (show_stp) {
-               ir_fprintf(stderr, "Supertypes of %t:\n", owner);
-               for (i = 0; i < get_class_n_supertypes(owner); ++i) {
-                       ir_type *super = get_class_supertype(owner, i);
-                       ir_fprintf(stderr, " %t:\n", super);
-               }
-       }
-}
-
-#endif /* #ifndef NDEBUG */
-
-/**
- * Check a class
- */
-static int check_class(ir_type *tp)
-{
-       int i, j, k;
-       int found;
-
-       for (i = get_class_n_members(tp) - 1; i >= 0; --i) {
-               ir_entity *mem = get_class_member(tp, i);
-
-               ASSERT_AND_RET_DBG(
-                       tp == get_entity_owner(mem),
-                       "class member with wrong owner",
-                       error_ent_wrong_owner,
-                       ir_fprintf(stderr, "Type verification error:\n%+F %+e(owner %+F)\n",tp, mem, get_entity_owner(mem))
-               );
-               ASSERT_AND_RET_DBG(
-                       mem,
-                       "NULL members not allowed",
-                       error_null_mem,
-                       ir_fprintf(stderr, "Type verification error:\n%+F member %d is NULL\n", tp, i)
-               );
-
-               ASSERT_AND_RET_DBG(
-                       get_entity_n_overwrites(mem) <= get_class_n_supertypes(tp),
-                       "wrong number of entity overwrites",
-                       error_wrong_ent_overwrites,
-                       show_ent_overwrite_cnt(mem)
-               );
-
-               for (j = get_entity_n_overwrites(mem) - 1; j >= 0; --j) {
-                       ir_entity *ovw = get_entity_overwrites(mem, j);
-                       /*printf(" overwrites: "); DDME(ovw);*/
-                       /* Check whether ovw is member of one of tp's supertypes. If so,
-                       the representation is correct. */
-                       found = 0;
-                       for (k = get_class_n_supertypes(tp) - 1; k >= 0; --k) {
-                               if (get_class_member_index(get_class_supertype(tp, k), ovw) >= 0) {
-                                       found = 1;
-                                       break;
-                               }
-                       }
-                       ASSERT_AND_RET_DBG(
-                               found,
-                               "overwrites an entity not contained in direct supertype",
-                               error_ent_not_cont,
-                               show_ent_not_supertp(mem, ovw)
-                       );
-               }
-       }
-       return 0;
-}
-
-/**
- * Check an array.
- */
-static int check_array(ir_type *tp)
-{
-       int i, n_dim = get_array_n_dimensions(tp);
-
-       for (i = 0; i < n_dim; ++i) {
-               ASSERT_AND_RET_DBG(
-                       has_array_lower_bound(tp, i) || has_array_upper_bound(tp, i),
-                       "array bound missing",
-                       1,
-                       ir_fprintf(stderr, "%+F in dimension %d\n", tp, i)
-               );
-       }
-       return 0;
-}
-
-
-/**
- * Check a primitive.
- */
-static int check_primitive(ir_type *tp)
-{
-       ASSERT_AND_RET_DBG(
-               is_mode(get_type_mode(tp)),
-               "Primitive type without mode",
-               1,
-               ir_fprintf(stderr, "%+F\n", tp)
-       );
-       return 0;
-}
-
-
-/*
- * Checks a type.
- *
- * return
- *  0   if no error encountered
- */
-int check_type(ir_type *tp)
-{
-       switch (get_type_tpop_code(tp)) {
-       case tpo_class:
-               return check_class(tp);
-       case tpo_array:
-               return check_array(tp);
-       case tpo_primitive:
-               return check_primitive(tp);
-       default: break;
-       }
-       return 0;
-}
-
-/**
- * checks the visited flag
- */
-static int check_visited_flag(ir_graph *irg, ir_node *n)
-{
-       ASSERT_AND_RET_DBG(
-               get_irn_visited(n) <= get_irg_visited(irg),
-               "Visited flag of node is larger than that of corresponding irg.",
-               0,
-               ir_fprintf(stderr, "%+F in %+F\n", n, irg)
-       );
-       return 1;
-}
-
-/**
- * helper environment struct for constant_on_wrong_obstack()
- */
-struct myenv {
-       int res;
-       ir_graph *irg;
-};
-
-/**
- * called by the walker
- */
-static void on_irg_storage(ir_node *n, void *env)
-{
-       struct myenv *myenv = env;
-
-       /* We also test whether the setting of the visited flag is legal. */
-       myenv->res = node_is_in_irgs_storage(myenv->irg, n) &&
-                    check_visited_flag(myenv->irg, n);
-}
-
-/**
- * checks whether a given constant IR node is NOT on the
- * constant IR graph.
- */
-static int constant_on_wrong_irg(ir_node *n)
-{
-       struct myenv env;
-
-       env.res = 1;  /* on right obstack */
-       env.irg = get_const_code_irg();
-
-       irg_walk(n, on_irg_storage, NULL, (void *)&env);
-       return ! env.res;
-}
-
-static int initializer_constant_on_wrong_irg(ir_initializer_t *initializer)
-{
-       switch (get_initializer_kind(initializer)) {
-       case IR_INITIALIZER_NULL:
-               return 0;
-       case IR_INITIALIZER_TARVAL:
-               return 0;
-       case IR_INITIALIZER_CONST:
-               return constant_on_wrong_irg(get_initializer_const_value(initializer));
-       case IR_INITIALIZER_COMPOUND: {
-               int n = get_initializer_compound_n_entries(initializer);
-               int i;
-               for (i = 0; i < n; ++i) {
-                       ir_initializer_t *sub
-                               = get_initializer_compound_value(initializer, i);
-                       if (initializer_constant_on_wrong_irg(sub))
-                               return 1;
-               }
-               return 0;
-       }
-       }
-       panic("invalid initializer in initializer_on_wrong_irg");
-}
-
-/**
- * Check if constants node are NOT on the constant IR graph.
- *
- * @return NON-zero if an entity initializer constant is NOT on
- * the current_ir_graph's obstack.
- */
-static int constants_on_wrong_irg(ir_entity *ent)
-{
-       if (ent->initializer != NULL) {
-               return initializer_constant_on_wrong_irg(ent->initializer);
-       } else if (entity_has_compound_ent_values(ent)) {
-               int i;
-               for (i = get_compound_ent_n_values(ent) - 1; i >= 0; --i) {
-                       if (constant_on_wrong_irg(get_compound_ent_value(ent, i)))
-                               return 1;
-               }
-       }
-       return 0;
-}
-
-/*
- * Check an entity. Currently, we check only if initialized constants
- * are build on the const irg graph.
- *
- * @return
- *  0   if no error encountered
- *  != 0    a trvrfy_error_codes code
- */
-int check_entity(ir_entity *ent)
-{
-       ir_type *tp = get_entity_type(ent);
-
-       current_ir_graph =  get_const_code_irg();
-       ASSERT_AND_RET_DBG(
-               constants_on_wrong_irg(ent) == 0,
-               "Contants placed on wrong IRG",
-               error_const_on_wrong_irg,
-               ir_fprintf(stderr, "%+e not on %+F\n", ent, current_ir_graph)
-       );
-
-       /* Originally, this test assumed, that only method entities have
-          pecularity_inherited.  As I changed this, I have to test for method type
-          before doing the test. */
-       if (get_entity_peculiarity(ent) == peculiarity_existent
-           && is_method_entity(ent)) {
-
-               ir_entity *impl = get_SymConst_entity(get_atomic_ent_value(ent));
-               ASSERT_AND_RET_DBG(
-                       impl != NULL,
-                       "inherited method entities must have constant pointing to existent entity.",
-                       error_inherited_ent_without_const,
-                       ir_fprintf(stderr, "%+e points to %+e\n", ent, impl)
-               );
-       }
-
-       if (is_atomic_entity(ent) && ent->initializer != NULL) {
-               ir_mode *mode = NULL;
-               ir_initializer_t *initializer = ent->initializer;
-               switch (initializer->kind) {
-               case IR_INITIALIZER_CONST:
-                       mode = get_irn_mode(get_initializer_const_value(initializer));
-                       break;
-               case IR_INITIALIZER_TARVAL:
-                       mode = get_tarval_mode(get_initializer_tarval_value(initializer));
-                       break;
-               case IR_INITIALIZER_NULL:
-               case IR_INITIALIZER_COMPOUND:
-                       break;
-               }
-               ASSERT_AND_RET_DBG(
-                       mode == NULL || mode == get_type_mode(tp),
-                       "Mode of constant in entity must match type.",
-                       error_ent_const_mode,
-                       ir_fprintf(stderr, "%+e, type %+F(%+F)\n",
-                       ent, tp, get_type_mode(tp))
-               );
-       }
-       return no_error;
-}
-
-/*
- * check types and entities
- */
-static void check_tore(type_or_ent tore, void *env)
-{
-       int *res = env;
-       assert(tore.ent);
-       if (is_type(tore.typ)) {
-               *res = check_type(tore.typ);
-       } else {
-               assert(is_entity(tore.ent));
-               *res = check_entity(tore.ent);
-       }
-}
-
-/*
- * Verify types and entities.
- */
-int tr_vrfy(void)
-{
-       int      res = no_error;
-       ir_type *constructors;
-       ir_type *destructors;
-       ir_type *thread_locals;
-       int      i;
-       static ident *empty = NULL;
-
-       if (empty == NULL)
-               empty = new_id_from_chars("", 0);
-
-       type_walk(check_tore, NULL, &res);
-
-       constructors = get_segment_type(IR_SEGMENT_CONSTRUCTORS);
-       for (i = get_compound_n_members(constructors)-1; i >= 0; --i) {
-               const ir_entity *entity = get_compound_member(constructors, i);
-               ASSERT_AND_RET(get_entity_linkage(entity) & IR_LINKAGE_HIDDEN_USER,
-                              "entity without LINKAGE_HIDDEN_USER in constructors is pointless",
-                              1);
-               /* Mach-O doesn't like labels in this section */
-               ASSERT_AND_RET(get_entity_ld_ident(entity),
-                              "entity in constructors should have ld_ident=''", 1);
-       }
-       destructors = get_segment_type(IR_SEGMENT_DESTRUCTORS);
-       for (i = get_compound_n_members(destructors)-1; i >= 0; --i) {
-               const ir_entity *entity = get_compound_member(destructors, i);
-               ASSERT_AND_RET(get_entity_linkage(entity) & IR_LINKAGE_HIDDEN_USER,
-                              "entity without LINKAGE_HIDDEN_USER in destructors is pointless",
-                              1);
-               /* Mach-O doesn't like labels in this section */
-               ASSERT_AND_RET(get_entity_ld_ident(entity),
-                              "entity in destructors should have ld_ident=''", 1);
-       }
-       thread_locals = get_segment_type(IR_SEGMENT_THREAD_LOCAL);
-       for (i = get_compound_n_members(thread_locals)-1; i >= 0; --i) {
-               const ir_entity *entity = get_compound_member(thread_locals, i);
-               /* this is odd and should not be allowed I think */
-               ASSERT_AND_RET(!is_method_entity(entity),
-                              "method in THREAD_LOCAL segment", 1);
-               ASSERT_AND_RET(! (get_entity_linkage(entity) & IR_LINKAGE_CONSTANT),
-                              "thread locals must not be constant", 1);
-       }
-
-       return res;
-}
index ab8e304..3d06eac 100755 (executable)
@@ -311,7 +311,7 @@ ir_node *new_rd_{{node.constrname}}(
        {%- if node.optimize != False %}
        res = optimize_node(res);
        {%- endif %}
-       IRN_VRFY_IRG(res, irg);
+       IRN_VERIFY_IRG(res, irg);
        current_ir_graph = rem;
        return res;
 }