X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fcommon%2Firtools.c;h=1e3e9ef30385966c11f2819f9e719f68064f7ed7;hb=026ec52ac914eee06e7afb961fb754735fb4ad9f;hp=e7cf6bdd15e09f07add1e3ba81680343f1a26abf;hpb=1ce363f80e6a204d4011f85813362d9bd1d0e7e4;p=libfirm diff --git a/ir/common/irtools.c b/ir/common/irtools.c index e7cf6bdd1..1e3e9ef30 100644 --- a/ir/common/irtools.c +++ b/ir/common/irtools.c @@ -23,9 +23,7 @@ * @author Michael Beck * @version $Id$ */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif +#include "config.h" #include "pset.h" @@ -37,8 +35,8 @@ /* the famous clear_link implementation. */ void firm_clear_link(ir_node *n, void *env) { - (void) env; - set_irn_link(n, NULL); + (void) env; + set_irn_link(n, NULL); } /* @@ -50,66 +48,69 @@ void firm_clear_link(ir_node *n, void *env) { * 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_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) + 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, nn); - new_backedge_info(nn); - set_irn_link(n, nn); - - /* fix the irg for blocks */ - if (is_Block(nn)) - nn->attr.block.irg = irg; +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_initial_exec(old_irg)) + nn = get_irg_initial_exec(irg); + else if (n == get_irg_frame(old_irg)) + nn = get_irg_frame(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) + 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, nn); + new_backedge_info(nn); + set_irn_link(n, nn); + + /* fix the irg for blocks */ + if (is_Block(nn)) { + nn->attr.block.irg = irg; + + /* we cannot allow blocks WITHOUT macroblock input */ + set_Block_MacroBlock(nn, get_Block_MacroBlock(n)); + } } /* @@ -121,7 +122,7 @@ ir_node *exact_copy(const ir_node *n) { ir_node *res, *block = NULL; if (is_no_Block(n)) - block = get_irn_n(n, -1); + block = get_nodes_block(n); res = new_ir_node(get_irn_dbg_info(n), irg, @@ -137,11 +138,17 @@ ir_node *exact_copy(const ir_node *n) { frees e.g. the memory of the graph_arr allocated in new_immBlock. */ copy_node_attr(n, res); new_backedge_info(res); + + if (is_Block(n)) { + set_Block_MacroBlock(res, get_Block_MacroBlock(n)); + } return res; } -void firm_pset_dump(pset *set) -{ +/* + * Dump a pset containing Firm objects. + */ +void firm_pset_dump(pset *set) { void *obj; foreach_pset(set, obj) {