local_optimize() now kills unrteachable code if dominance info is available.
[libfirm] / ir / ir / irgmod.h
1 /*
2  * Project:     libFIRM
3  * File name:   ir/ir/irgmod.h
4  * Purpose:     Support for ir graph modification.
5  * Author:      Martin Trapp, Christian Schaefer
6  * Modified by: Goetz Lindenmaier
7  * Created:
8  * CVS-ID:      $Id$
9  * Copyright:   (c) 1998-2003 Universität Karlsruhe
10  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
11  */
12
13 /**
14  *
15  * @file irgmod.h
16  *
17  * ir graph modification.
18  *
19  * @author Martin Trapp, Christian Schaefer
20  */
21
22
23 # ifndef _IRGMOD_H_
24 # define _IRGMOD_H_
25
26 # include "irnode.h"
27
28 /** Exchanges two nodes by conserving edges leaving old (i.e.,
29    pointers pointing to old).  Turns the old node into an Id. */
30 void exchange (ir_node *old, ir_node *nw);
31
32 /** Turns a node into a "useless" Tuple.
33  *
34  *  Turns a node into a "useless" Tuple.  The Tuple node just forms a tuple
35  *  from several inputs.  The predecessors of the tuple have to be
36  *  set by hand.  The block predecessor automatically remains the same.
37  *  This is useful if a node returning a tuple is removed, but the Projs
38  *  extracting values from the tuple are not available.
39  *
40  *  @param node The node to be turned into a tuple.
41  *  @param arity The number of values formed into a Tuple.
42  */
43 void turn_into_tuple (ir_node *node, int arity);
44
45 /** Walks over the passed ir graph and collects all Phi nodes as a
46   * list built with the link field in their corresponding block.
47   * Further it collects all Proj nodes in a list of the node producing
48   * the tuple. In case of nested tuples the Projs are collected in the
49   * node producing the outermost Tuple.
50   * All other link fields are cleared afterwards.
51   */
52 void collect_phiprojs(ir_graph *irg);
53
54 /** Parts a block into two.  This is useful to insert other blocks within a
55  *  given block.
56  *
57  * Adds a new block (new_block) in the control flow before the block
58  * (old_block) of node.  Moves node and its predecessors from old_block to
59  * new_block.  Moves all Projs that depend on moved nodes and are in old_block
60  * to new_block. Moves all Phi nodes from old_block to new_block.  To achieve
61  * this the routine assumes that all Phi nodes are in a list (using the link
62  * field) in the link field of old_block.  Further it assumes that all Proj nodes
63  * are accessible by the link field of the nodes producing the Tuple. This
64  * can be established by collect_phiprojs().  part_block conserves this property.
65  * Adds a Jmp node to new_block that jumps to old_block.
66  * Assumes that node is contained in current_ir_graph.  Sets current_block in
67  * this ir_graph to new_block.
68  *
69  * @param node   The node were to break the block
70  */
71 void part_block(ir_node *node);
72
73 #endif /* ifndef _IRGMOD_H_ */