From: Michael Beck Date: Tue, 10 May 2011 19:18:32 +0000 (+0200) Subject: Moved some helper functions from irgopt to irtools for reuse. X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=e89d246315545f5f4e3eaa0dbb5a862d36b0bddb;p=libfirm Moved some helper functions from irgopt to irtools for reuse. --- diff --git a/ir/common/irtools.c b/ir/common/irtools.c index 6065951cf..426ff8fe7 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. * @@ -51,6 +51,20 @@ 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); +} + +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); diff --git a/ir/common/irtools.h b/ir/common/irtools.h index 9c361b860..fe85e0a44 100644 --- a/ir/common/irtools.h +++ b/ir/common/irtools.h @@ -77,10 +77,23 @@ void firm_clear_link(ir_node *n, void *env); * The famous clear_link_and_block_lists() walker-function. * Sets all links fields of visited nodes to NULL. * Additionally, clear all Phi-lists of visited blocks. - * Do not implement it by yourself, use this one + * Do not implement it by yourself, use this one. */ void firm_clear_node_and_phi_links(ir_node *n, void *env); +/** + * Walker function, sets all phi list heads fields of visited Blocks + * to NULL. + * Use in conjunction with firm_collect_block_phis(). + */ +void firm_clear_block_phis(ir_node *node, void *env); + +/** + * Walker function, links all visited Phi nodes into its block links. + * Use in conjunction with firm_clear_block_phis(). + */ +void firm_collect_block_phis(ir_node *node, void *env); + /** * Creates an exact copy of a node with same inputs and attributes in the * same block. diff --git a/ir/ir/irgopt.c b/ir/ir/irgopt.c index 968bf5f35..18f1d4257 100644 --- a/ir/ir/irgopt.c +++ b/ir/ir/irgopt.c @@ -182,20 +182,6 @@ static void opt_walker(ir_node *n, void *env) } } -static void clear_block_phis(ir_node *node, void *env) { - (void) env; - if (is_Block(node)) { - set_Block_phis(node, NULL); - } -} - -static void collect_block_phis(ir_node *node, void *env) { - (void) env; - if (is_Phi(node)) { - add_Block_phi(get_nodes_block(node), node); - } -} - static int count_non_bads(ir_node *node) { int arity = get_irn_arity(node); int count = 0; @@ -275,7 +261,7 @@ static void block_remove_bads(ir_node *block, int *changed) { static int remove_Bads(ir_graph *irg) { int changed = 0; /* build phi list per block */ - irg_walk_graph(irg, clear_block_phis, collect_block_phis, NULL); + irg_walk_graph(irg, firm_clear_block_phis, firm_collect_block_phis, NULL); /* actually remove Bads */ irg_block_walk_graph(irg, NULL, (void (*)(struct ir_node *, void *)) block_remove_bads, &changed);