X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fcommon%2Firtools.c;h=37eae69fb1038b226a5ecca503039086d38f42e3;hb=c0acb5cc9a2967e31e2b2961a98831d674cea3b8;hp=540452da52f290e3c2df66aa391823c5a3090ac4;hpb=9518de081dea142a017129105f2a89d4ec7df8a5;p=libfirm diff --git a/ir/common/irtools.c b/ir/common/irtools.c index 540452da5..37eae69fb 100644 --- a/ir/common/irtools.c +++ b/ir/common/irtools.c @@ -13,23 +13,23 @@ # include "config.h" #endif +#include "pset.h" + #include #include "irnode_t.h" #include "irbackedge_t.h" #include "irtools.h" +#include "irprintf.h" /* the famous clear_link implementation. */ void firm_clear_link(ir_node *n, void *env) { set_irn_link(n, NULL); } -/** +/* * Copies a node to a new irg. The Ins of the new node point to * the predecessors on the old irg. n->link points to the new node. * - * @param n The node to be copied - * @param irg the new irg - * * Does NOT copy standard nodes like Start, End etc that are fixed * in an irg. Instead, the corresponding nodes of the new irg are returned. * Note further, that the new nodes have no block. @@ -61,9 +61,7 @@ copy_irn_to_irg(ir_node *n, ir_graph *irg) else if (op == op_Proj) { old_irg = get_irn_irg(n); - if (n == get_irg_cstore(old_irg)) - nn = get_irg_cstore(irg); - else if (n == get_irg_frame(old_irg)) + if (n == get_irg_frame(old_irg)) nn = get_irg_frame(irg); else if (n == get_irg_globals(old_irg)) nn = get_irg_globals(irg); @@ -84,7 +82,7 @@ copy_irn_to_irg(ir_node *n, ir_graph *irg) op, get_irn_mode(n), get_irn_arity(n), - get_irn_in(n)); + get_irn_in(n) + 1); /* Copy the attributes. These might point to additional data. If this @@ -98,3 +96,40 @@ copy_irn_to_irg(ir_node *n, ir_graph *irg) if (is_Block(nn)) nn->attr.block.irg = irg; } + +/* + * Creates an exact copy of a node. + * The copy resides in the same graph in the same block. + */ +ir_node *exact_copy(const ir_node *n) { + ir_graph *irg = get_irn_irg(n); + ir_node *res, *block = NULL; + + if (is_no_Block(n)) + block = get_nodes_block(n); + + res = new_ir_node(get_irn_dbg_info(n), + irg, + block, + get_irn_op(n), + get_irn_mode(n), + get_irn_arity(n), + get_irn_in(n) + 1); + + + /* Copy the attributes. These might point to additional data. If this + was allocated on the old obstack the pointers now are dangling. This + frees e.g. the memory of the graph_arr allocated in new_immBlock. */ + copy_node_attr(n, res); + new_backedge_info(res); + return res; +} + +void firm_pset_dump(pset *set) +{ + void *obj; + + foreach_pset(set, obj) { + ir_fprintf(stderr, "%+F\n", obj); + } +}