+#undef QUICK_AND_DIRTY_HACK
+
+/******************************************************************************
+ _____ _
+ / ____| | |
+ | | __ ___ _ __ ___ _ __ __ _| |
+ | | |_ |/ _ \ '_ \ / _ \ '__/ _` | |
+ | |__| | __/ | | | __/ | | (_| | |
+ \_____|\___|_| |_|\___|_| \__,_|_|
+
+ ******************************************************************************/
+
+DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
+
+void be_copy_opt_init(void) {
+}
+
+copy_opt_t *new_copy_opt(be_chordal_env_t *chordal_env, int (*get_costs)(ir_node*, ir_node*, int)) {
+ const char *s1, *s2, *s3;
+ int len;
+ copy_opt_t *co;
+
+ FIRM_DBG_REGISTER(dbg, "ir.be.copyopt");
+
+ co = xcalloc(1, sizeof(*co));
+ co->cenv = chordal_env;
+ co->aenv = chordal_env->birg->main_env->arch_env;
+ co->irg = chordal_env->irg;
+ co->cls = chordal_env->cls;
+ co->get_costs = get_costs;
+
+ s1 = get_irp_prog_name();
+ s2 = get_entity_name(get_irg_entity(co->irg));
+ s3 = chordal_env->cls->name;
+ len = strlen(s1) + strlen(s2) + strlen(s3) + 5;
+ co->name = xmalloc(len);
+ snprintf(co->name, len, "%s__%s__%s", s1, s2, s3);
+
+ return co;
+}
+
+void free_copy_opt(copy_opt_t *co) {
+ xfree(co->name);
+ free(co);
+}
+
+int co_is_optimizable_root(const copy_opt_t *co, ir_node *irn) {
+ arch_register_req_t req;
+ const arch_register_t *reg;
+
+ if (arch_irn_is(co->aenv, irn, ignore))
+ return 0;
+
+ reg = arch_get_irn_register(co->aenv, irn);
+ if (arch_register_type_is(reg, ignore))
+ return 0;
+
+ 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;
+ const arch_register_t *reg;
+
+ assert(0 && "Is buggy and obsolete. Do not use");
+
+ if (arch_irn_is(co->aenv, irn, ignore))
+ return 0;
+
+ reg = arch_get_irn_register(co->aenv, irn);
+ if (arch_register_type_is(reg, ignore))
+ return 0;
+
+ foreach_out_edge(irn, edge) {
+ ir_node *n = edge->src;