X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Firgmod.h;h=038dd13ed0b4e40471b0db8e89cb8d5a26ff3b2d;hb=e824e6962c4532b2d1ef5ad9097df6754f8e560a;hp=75a3737023095ca7a34e7c5dbcf175398e329210;hpb=f6a4a7d0c707eb1961523d4f80e6d948a7bab10b;p=libfirm diff --git a/include/libfirm/irgmod.h b/include/libfirm/irgmod.h index 75a373702..038dd13ed 100644 --- a/include/libfirm/irgmod.h +++ b/include/libfirm/irgmod.h @@ -21,29 +21,33 @@ * @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 in their corresponding block (using get_Block_phis() API). @@ -52,7 +56,7 @@ void turn_into_tuple(ir_node *node, int arity); * 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,22 +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 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. + * 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 by setting its predecessors to Bad and finally - * exchange the node by Bad itself. + * Kill a node. No other node may have this node as operand. */ -void kill_node(ir_node *node); +FIRM_API void kill_node(ir_node *node); + +#include "end.h" -#endif /* FIRM_IR_IRGMOD_H */ +#endif