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 Extended basis block support.
23 * @author Michael Beck
27 #ifndef FIRM_ANA_IREXTBB_H
28 #define FIRM_ANA_IREXTBB_H
30 #include "firm_types.h"
34 /** Flags for extended basic block state. */
36 ir_extblk_info_none = 0, /**< No extended basic block information is constructed. Default. */
37 ir_extblk_info_valid = 1, /**< Extended basic block information is valid. */
38 ir_extblk_info_invalid = 2 /**< Extended basic block information is constructed but invalid. */
39 } irg_extblk_info_state;
41 /* type of callback function for ir_graph walk */
42 #ifndef _EXTBB_WALK_FUNC_TYPEDEF_
43 #define _EXTBB_WALK_FUNC_TYPEDEF_
45 * The type of a walk function. Does not use the link field.
47 * @param blk - the extended basic block that is just visited
48 * @param env - an environment pointer passed by the walk functions
50 typedef void extbb_walk_func(ir_extblk *blk, void *env);
54 * Checks whether a pointer points to a extended basic block.
55 * Intern version for libFirm.
57 FIRM_API int is_ir_extbb(const void *thing);
60 * Compute the extended basic blocks for a graph.
62 FIRM_API void compute_extbb(ir_graph *irg);
65 * Compute the extended basic blocks for a graph based on execution frequencies.
67 FIRM_API void compute_extbb_execfreqs(ir_graph *irg, ir_exec_freq *execfreqs);
70 * free all extended block info.
72 FIRM_API void free_extbb(ir_graph *irg);
75 * Return the extended block of a node.
77 * @param node the node
79 FIRM_API ir_extblk *get_nodes_extbb(const ir_node *node);
82 * Gets the visited counter of an extended block.
84 * @param blk the extended basic block
86 FIRM_API ir_visited_t get_extbb_visited(const ir_extblk *blk);
89 * Sets the visited counter of an extended block.
91 * @param blk the extended basic block
92 * @param visited new value for the visited counter
94 FIRM_API void set_extbb_visited(ir_extblk *blk, ir_visited_t visited);
97 * Mark an extended block as visited in a graph.
98 * Uses the block visit flag.
100 * @param blk the extended basic block
102 FIRM_API void mark_extbb_visited(ir_extblk *blk);
105 * Returns non-zero if an extended was visited.
106 * Uses the block visit flag.
108 * @param blk the extended basic block
110 FIRM_API int extbb_visited(const ir_extblk *blk);
113 * Returns non-zero if an extended block was NOT visited.
114 * Uses the block visit flag.
116 * @param blk the extended basic block
118 FIRM_API int extbb_not_visited(const ir_extblk *blk);
121 * Returns the link field of an extended block.
123 * @param blk the extended basic block
125 FIRM_API void *get_extbb_link(const ir_extblk *blk);
128 * Sets the link field of an extended block.
130 * @param blk the extended basic block
131 * @param link the new link value
133 FIRM_API void set_extbb_link(ir_extblk *blk, void *link);
136 * Return the number of basic blocks of an extended block.
138 * @param blk the extended basic block
140 FIRM_API int get_extbb_n_blocks(const ir_extblk *blk);
143 * Return the i'th basic block of an extended block.
145 * @param blk the extended basic block
146 * @param pos the position
148 FIRM_API ir_node *get_extbb_block(const ir_extblk *blk, int pos);
151 * Return the leader basic block of an extended block.
153 * @param blk the extended basic block
155 FIRM_API ir_node *get_extbb_leader(const ir_extblk *blk);
158 * Return the node number of an extended block.
159 * Its the block number of the leader block
161 * @param blk the extended basic block
163 FIRM_API long get_extbb_node_nr(const ir_extblk *blk);
166 * Walks only over Extended Basic Block nodes in the graph.
168 * @param blk - the start extended block node
169 * @param pre - walker function, executed before the predecessor of a node are
171 * @param post - walker function, executed after the predecessor of a node are
173 * @param env - environment, passed to pre and post
175 * This function Walks only over Block nodes in the graph. Has it's own visited
176 * flag, so that it can be interleaved with the other walker.
177 * If a none block is passed, starts at the block this node belongs to.
178 * If end is passed also visits kept alive blocks. Does not use the link field.
180 FIRM_API void irg_extblock_walk(ir_extblk *blk, extbb_walk_func *pre,
181 extbb_walk_func *post, void *env);
184 * Walks only over reachable Extended Basic Block nodes in the graph.
185 * Ensures, that the extended block containing the End node is visited last
186 * and the block containing Start visited first (in post order).
188 * @param irg - the irg graph
189 * @param pre - walker function, executed before the predecessor of a block
191 * @param post - walker function, executed after the predecessor of a block
193 * @param env - environment, passed to pre and post
195 FIRM_API void irg_extblock_walk_graph(ir_graph *irg, extbb_walk_func *pre,
196 extbb_walk_func *post, void *env);