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
26 #ifndef FIRM_ANA_IREXTBB_H
27 #define FIRM_ANA_IREXTBB_H
29 #include "firm_types.h"
33 /* type of callback function for ir_graph walk */
34 #ifndef _EXTBB_WALK_FUNC_TYPEDEF_
35 #define _EXTBB_WALK_FUNC_TYPEDEF_
37 * The type of a walk function. Does not use the link field.
39 * @param blk - the extended basic block that is just visited
40 * @param env - an environment pointer passed by the walk functions
42 typedef void extbb_walk_func(ir_extblk *blk, void *env);
46 * Checks whether a pointer points to a extended basic block.
47 * Intern version for libFirm.
49 FIRM_API int is_ir_extbb(const void *thing);
52 * Compute the extended basic blocks for a graph.
54 FIRM_API void compute_extbb(ir_graph *irg);
57 * Compute the extended basic blocks for a graph based on execution frequencies.
59 FIRM_API void compute_extbb_execfreqs(ir_graph *irg, ir_exec_freq *execfreqs);
62 * free all extended block info.
64 FIRM_API void free_extbb(ir_graph *irg);
67 * Returns the extended block of a node.
69 * @param node the node
71 FIRM_API ir_extblk *get_nodes_extbb(const ir_node *node);
74 * Returns the visited counter of an extended block.
76 * @param blk the extended basic block
78 FIRM_API ir_visited_t get_extbb_visited(const ir_extblk *blk);
81 * Sets the visited counter of an extended block.
83 * @param blk the extended basic block
84 * @param visited new value for the visited counter
86 FIRM_API void set_extbb_visited(ir_extblk *blk, ir_visited_t visited);
89 * Mark an extended block as visited in a graph.
90 * Uses the block visit flag.
92 * @param blk the extended basic block
94 FIRM_API void mark_extbb_visited(ir_extblk *blk);
97 * Returns non-zero if an extended was visited.
98 * Uses the block visit flag.
100 * @param blk the extended basic block
102 FIRM_API int extbb_visited(const ir_extblk *blk);
105 * Returns non-zero if an extended block was NOT visited.
106 * Uses the block visit flag.
108 * @param blk the extended basic block
110 FIRM_API int extbb_not_visited(const ir_extblk *blk);
113 * Returns the link field of an extended block.
115 * @param blk the extended basic block
117 FIRM_API void *get_extbb_link(const ir_extblk *blk);
120 * Sets the link field of an extended block.
122 * @param blk the extended basic block
123 * @param link the new link value
125 FIRM_API void set_extbb_link(ir_extblk *blk, void *link);
128 * Returns the number of basic blocks of an extended block.
130 * @param blk the extended basic block
132 FIRM_API int get_extbb_n_blocks(const ir_extblk *blk);
135 * Returns the i'th basic block of an extended block.
137 * @param blk the extended basic block
138 * @param pos the position
140 FIRM_API ir_node *get_extbb_block(const ir_extblk *blk, int pos);
143 * Returns the leader basic block of an extended block.
145 * @param blk the extended basic block
147 FIRM_API ir_node *get_extbb_leader(const ir_extblk *blk);
150 * Returns the node number of an extended block.
151 * Its the block number of the leader block
153 * @param blk the extended basic block
155 FIRM_API long get_extbb_node_nr(const ir_extblk *blk);
158 * Walks only over Extended Basic Block nodes in the graph.
160 * @param blk - the start extended block node
161 * @param pre - walker function, executed before the predecessor of a node are
163 * @param post - walker function, executed after the predecessor of a node are
165 * @param env - environment, passed to pre and post
167 * This function Walks only over Block nodes in the graph. Has its own visited
168 * flag, so that it can be interleaved with the other walker.
169 * If a none block is passed, starts at the block this node belongs to.
170 * If end is passed also visits kept alive blocks. Does not use the link field.
172 FIRM_API void irg_extblock_walk(ir_extblk *blk, extbb_walk_func *pre,
173 extbb_walk_func *post, void *env);
176 * Walks only over reachable Extended Basic Block nodes in the graph.
177 * Ensures, that the extended block containing the End node is visited last
178 * and the block containing Start visited first (in post order).
180 * @param irg - the irg graph
181 * @param pre - walker function, executed before the predecessor of a block
183 * @param post - walker function, executed after the predecessor of a block
185 * @param env - environment, passed to pre and post
187 FIRM_API void irg_extblock_walk_graph(ir_graph *irg, extbb_walk_func *pre,
188 extbb_walk_func *post, void *env);