/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
#include "beirgmod.h"
#include "bemodule.h"
#include "be.h"
+#include "error.h"
-#include <libcore/lc_opts.h>
-#include <libcore/lc_opts_enum.h>
-#include <libcore/lc_timing.h>
+#include "lc_opts.h"
+#include "lc_opts_enum.h"
#ifdef WITH_ILP
#include <lpp/lpp.h>
int pos; /**< number of cfg predecessor (target) */
double execfreq; /**< the frequency */
int highest_execfreq; /**< flag that indicates whether this edge is the edge with the highest
- execfreq pointing away from this block */
+ execfreq pointing away from this block */
} edge_t;
typedef struct _blocksched_env_t {
arity = get_Block_n_cfgpreds(block);
if (arity == 0) {
- assert(block == get_irg_start_block(env->irg));
- /* must be the start block, nothing to do here */
+ assert(block == get_irg_start_block(env->irg)
+ || block == get_irg_end_block(env->irg));
+ /* must be the start block (or end-block for endless loops), nothing to
+ * do here */
return;
} else if (arity == 1) {
edge.block = block;
for (i = 0; i < edge_count; ++i) {
const edge_t *edge = &env->edges[i];
ir_node *block = edge->block;
+ int pos = edge->pos;
ir_node *pred_block;
blocksched_entry_t *entry, *pred_entry;
- /* the block might have been removed already... */
- if (is_Bad(get_Block_cfgpred(block, 0)))
- continue;
-
/* only check edge with highest frequency */
if (! edge->highest_execfreq)
continue;
- pred_block = get_Block_cfgpred_block(block, edge->pos);
+ /* the block might have been removed already... */
+ if (is_Bad(get_Block_cfgpred(block, 0)))
+ continue;
+
+ pred_block = get_Block_cfgpred_block(block, pos);
entry = get_irn_link(block);
pred_entry = get_irn_link(pred_block);
if (is_Bad(get_Block_cfgpred(block, 0)))
continue;
- /* we can't fallthroughs in backedges */
- if (is_backedge(block, edge->pos))
+ /* we can't do fallthroughs in backedges */
+ if (is_backedge(block, pos))
continue;
pred_block = get_Block_cfgpred_block(block, pos);
ir_node *startblock = get_irg_start_block(irg);
blocksched_entry_t *entry = get_irn_link(startblock);
- set_using_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
inc_irg_visited(irg);
env->worklist = new_pdeq();
assert(pdeq_empty(env->worklist));
del_pdeq(env->worklist);
- clear_using_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
return entry;
}
list.end = NULL;
list.n_blks = 0;
- set_using_irn_link(irg);
- set_using_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED | IR_RESOURCE_IRN_LINK);
inc_irg_block_visited(irg);
create_block_list(get_irg_start_block(irg), &list);
blk_list[i] = b;
}
- clear_using_irn_link(irg);
- clear_using_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED | IR_RESOURCE_IRN_LINK);
return blk_list;
}
#endif /* WITH_ILP */
}
- assert(0 && "unknown blocksched algo");
+ panic("unknown blocksched algo");
return NULL;
}