some more debug output if no definition for a value is found on a path
[libfirm] / ir / be / beverify.c
index d418c9b..a2195b1 100644 (file)
@@ -600,7 +600,7 @@ static void check_register_allocation(be_verify_register_allocation_env_t *env,
                                       const arch_register_class_t *regclass, pset *nodes) {
        const arch_env_t *arch_env = env->arch_env;
        ir_node *node;
-       const arch_register_t *reg;
+       const arch_register_t *reg = NULL;
        int fail = 0;
 
        bitset_t *registers = bitset_alloca(arch_register_class_n_regs(regclass));
@@ -616,6 +616,11 @@ static void check_register_allocation(be_verify_register_allocation_env_t *env,
                        env->problem_found = 1;
                        continue;
                }
+               if(!arch_reg_is_allocatable(arch_env, node, -1, reg)) {
+                       ir_fprintf(stderr, "Verify warning: Register %s assigned to %+F not allowed (register constraint) in block %+F(%s)\n",
+                                  reg->name, node, get_nodes_block(node), get_irg_dump_name(env->irg));
+                       env->problem_found = 1;
+               }
                if(bitset_is_set(registers, reg->index)) {
                        pset_break(nodes);
                        fail = 1;
@@ -677,3 +682,55 @@ int be_verify_register_allocation(const arch_env_t *arch_env, ir_graph *irg) {
 
        return !env.problem_found;
 }
+
+
+
+//---------------------------------------------------------------------------
+
+
+
+typedef struct _verify_out_dead_nodes_env {
+       ir_graph *irg;
+       bitset_t *reachable;
+       bitset_t *visited;
+       int problem_found;
+} verify_out_dead_nodes_env;
+
+static void check_out_edges(ir_node *node, verify_out_dead_nodes_env *env) {
+       const ir_edge_t* edge;
+
+       foreach_out_edge(node, edge) {
+               ir_node* src = get_edge_src_irn(edge);
+
+               if(!bitset_is_set(env->reachable, get_irn_idx(src))) {
+                       ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) only reachable through out edges from %+F\n",
+                                  src, get_nodes_block(src), get_irg_dump_name(env->irg), node);
+                       env->problem_found = 1;
+               }
+
+               if(!bitset_is_set(env->visited, get_irn_idx(src))) {
+                       bitset_set(env->visited, get_irn_idx(src));
+                       if(!is_Block(src))
+                               check_out_edges(src, env);
+               }
+       }
+}
+
+static void set_reachable(ir_node *node, void* data)
+{
+       bitset_t* reachable = data;
+       bitset_set(reachable, get_irn_idx(node));
+}
+
+int be_verify_out_edges(ir_graph *irg) {
+       verify_out_dead_nodes_env env;
+       env.irg = irg;
+       env.reachable = bitset_alloca(get_irg_last_idx(irg));
+       env.visited = bitset_alloca(get_irg_last_idx(irg));
+       env.problem_found = 0;
+
+       irg_walk_graph(irg, set_reachable, NULL, env.reachable);
+       check_out_edges(get_irg_start(irg), &env);
+
+       return !env.problem_found;
+}