make code a bit more readble
[libfirm] / ir / be / belive.c
index 753a510..948bde7 100644 (file)
@@ -12,6 +12,7 @@
 #include "irgwalk.h"
 #include "irprintf_t.h"
 #include "irbitset.h"
+#include "irdump_t.h"
 
 #include "beutil.h"
 #include "belive_t.h"
@@ -118,7 +119,7 @@ static INLINE unsigned _be_liveness_bsearch(struct _be_lv_info_t *arr, unsigned
 #else
 
 /**
- * This function searches linearily for the node in the array.
+ * This function searches linearly for the node in the array.
  */
 static INLINE unsigned _be_liveness_bsearch(struct _be_lv_info_t *arr, unsigned idx) {
        unsigned n  = arr[0].u.head.n_members;
@@ -637,6 +638,8 @@ void be_liveness_dumpto(const be_lv_t *lv, const char *cls_name)
  */
 static void dom_check(ir_node *irn, void *data)
 {
+       int *problem_found = data;
+
        if(!is_Block(irn) && irn != get_irg_end(get_irn_irg(irn))) {
                int i, n;
                ir_node *bl = get_nodes_block(irn);
@@ -649,27 +652,34 @@ static void dom_check(ir_node *irn, void *data)
                        if(is_Phi(irn))
                                use_bl = get_Block_cfgpred_block(bl, i);
 
-                       if(!block_dominates(def_bl, use_bl)) {
-                               ir_fprintf(stderr, "%+F in %+F must dominate %+F for user %+F\n", op, def_bl, use_bl, irn);
-                               assert(0);
+                       if(get_irn_opcode(use_bl) != iro_Bad
+                            && get_irn_opcode(def_bl) != iro_Bad
+                            && !block_dominates(def_bl, use_bl)) {
+                               ir_fprintf(stderr, "Verify warning: %+F in %+F must dominate %+F for user %+F (%s)\n", op, def_bl, use_bl, irn, get_irg_dump_name(get_irn_irg(op)));
+                               *problem_found = 1;
                        }
                }
        }
 }
 
 /* Check, if the SSA dominance property is fulfilled. */
-void be_check_dominance(ir_graph *irg)
+int be_check_dominance(ir_graph *irg)
 {
-       irg_walk_graph(irg, dom_check, NULL, NULL);
+       int problem_found = 0;
+
+       assure_doms(irg);
+       irg_walk_graph(irg, dom_check, NULL, &problem_found);
+
+       return !problem_found;
 }
 
 pset *be_liveness_transfer(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *irn, pset *live)
 {
        int i, n;
-       ir_node *x;
        FIRM_DBG_REGISTER(firm_dbg_module_t *dbg, DBG_MODULE);
 
        DEBUG_ONLY(
+               const ir_node *x;
                DBG((dbg, LEVEL_1, "%+F\n", irn));
                for(x = pset_first(live); x; x = pset_next(live))
                        DBG((dbg, LEVEL_1, "\tlive: %+F\n", x));