+ if (is_Reg_Phi(irn) || is_Perm_Proj(co->aenv, irn) || is_2addr_code(co->aenv, irn, &req))
+ return 1;
+
+ return 0;
+}
+
+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;
+ }
+ }
+
+ return 0;
+}
+
+int co_get_costs_loop_depth(ir_node *root, ir_node* arg, int pos) {
+ int cost = 0;
+ ir_loop *loop;
+ ir_node *root_block = get_nodes_block(root);
+
+ if (is_Phi(root)) {
+ /* for phis the copies are placed in the corresponding pred-block */
+ loop = get_irn_loop(get_Block_cfgpred_block(root_block, pos));
+ } else {
+ /* a perm places the copy in the same block as it resides */
+ loop = get_irn_loop(root_block);
+ }
+ if (loop) {
+ int d = get_loop_depth(loop);
+ cost = d*d;
+ }
+ return cost+1;
+}
+
+int co_get_costs_all_one(ir_node *root, ir_node* arg, int pos) {
+ return 1;
+}
+
+/******************************************************************************
+ ____ _ _ _ _ _ _____ _
+ / __ \ | | | | | | (_) | / ____| |
+ | | | |_ __ | |_| | | |_ __ _| |_ ___ | (___ | |_ ___ _ __ __ _ __ _ ___
+ | | | | '_ \| __| | | | '_ \| | __/ __| \___ \| __/ _ \| '__/ _` |/ _` |/ _ \
+ | |__| | |_) | |_| |__| | | | | | |_\__ \ ____) | || (_) | | | (_| | (_| | __/
+ \____/| .__/ \__|\____/|_| |_|_|\__|___/ |_____/ \__\___/|_| \__,_|\__, |\___|
+ | | __/ |
+ |_| |___/
+ ******************************************************************************/