beifg: Remove the unused function be_ifg_nodes_break().
[libfirm] / include / libfirm / irgmod.h
1 /*
2  * This file is part of libFirm.
3  * Copyright (C) 2012 University of Karlsruhe.
4  */
5
6 /**
7  * @file
8  * @brief    Support for ir graph modification.
9  * @author   Martin Trapp, Christian Schaefer, Goetz Lindenmaier
10  */
11 #ifndef FIRM_IR_IRGMOD_H
12 #define FIRM_IR_IRGMOD_H
13
14 #include "firm_types.h"
15 #include "begin.h"
16
17 /**
18  * Exchanges two nodes by conserving edges leaving old (i.e.,
19  * pointers pointing to old).
20  * The nodes op will be changed to op_Deleted and you must not do anything with
21  * the node anymore except testing its op.
22  */
23 FIRM_API void exchange(ir_node *old, ir_node *nw);
24
25 /** Turns a node into a "useless" Tuple.
26  *
27  *  Turns a node into a "useless" Tuple.  The Tuple node just forms a tuple
28  *  from several inputs. All predecessors of the tuple are set to bad and
29  *  should be replaced if necssary. The block predecessor remains the same.
30  *  This is useful if a node returning a tuple is removed, but the Projs
31  *  extracting values from the tuple are not available.
32  *
33  *  @param node The node to be turned into a tuple.
34  *  @param arity The number of values formed into a Tuple.
35  */
36 FIRM_API void turn_into_tuple(ir_node *node, int arity, ir_node *const in[]);
37
38 /** Walks over the passed IR graph and collects all Phi nodes as a
39   * list in their corresponding block (using get_Block_phis() API).
40   * Further it collects all Proj nodes in a list of the node producing
41   * the tuple. In case of nested tuples the Projs are collected in the
42   * node producing the outermost Tuple.
43   * All other link fields are cleared afterwards.
44   */
45 FIRM_API void collect_phiprojs(ir_graph *irg);
46
47 /** Parts a block into two.  This is useful to insert other blocks within a
48  *  given block.
49  *
50  * Adds a new block (new_block) in the control flow before the block
51  * (old_block) of node.  Moves node and its predecessors from old_block to
52  * new_block.  Moves all Projs that depend on moved nodes and are in old_block
53  * to new_block. Moves all Phi nodes from old_block to new_block.  To achieve
54  * this the routine assumes that all Phi nodes are in the Phi list (see
55  * get_Block_phis()) of old_block.
56  * Further it assumes that all Proj nodes are accessible by the link field of
57  * the nodes producing the Tuple. This can be established by collect_phiprojs().
58  * part_block() conserves this property.
59  * Adds a Jmp node to new_block that jumps to old_block.
60  *
61  * @param node   The node were to break the block
62  */
63 FIRM_API void part_block(ir_node *node);
64
65 /**
66  * Same as part_block() but works with out-edges so you don't have to call
67  * collect_phiprojs.
68  * This variant also removes all predecessors of the old block and returns
69  * it. You are responsible to add control flow predecessors to it.
70  */
71 FIRM_API ir_node *part_block_edges(ir_node *node);
72
73 /**
74  * Kill a node.  No other node may have this node as operand.
75  */
76 FIRM_API void kill_node(ir_node *node);
77
78 #include "end.h"
79
80 #endif