+
+ /* phis should be NOPs at this point, which means all input regs
+ * must be the same as the output reg */
+ if (is_Phi(node)) {
+ int i, arity;
+
+ reg = arch_get_irn_register(arch_env, node);
+
+ arity = get_irn_arity(node);
+ for (i = 0; i < arity; ++i) {
+ ir_node *pred = get_Phi_pred(node, i);
+ const arch_register_t *pred_reg = arch_get_irn_register(arch_env, pred);
+
+ if (reg != pred_reg && !arch_register_type_is(pred_reg, joker)) {
+ ir_fprintf(stderr, "Verify warning: Input %d of %+F in block %+F(%s) uses register %s instead of %s\n",
+ i, node, get_nodes_block(node), get_irg_dump_name(irg), pred_reg->name, reg->name);
+ problem_found = 1;
+ }
+ }
+ }
+}
+
+static void value_used(ir_node *node) {
+ const arch_register_t *reg;
+ ir_node *reg_node;
+
+ if (arch_get_irn_reg_class(arch_env, node, -1) != regclass)
+ return;
+
+ reg = arch_get_irn_register(arch_env, node);
+ if (reg->type & arch_register_type_virtual)
+ return;
+
+ reg_node = registers[reg->index];
+ if (reg_node != NULL && reg_node != node) {
+ ir_fprintf(stderr, "Verify warning: Register %s assigned more than once in block %+F(%s) (nodes %+F %+F)\n",
+ reg->name, get_nodes_block(node), get_irg_dump_name(irg),
+ node, reg_node);
+ problem_found = 1;
+ }
+
+ registers[reg->index] = node;
+}
+
+static void value_def(ir_node *node)
+{
+ const arch_register_t *reg;
+ ir_node *reg_node;
+
+ if (arch_get_irn_reg_class(arch_env, node, -1) != regclass)
+ return;
+
+ reg = arch_get_irn_register(arch_env, node);
+ if (reg->type & arch_register_type_virtual)
+ return;
+
+ reg_node = registers[reg->index];
+
+ if (reg_node != node) {
+ ir_fprintf(stderr, "Verify warning: Node %+F not registered as value for Register %s (but %+F) in block %+F(%s)\n",
+ node, reg->name, reg_node, get_nodes_block(node), get_irg_dump_name(irg));
+ problem_found = 1;
+ }
+ registers[reg->index] = NULL;