X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Firgmod.h;h=038dd13ed0b4e40471b0db8e89cb8d5a26ff3b2d;hb=64252961a7d41265ff28353949e63f0662a1cd03;hp=cf5cac6351653a8fe16cfb1dee1d3add2e9a8e0e;hpb=1ec30d95387eb392ba5a1adc7958ebd91383d59c;p=libfirm diff --git a/include/libfirm/irgmod.h b/include/libfirm/irgmod.h index cf5cac635..038dd13ed 100644 --- a/include/libfirm/irgmod.h +++ b/include/libfirm/irgmod.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -21,38 +21,42 @@ * @file * @brief Support for ir graph modification. * @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier - * @version $Id$ */ #ifndef FIRM_IR_IRGMOD_H #define FIRM_IR_IRGMOD_H #include "firm_types.h" +#include "begin.h" -/** Exchanges two nodes by conserving edges leaving old (i.e., - pointers pointing to old). Turns the old node into an Id. */ -void exchange(ir_node *old, ir_node *nw); +/** + * Exchanges two nodes by conserving edges leaving old (i.e., + * pointers pointing to old). + * The nodes op will be changed to op_Deleted and you must not do anything with + * the node anymore except testing its op. + */ +FIRM_API void exchange(ir_node *old, ir_node *nw); /** Turns a node into a "useless" Tuple. * * Turns a node into a "useless" Tuple. The Tuple node just forms a tuple - * from several inputs. The predecessors of the tuple have to be - * set by hand. The block predecessor automatically remains the same. + * from several inputs. All predecessors of the tuple are set to bad and + * should be replaced if necssary. The block predecessor remains the same. * This is useful if a node returning a tuple is removed, but the Projs * extracting values from the tuple are not available. * * @param node The node to be turned into a tuple. * @param arity The number of values formed into a Tuple. */ -void turn_into_tuple(ir_node *node, int arity); +FIRM_API void turn_into_tuple(ir_node *node, int arity); -/** Walks over the passed ir graph and collects all Phi nodes as a - * list built with the link field in their corresponding block. +/** Walks over the passed IR graph and collects all Phi nodes as a + * list in their corresponding block (using get_Block_phis() API). * Further it collects all Proj nodes in a list of the node producing * the tuple. In case of nested tuples the Projs are collected in the * node producing the outermost Tuple. * All other link fields are cleared afterwards. */ -void collect_phiprojs(ir_graph *irg); +FIRM_API void collect_phiprojs(ir_graph *irg); /** Parts a block into two. This is useful to insert other blocks within a * given block. @@ -61,16 +65,30 @@ void collect_phiprojs(ir_graph *irg); * (old_block) of node. Moves node and its predecessors from old_block to * new_block. Moves all Projs that depend on moved nodes and are in old_block * to new_block. Moves all Phi nodes from old_block to new_block. To achieve - * this the routine assumes that all Phi nodes are in a list (using the link - * field) in the link field of old_block. Further it assumes that all Proj nodes - * are accessible by the link field of the nodes producing the Tuple. This - * can be established by collect_phiprojs(). part_block conserves this property. + * this the routine assumes that all Phi nodes are in the Phi list (see + * get_Block_phis()) of old_block. + * Further it assumes that all Proj nodes are accessible by the link field of + * the nodes producing the Tuple. This can be established by collect_phiprojs(). + * part_block() conserves this property. * Adds a Jmp node to new_block that jumps to old_block. - * Assumes that node is contained in current_ir_graph. Sets current_block in - * this ir_graph to new_block. * * @param node The node were to break the block */ -void part_block(ir_node *node); +FIRM_API void part_block(ir_node *node); + +/** + * Same as part_block() but works with out-edges so you don't have to call + * collect_phiprojs. + * This variant also removes all predecessors of the old block and returns + * it. You are responsible to add control flow predecessors to it. + */ +FIRM_API ir_node *part_block_edges(ir_node *node); + +/** + * Kill a node. No other node may have this node as operand. + */ +FIRM_API void kill_node(ir_node *node); + +#include "end.h" -#endif /* FIRM_IR_IRGMOD_H */ +#endif