2 * Copyright (C) 1995-2008 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 * @brief Support for ir graph modification.
23 * @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier
26 #ifndef FIRM_IR_IRGMOD_H
27 #define FIRM_IR_IRGMOD_H
29 #include "firm_types.h"
32 /** Exchanges two nodes by conserving edges leaving old (i.e.,
33 pointers pointing to old). Turns the old node into an Id. */
34 FIRM_API void exchange(ir_node *old, ir_node *nw);
36 /** Turns a node into a "useless" Tuple.
38 * Turns a node into a "useless" Tuple. The Tuple node just forms a tuple
39 * from several inputs. All predecessors of the tuple are set to bad and
40 * should be replaced if necssary. The block predecessor remains the same.
41 * This is useful if a node returning a tuple is removed, but the Projs
42 * extracting values from the tuple are not available.
44 * @param node The node to be turned into a tuple.
45 * @param arity The number of values formed into a Tuple.
47 FIRM_API void turn_into_tuple(ir_node *node, int arity);
49 /** Walks over the passed IR graph and collects all Phi nodes as a
50 * list in their corresponding block (using get_Block_phis() API).
51 * Further it collects all Proj nodes in a list of the node producing
52 * the tuple. In case of nested tuples the Projs are collected in the
53 * node producing the outermost Tuple.
54 * All partBlocks are linked to its macroblock header.
55 * All other link fields are cleared afterwards.
57 FIRM_API void collect_phiprojs(ir_graph *irg);
59 /** Parts a block into two. This is useful to insert other blocks within a
62 * Adds a new block (new_block) in the control flow before the block
63 * (old_block) of node. Moves node and its predecessors from old_block to
64 * new_block. Moves all Projs that depend on moved nodes and are in old_block
65 * to new_block. Moves all Phi nodes from old_block to new_block. To achieve
66 * this the routine assumes that all Phi nodes are in the Phi list (see get_Block_phis())
67 * of old_block. Further it assumes that all Proj nodes are accessible by the link field
68 * of the nodes producing the Tuple and all partBlocks are linked to its MacroBlock header.
69 * This can be established by collect_phiprojs(). part_block() conserves this property.
70 * Adds a Jmp node to new_block that jumps to old_block.
72 * @param node The node were to break the block
74 FIRM_API void part_block(ir_node *node);
77 * Kill a node by setting its predecessors to Bad and finally
78 * exchange the node by Bad itself.
80 FIRM_API void kill_node(ir_node *node);