fixed some indents and typos
[r8177]
* File name: ir/ana/irextbb2.c
* Purpose: Alternate extended basic block computation
* Author: Matthias Braun
* File name: ir/ana/irextbb2.c
* Purpose: Alternate extended basic block computation
* Author: Matthias Braun
* Created: 5.2005
* CVS-ID: $Id$
* Copyright: (c) 2002-2005 Universität Karlsruhe
* Created: 5.2005
* CVS-ID: $Id$
* Copyright: (c) 2002-2005 Universität Karlsruhe
*
* Alternative algorithm for computing extended basic blocks (using out edges
* and execution frequencies)
*
* Alternative algorithm for computing extended basic blocks (using out edges
* and execution frequencies)
edge = get_block_succ_first(block);
if (! edge)
return 0;
edge = get_block_succ_first(block);
if (! edge)
return 0;
edge = get_block_succ_next(block, edge);
if (! edge)
return 1;
edge = get_block_succ_next(block, edge);
if (! edge)
return 1;
edge = get_block_succ_next(block, edge);
return edge ? 3 : 2;
}
edge = get_block_succ_next(block, edge);
return edge ? 3 : 2;
}
static void create_extblk(ir_node *block, env_t *env)
{
static void create_extblk(ir_node *block, env_t *env)
{
+ ir_extblk *extblk;
+
+ if (irn_visited(block))
- ir_extblk *extblk = allocate_extblk(block, env);
+ extblk = allocate_extblk(block, env);
mark_irn_visited(block);
pick_successor(block, extblk, env);
mark_irn_visited(block);
pick_successor(block, extblk, env);
static void pick_successor(ir_node *block, ir_extblk *extblk, env_t *env)
{
const ir_edge_t *edge;
static void pick_successor(ir_node *block, ir_extblk *extblk, env_t *env)
{
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) {
+ 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) {
const ir_edge_t *edge;
foreach_block_succ(block, edge) {
execfreq = get_block_execfreq(env->execfreqs, succ);
execfreq = get_block_execfreq(env->execfreqs, succ);
- // remember best sucessor and make non best successor with only 1
- // pred block to new extbb leaders
- if(execfreq > best_execfreq) {
- if(best_succ != NULL) {
+ /*
+ Remember best successor and make non best successor with only 1
+ pred block to new extbb leaders.
+ */
+ if (execfreq > best_execfreq) {
+ if (best_succ != NULL) {
create_extblk(best_succ, env);
}
best_execfreq = execfreq;
best_succ = succ;
create_extblk(best_succ, env);
}
best_execfreq = execfreq;
best_succ = succ;
create_extblk(succ, env);
}
}
create_extblk(succ, env);
}
}
- // add best successor and recursively try to pick more
+ /* add best successor and recursively try to pick more */
if(best_succ != NULL) {
addto_extblk(extblk, best_succ);
mark_irn_visited(best_succ);
if(best_succ != NULL) {
addto_extblk(extblk, best_succ);
mark_irn_visited(best_succ);
* Compute the extended basic blocks for a graph
*/
void compute_extbb_execfreqs(ir_graph *irg, exec_freq_t *execfreqs) {
* Compute the extended basic blocks for a graph
*/
void compute_extbb_execfreqs(ir_graph *irg, exec_freq_t *execfreqs) {
if (irg->extbb_obst) {
obstack_free(irg->extbb_obst, NULL);
if (irg->extbb_obst) {
obstack_free(irg->extbb_obst, NULL);
irg->extbb_obst = xmalloc(sizeof(*irg->extbb_obst));
}
obstack_init(irg->extbb_obst);
irg->extbb_obst = xmalloc(sizeof(*irg->extbb_obst));
}
obstack_init(irg->extbb_obst);
- env.obst = irg->extbb_obst;
- env.head = NULL;
+ env.obst = irg->extbb_obst;
+ env.head = NULL;
env.execfreqs = execfreqs;
assure_irg_outs(irg);
env.execfreqs = execfreqs;
assure_irg_outs(irg);
inc_irg_visited(irg);
create_extblk(get_irg_start_block(irg), &env);
inc_irg_visited(irg);
create_extblk(get_irg_start_block(irg), &env);
- // the end block needs a extbb assigned (even for endless loops)
+ /* the end block needs a extbb assigned (even for endless loops) */
endblock = get_irg_end_block(irg);
endblock = get_irg_end_block(irg);
- if(!irn_visited(endblock)) {
+ if (! irn_visited(endblock)) {
create_extblk(endblock, &env);
}
/*
create_extblk(endblock, &env);
}
/*
- * Ok, we have now the list of all extended blocks starting with env.head
- * every extended block "knowns" the number of blocks in visited and
- * the blocks are linked in link.
- * Now we can create arrays that hold the blocks, some kind of "out" edges
- * for the extended block
- */
+ Ok, we have now the list of all extended blocks starting with env.head
+ every extended block "knowns" the number of blocks in visited and
+ the blocks are linked in link.
+ Now we can create arrays that hold the blocks, some kind of "out" edges
+ for the extended block
+ */
for (extbb = env.head; extbb; extbb = next) {
int i, len = (int)extbb->visited;
ir_node *block;
for (extbb = env.head; extbb; extbb = next) {
int i, len = (int)extbb->visited;
ir_node *block;