- i = 0;
- foreach_out_edge(irn, edge) {
- reg_pair_t *const pair = &pairs[i++];
- ir_node *const out = get_edge_src_irn(edge);
- long const pn = get_Proj_proj(out);
- ir_node *const in = get_irn_n(irn, pn);
+ n = 0;
+ foreach_out_edge_safe(irn, edge, next) {
+ ir_node *const out = get_edge_src_irn(edge);
+ long const pn = get_Proj_proj(out);
+ ir_node *const in = get_irn_n(irn, pn);
+ arch_register_t const *const in_reg = arch_get_irn_register(in);
+ arch_register_t const *const out_reg = arch_get_irn_register(out);
+ reg_pair_t * pair;
+
+ if (in_reg == out_reg) {
+ DBG((dbg, LEVEL_1, "%+F removing equal perm register pair (%+F, %+F, %s)\n",
+ irn, in, out, out_reg->name));
+ exchange(out, in);
+ continue;
+ }