From 9518de081dea142a017129105f2a89d4ec7df8a5 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Sun, 18 Dec 2005 22:53:34 +0000 Subject: [PATCH] copy_irn_to_irg() added [r7093] --- ir/common/irtools.c | 77 +++++++++++++++++++++++++++++++++++++++++++++ ir/common/irtools.h | 17 ++++++++-- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/ir/common/irtools.c b/ir/common/irtools.c index bb0fddaa0..540452da5 100644 --- a/ir/common/irtools.c +++ b/ir/common/irtools.c @@ -15,9 +15,86 @@ #include #include "irnode_t.h" +#include "irbackedge_t.h" #include "irtools.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. + */ +void +copy_irn_to_irg(ir_node *n, ir_graph *irg) +{ + ir_op *op = get_irn_op(n); + ir_graph *old_irg; + ir_node *nn = NULL; + + /* do not copy standard nodes */ + if (op == op_Bad) + nn = get_irg_bad(irg); + else if (op == op_NoMem) + n = get_irg_no_mem(irg); + else if (op == op_Block) { + old_irg = get_irn_irg(n); + + if (n == get_irg_start_block(old_irg)) + nn = get_irg_start_block(irg); + else if (n == get_irg_end_block(old_irg)) + nn = get_irg_end_block(irg); + } + else if (op == op_Start) + nn = get_irg_start(irg); + else if (op == op_End) + nn = get_irg_end(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)) + nn = get_irg_frame(irg); + else if (n == get_irg_globals(old_irg)) + nn = get_irg_globals(irg); + else if (n == get_irg_initial_mem(old_irg)) + nn = get_irg_initial_mem(irg); + else if (n == get_irg_args(old_irg)) + nn = get_irg_args(irg); + } + + if (nn) { + set_irn_link(n, nn); + return; + } + + nn = new_ir_node(get_irn_dbg_info(n), + irg, + NULL, /* no block yet, will be set later */ + op, + get_irn_mode(n), + get_irn_arity(n), + get_irn_in(n)); + + + /* 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, nn); + new_backedge_info(nn); + set_irn_link(n, nn); + + /* fix the irg for blocks */ + if (is_Block(nn)) + nn->attr.block.irg = irg; +} diff --git a/ir/common/irtools.h b/ir/common/irtools.h index af81e0043..a67d8b90f 100644 --- a/ir/common/irtools.h +++ b/ir/common/irtools.h @@ -13,15 +13,13 @@ #define _IRTOOLS_H_ #include "firm_config.h" +#include "firm_types.h" #ifdef WITH_LIBCORE #include lc_opt_entry_t *firm_opt_get_root(void); #endif - -#include "irnode.h" - /** * convert an integer into pointer */ @@ -38,4 +36,17 @@ lc_opt_entry_t *firm_opt_get_root(void); */ void firm_clear_link(ir_node *n, void *env); +/** + * 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. + */ +void copy_irn_to_irg(ir_node *n, ir_graph *irg); + #endif /* _IRTOOLS_H_ */ -- 2.20.1