added new licence header
[libfirm] / ir / ir / irgmod.h
1 /*
2  * Copyright (C) 1995-2007 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  * Project:     libFIRM
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
26  * Created:
27  * CVS-ID:      $Id$
28  * Copyright:   (c) 1998-2003 Universität Karlsruhe
29  */
30
31 /**
32  *
33  * @file irgmod.h
34  *
35  * ir graph modification.
36  *
37  * @author Martin Trapp, Christian Schaefer
38  */
39 #ifndef _FIRM_IR_IRGMOD_H_
40 #define _FIRM_IR_IRGMOD_H_
41
42 #include "firm_types.h"
43
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);
47
48 /** Turns a node into a "useless" Tuple.
49  *
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.
55  *
56  *  @param node The node to be turned into a tuple.
57  *  @param arity The number of values formed into a Tuple.
58  */
59 void turn_into_tuple (ir_node *node, int arity);
60
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.
67   */
68 void collect_phiprojs(ir_graph *irg);
69
70 /** Parts a block into two.  This is useful to insert other blocks within a
71  *  given block.
72  *
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.
84  *
85  * @param node   The node were to break the block
86  */
87 void part_block(ir_node *node);
88
89 #endif /* ifndef _FIRM_IR_IRGMOD_H_ */