Add wrapper macros for pset_first() and pset_next(), which have the return type as...
[libfirm] / include / libfirm / irgmod.h
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief    Support for ir graph modification.
23  * @author   Martin Trapp, Christian Schaefer, Goetz Lindenmaier
24  */
25 #ifndef FIRM_IR_IRGMOD_H
26 #define FIRM_IR_IRGMOD_H
27
28 #include "firm_types.h"
29 #include "begin.h"
30
31 /**
32  * Exchanges two nodes by conserving edges leaving old (i.e.,
33  * pointers pointing to old).
34  * The nodes op will be changed to op_Deleted and you must not do anything with
35  * the node anymore except testing its op.
36  */
37 FIRM_API void exchange(ir_node *old, ir_node *nw);
38
39 /** Turns a node into a "useless" Tuple.
40  *
41  *  Turns a node into a "useless" Tuple.  The Tuple node just forms a tuple
42  *  from several inputs. All predecessors of the tuple are set to bad and
43  *  should be replaced if necssary. The block predecessor remains the same.
44  *  This is useful if a node returning a tuple is removed, but the Projs
45  *  extracting values from the tuple are not available.
46  *
47  *  @param node The node to be turned into a tuple.
48  *  @param arity The number of values formed into a Tuple.
49  */
50 FIRM_API void turn_into_tuple(ir_node *node, int arity);
51
52 /** Walks over the passed IR graph and collects all Phi nodes as a
53   * list in their corresponding block (using get_Block_phis() API).
54   * Further it collects all Proj nodes in a list of the node producing
55   * the tuple. In case of nested tuples the Projs are collected in the
56   * node producing the outermost Tuple.
57   * All other link fields are cleared afterwards.
58   */
59 FIRM_API void collect_phiprojs(ir_graph *irg);
60
61 /** Parts a block into two.  This is useful to insert other blocks within a
62  *  given block.
63  *
64  * Adds a new block (new_block) in the control flow before the block
65  * (old_block) of node.  Moves node and its predecessors from old_block to
66  * new_block.  Moves all Projs that depend on moved nodes and are in old_block
67  * to new_block. Moves all Phi nodes from old_block to new_block.  To achieve
68  * this the routine assumes that all Phi nodes are in the Phi list (see
69  * get_Block_phis()) of old_block.
70  * Further it assumes that all Proj nodes are accessible by the link field of
71  * the nodes producing the Tuple. This can be established by collect_phiprojs().
72  * part_block() conserves this property.
73  * Adds a Jmp node to new_block that jumps to old_block.
74  *
75  * @param node   The node were to break the block
76  */
77 FIRM_API void part_block(ir_node *node);
78
79 /**
80  * Same as part_block() but works with out-edges so you don't have to call
81  * collect_phiprojs.
82  * This variant also removes all predecessors of the old block and returns
83  * it. You are responsible to add control flow predecessors to it.
84  */
85 FIRM_API ir_node *part_block_edges(ir_node *node);
86
87 /**
88  * Kill a node.  No other node may have this node as operand.
89  */
90 FIRM_API void kill_node(ir_node *node);
91
92 #include "end.h"
93
94 #endif