copy_opt_t *co = env;
unit_t *unit;
arch_register_req_t req;
+ arch_env_t *aenv = co->chordal_env->main_env->arch_env;
if (!is_curr_reg_class(irn))
return;
/* Src == Tgt of a 2-addr-code instruction */
if (is_2addr_code(get_arch_env(co), irn, &req)) {
- int pos = req.data.pos;
- ir_node *other = get_irn_n(irn, pos);
+ ir_node *other = req.other_same;
if (!nodes_interfere(co->chordal_env, irn, other)) {
unit->nodes = xmalloc(2 * sizeof(*unit->nodes));
unit->costs = xmalloc(2 * sizeof(*unit->costs));
unit->node_count = 2;
unit->nodes[0] = irn;
unit->nodes[1] = other;
- unit->costs[1] = co->get_costs(irn, other, pos);
+ unit->costs[1] = co->get_costs(irn, other, -120480);
}
} else
assert(0 && "This is not an optimizable node!");
}
int is_optimizable_arg(const copy_opt_t *co, ir_node *irn) {
- arch_env_t *aenv = co->chordal_env->main_env->arch_env;
+ arch_env_t *aenv = get_arch_env(co);
const ir_edge_t *edge;
+ if (arch_irn_is_ignore(aenv, irn))
+ return 0;
+
foreach_out_edge(irn, edge) {
ir_node *n = edge->src;
- arch_register_req_t req;
- arch_get_register_req(aenv, &req, n, -1);
+ if (!nodes_interfere(co->chordal_env, irn, n) || irn == n) {
+ arch_register_req_t req;
+ arch_get_register_req(aenv, &req, n, -1);
- if( ( (req.type == arch_register_req_type_should_be_same && get_irn_n(n, req.data.pos) == irn) ||
- is_Reg_Phi(n) ||
- is_Perm(get_arch_env(co), n)
- ) && (irn == n || !nodes_interfere(co->chordal_env, irn, n)))
+ if(is_Reg_Phi(n) ||
+ is_Perm(aenv, n) ||
+ (arch_register_req_is(&req, should_be_same) && req.other_same == irn)
+ )
return 1;
+ }
}
return 0;