X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fcommon%2Firtools.c;h=deecaab253e22d9fc5b3cd8d11e48a0e0cd51e63;hb=b879b3a893adf77d54431b7ffaf12911eed65474;hp=d34c753607d9159bc9176de88880554db830ec06;hpb=94e9283b212f0f10b460248de945576a0bb61703;p=libfirm diff --git a/ir/common/irtools.c b/ir/common/irtools.c index d34c75360..deecaab25 100644 --- a/ir/common/irtools.c +++ b/ir/common/irtools.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -21,7 +21,6 @@ * @file * @brief Some often needed tool-functions * @author Michael Beck - * @version $Id$ */ #include "config.h" @@ -51,6 +50,23 @@ void firm_clear_node_and_phi_links(ir_node *n, void *env) set_Phi_next(n, NULL); } +void firm_clear_block_phis(ir_node *node, void *env) +{ + (void) env; + if (is_Block(node)) { + set_Block_phis(node, NULL); + } else if (is_Phi(node)) { + set_Phi_next(node, NULL); + } +} + +void firm_collect_block_phis(ir_node *node, void *env) +{ + (void) env; + if (is_Phi(node)) + add_Block_phi(get_nodes_block(node), node); +} + void copy_irn_to_irg(ir_node *n, ir_graph *irg) { ir_op *op = get_irn_op(n); @@ -58,9 +74,7 @@ void copy_irn_to_irg(ir_node *n, ir_graph *irg) ir_node *nn = NULL; /* do not copy standard nodes */ - if (op == op_Bad) - nn = get_irg_bad(irg); - else if (op == op_NoMem) + if (op == op_NoMem) n = get_irg_no_mem(irg); else if (op == op_Block) { old_irg = get_irn_irg(n); @@ -107,12 +121,9 @@ void copy_irn_to_irg(ir_node *n, ir_graph *irg) copy_node_attr(irg, n, nn); set_irn_link(n, nn); - /* fix the irg for blocks */ - if (is_Block(nn)) { + /* fix the irg for nodes containing a reference to it */ + if (ir_has_irg_ref(nn)) { nn->attr.block.irg.irg = irg; - - /* we cannot allow blocks WITHOUT macroblock input */ - set_Block_MacroBlock(nn, get_Block_MacroBlock(n)); } } @@ -144,9 +155,6 @@ ir_node *irn_copy_into_irg(const ir_node *node, ir_graph *irg) /* copy the attributes */ copy_node_attr(irg, node, res); - if (op == op_Block) { - set_Block_MacroBlock(res, get_Block_MacroBlock(node)); - } /* duplicate dependency edges */ n_deps = get_irn_deps(node); @@ -170,22 +178,14 @@ static ir_node *get_new_node(const ir_node *old_node) void irn_rewire_inputs(ir_node *node) { - ir_graph *new_irg; - ir_node *new_node; - int arity; - int i; + ir_node *new_node; + int arity; + int n_deps; + int i; new_node = get_new_node(node); - if (is_Block(node)) { - /* copy the macro block header */ - ir_node *mbh = get_Block_MacroBlock(node); - - /* get the macro block header */ - ir_node *nmbh = get_new_node(mbh); - assert(nmbh != NULL); - set_Block_MacroBlock(new_node, nmbh); - } else { + if (!is_Block(node)) { ir_node *block = get_nodes_block(node); ir_node *new_block = get_new_node(block); set_nodes_block(new_node, new_block); @@ -198,16 +198,22 @@ void irn_rewire_inputs(ir_node *node) set_irn_n(new_node, i, new_in); } + n_deps = get_irn_deps(new_node); + for (i = 0; i < n_deps; ++i) { + ir_node *dep = get_irn_dep(node, i); + ir_node *new_dep = get_new_node(dep); + set_irn_dep(new_node, i, new_dep); + } + /* Now the new node is complete. We can add it to the hash table for CSE. */ - new_irg = get_irn_irg(new_node); - add_identities(new_irg->value_table, new_node); + add_identities(new_node); } void firm_pset_dump(pset *set) { void *obj; - foreach_pset(set, obj) { + foreach_pset(set, void*, obj) { ir_fprintf(stderr, "%+F\n", obj); } }