-int is_optimizable_arg(const copy_opt_t *co, ir_node *irn) {
- int i, max;
- for(i=0, max=get_irn_n_outs(irn); i<max; ++i) {
- ir_node *n = get_irn_out(irn, i);
- if (((is_Phi(n) && is_firm_be_mode(get_irn_mode(n))) ||
- is_Perm(get_arch_env(co), n)) && (irn == n || !nodes_interfere(co->chordal_env, irn, n)))
- return 1;
+int co_is_optimizable_arg(const copy_opt_t *co, ir_node *irn) {
+ const ir_edge_t *edge;
+
+ if (arch_irn_is_ignore(co->aenv, irn))
+ return 0;
+
+ foreach_out_edge(irn, edge) {
+ ir_node *n = edge->src;
+
+ if (!nodes_interfere(co->cenv, irn, n) || irn == n) {
+ arch_register_req_t req;
+ arch_get_register_req(co->aenv, &req, n, -1);
+
+ if(is_Reg_Phi(n) ||
+ is_Perm(co->aenv, n) ||
+ (arch_register_req_is(&req, should_be_same) && req.other_same == irn)
+ )
+ return 1;
+ }