- if (fail) {
- ir_fprintf(stderr, "Verify warning: Register %s assigned more than once in block %+F(%s)\n",
- reg->name, get_nodes_block(node), get_irg_dump_name(env->irg));
- env->problem_found = 1;
-
- foreach_pset(nodes, node) {
- if (arch_get_irn_register(arch_env, node) == reg) {
- ir_fprintf(stderr, " at node %+F\n", node);
+ /* phis should be NOPs at this point, which means all input regs
+ * must be the same as the output reg */
+ if (is_Phi(node)) {
+ reg = arch_get_irn_register(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(pred);
+
+ if (reg != pred_reg && !(pred_reg->type & arch_register_type_joker)) {
+ const char *pred_name = pred_reg != NULL ? pred_reg->name : "(null)";
+ const char *reg_name = reg != NULL ? reg->name : "(null)";
+ 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_name, reg_name);
+ problem_found = 1;