2 * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
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.
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.
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
22 * File name: ir/ir/irgmod.h
23 * Purpose: Support for ir graph modification.
24 * Author: Martin Trapp, Christian Schaefer
25 * Modified by: Goetz Lindenmaier
28 * Copyright: (c) 1998-2003 Universität Karlsruhe
35 * ir graph modification.
37 * @author Martin Trapp, Christian Schaefer
39 #ifndef _FIRM_IR_IRGMOD_H_
40 #define _FIRM_IR_IRGMOD_H_
42 #include "firm_types.h"
44 /** Exchanges two nodes by conserving edges leaving old (i.e.,
45 pointers pointing to old). Turns the old node into an Id. */
46 void exchange (ir_node *old, ir_node *nw);
48 /** Turns a node into a "useless" Tuple.
50 * Turns a node into a "useless" Tuple. The Tuple node just forms a tuple
51 * from several inputs. The predecessors of the tuple have to be
52 * set by hand. The block predecessor automatically remains the same.
53 * This is useful if a node returning a tuple is removed, but the Projs
54 * extracting values from the tuple are not available.
56 * @param node The node to be turned into a tuple.
57 * @param arity The number of values formed into a Tuple.
59 void turn_into_tuple (ir_node *node, int arity);
61 /** Walks over the passed ir graph and collects all Phi nodes as a
62 * list built with the link field in their corresponding block.
63 * Further it collects all Proj nodes in a list of the node producing
64 * the tuple. In case of nested tuples the Projs are collected in the
65 * node producing the outermost Tuple.
66 * All other link fields are cleared afterwards.
68 void collect_phiprojs(ir_graph *irg);
70 /** Parts a block into two. This is useful to insert other blocks within a
73 * Adds a new block (new_block) in the control flow before the block
74 * (old_block) of node. Moves node and its predecessors from old_block to
75 * new_block. Moves all Projs that depend on moved nodes and are in old_block
76 * to new_block. Moves all Phi nodes from old_block to new_block. To achieve
77 * this the routine assumes that all Phi nodes are in a list (using the link
78 * field) in the link field of old_block. Further it assumes that all Proj nodes
79 * are accessible by the link field of the nodes producing the Tuple. This
80 * can be established by collect_phiprojs(). part_block conserves this property.
81 * Adds a Jmp node to new_block that jumps to old_block.
82 * Assumes that node is contained in current_ir_graph. Sets current_block in
83 * this ir_graph to new_block.
85 * @param node The node were to break the block
87 void part_block(ir_node *node);
89 #endif /* ifndef _FIRM_IR_IRGMOD_H_ */