* @brief Alternative extended basic block computation
* @author Matthias Braun
* @date 5.2005
- * @version $Id$
- * @summary
+ * @brief
* Alternative algorithm for computing extended basic blocks (using out edges
* and execution frequencies)
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
#include "irextbb_t.h"
#include "irgwalk.h"
#include "irprintf.h"
#include "execfreq.h"
-typedef struct _env {
- struct obstack *obst; /**< the obstack where allocations took place */
+typedef struct env {
+ struct obstack *obst; /**< the obstack where allocations took place */
ir_extblk *head; /**< head of the list of all extended blocks */
ir_exec_freq *execfreqs;
} env_t;
*/
static ir_extblk *allocate_extblk(ir_node *block, env_t *env)
{
- ir_extblk *extblk = obstack_alloc(env->obst, sizeof(*extblk));
+ ir_extblk *extblk = OALLOC(env->obst, ir_extblk);
extblk->kind = k_ir_extblk;
extblk->visited = 1;
* Returns the number of block successors.
* we are interested only in 1, 2 and >2.
*/
-static int get_block_n_succs(ir_node *block) {
+static int get_block_n_succs(ir_node *block)
+{
if (edges_activated(current_ir_graph)) {
const ir_edge_t *edge;
ir_node *best_succ = NULL;
double best_execfreq = -1;
- /*
+ /*
More than two successors means we have a jump table.
we cannot include a jump target into the current extended
basic block, so create a new one here.
*/
if (get_block_n_succs(block) > 2) {
- const ir_edge_t *edge;
-
foreach_block_succ(block, edge) {
ir_node *succ = get_edge_src_irn(edge);
create_extblk(succ, env);
ir_node *succ = get_edge_src_irn(edge);
double execfreq;
- if(irn_visited(succ))
+ if (irn_visited(succ))
continue;
- if(get_Block_n_cfgpreds(succ) > 1) {
+ if (get_Block_n_cfgpreds(succ) > 1) {
create_extblk(succ, env);
continue;
}
}
/* add best successor and recursively try to pick more */
- if(best_succ != NULL) {
+ if (best_succ != NULL) {
addto_extblk(extblk, best_succ);
mark_irn_visited(best_succ);
pick_successor(best_succ, extblk, env);
}
}
-/*
- * Compute the extended basic blocks for a graph
- */
-void compute_extbb_execfreqs(ir_graph *irg, ir_exec_freq *execfreqs) {
- env_t env;
+void compute_extbb_execfreqs(ir_graph *irg, ir_exec_freq *execfreqs)
+{
+ env_t env;
ir_extblk *extbb, *next;
ir_node *endblock;
extbb->blks = NEW_ARR_D(ir_node *, env.obst, len);
- for (block = extbb->link, i = 0; i < len; ++i) {
- ir_node *nblock = get_irn_link(block);
+ for (block = (ir_node*) extbb->link, i = 0; i < len; ++i) {
+ ir_node *nblock = (ir_node*) get_irn_link(block);
/* ensure that the leader is the first one */
extbb->blks[len - 1 - i] = block;
}
#if 0
- for(i = 0; i < len; ++i) {
- if(i > 0)
+ for (i = 0; i < len; ++i) {
+ if (i > 0)
printf(", ");
ir_printf("%+F", extbb->blks[i]);
}
extbb->visited = 0;
}
- irg->extblk_state = extblk_valid;
+ set_irg_state(irg, IR_GRAPH_STATE_VALID_EXTENDED_BLOCKS);
}