+ * Checks if a node is optimizable, viz. has somthing to do with coalescing
+ * @param arch The architecture environment
+ * @param irn The irn to check
+ * @param req A register_requirement structure (used to check for 2-addr-code)
+ */
+#define is_optimizable(arch, irn, req) (is_Reg_Phi(irn) || is_Perm_Proj(arch, irn) || is_2addr_code(arch, irn, req))
+
+/**
+ * Checks if the irn is a non-interfering argument of a node which 'is_optimizable'
+ */
+int is_optimizable_arg(const copy_opt_t *co, ir_node *irn);
+
+/**
+ * Computes the costs of a copy according to loop depth
+ * @param pos: the argument position of arg in the root arguments
+ * @return Must be >= 0 in all cases.
+ */
+int get_costs_loop_depth(ir_node *root, ir_node* arg, int pos);
+
+/**
+ * All costs equal 1. Using this will reduce the number of copies.
+ * @return Must be >= 0 in all cases.
+ */
+int get_costs_all_one(ir_node *root, ir_node* arg, int pos);
+
+/**
+ * Returns the maximal costs possible, i.e. the costs if all
+ * pairs would be assigned different registers.
+ */
+int co_get_max_copy_costs(const copy_opt_t *co);
+
+/**
+ * Returns the inevitable costs, i.e. the costs of
+ * all copy pairs which interfere.
+ */
+int co_get_inevit_copy_costs(const copy_opt_t *co);
+
+/**
+ * Returns the current costs the copies are causing.
+ * The result includes inevitable costs and the costs
+ * of the copies regarding the current register allocation