* @brief Methods to compute when a value will be used again.
* @author Sebastian Hack, Matthias Braun
* @date 27.06.2005
- * @version $Id$
*/
#include "config.h"
#include "irgraph_t.h"
#include "iredges_t.h"
#include "irdom_t.h"
+#include "util.h"
#include "be_t.h"
#include "beutil.h"
#include "bearch.h"
#include "beuses.h"
+#define UNKNOWN_OUTERMOST_LOOP ((unsigned)-1)
+
typedef struct be_use_t {
const ir_node *block;
const ir_node *node;
- int outermost_loop;
+ unsigned outermost_loop;
unsigned next_use;
ir_visited_t visited;
} be_use_t;
const ir_node *block,
const ir_node *def)
{
- unsigned hash = HASH_COMBINE(hash_irn(block), hash_irn(def));
+ unsigned hash = hash_combine(hash_irn(block), hash_irn(def));
be_use_t temp;
be_use_t* result;
temp.block = block;
temp.node = def;
- result = (be_use_t*)set_find(env->uses, &temp, sizeof(temp), hash);
+ result = set_find(be_use_t, env->uses, &temp, sizeof(temp), hash);
if (result == NULL) {
// insert templ first as we might end in a loop in the get_next_use
// call otherwise
temp.next_use = USES_INFINITY;
- temp.outermost_loop = -1;
+ temp.outermost_loop = UNKNOWN_OUTERMOST_LOOP;
temp.visited = 0;
- result = (be_use_t*)set_insert(env->uses, &temp, sizeof(temp), hash);
+ result = set_insert(be_use_t, env->uses, &temp, sizeof(temp), hash);
}
- if (result->outermost_loop < 0 && result->visited < env->visited_counter) {
+ if (result->outermost_loop == UNKNOWN_OUTERMOST_LOOP && result->visited < env->visited_counter) {
be_next_use_t next_use;
result->visited = env->visited_counter;
next_use = get_next_use(env, sched_first(block), def, 0);
- if (next_use.outermost_loop >= 0) {
+ if (next_use.outermost_loop != UNKNOWN_OUTERMOST_LOOP) {
result->next_use = next_use.time;
result->outermost_loop = next_use.outermost_loop;
DBG((env->dbg, LEVEL_5, "Setting nextuse of %+F in block %+F to %u (outermostloop %d)\n",
*/
static int be_is_phi_argument(const ir_node *block, const ir_node *def)
{
- ir_node *node;
- ir_node *succ_block = NULL;
- int arity, i;
-
#if 1
if (get_irn_n_edges_kind(block, EDGE_KIND_BLOCK) < 1)
#else
#endif
return 0;
- succ_block = get_first_block_succ(block);
+ ir_node *const succ_block = get_first_block_succ(block);
- arity = get_Block_n_cfgpreds(succ_block);
- if (arity <= 1) {
+ if (get_Block_n_cfgpreds(succ_block) <= 1) {
/* no Phis in the successor */
return 0;
}
/* find the index of block in its successor */
- for (i = 0; i < arity; ++i) {
- if (get_Block_cfgpred_block(succ_block, i) == block)
- break;
- }
- assert(i < arity);
+ int const i = get_Block_cfgpred_pos(succ_block, block);
+ assert(i >= 0);
/* iterate over the Phi nodes in the successor and check if def is
* one of its arguments */
{
unsigned step;
ir_node *block = get_nodes_block(from);
- ir_node *next_use;
+ ir_node *next_use_node;
ir_node *node;
unsigned timestep;
unsigned next_use_step;
- const ir_edge_t *edge;
assert(skip_from_uses == 0 || skip_from_uses == 1);
if (skip_from_uses) {
from = sched_next(from);
}
- next_use = NULL;
+ next_use_node = NULL;
next_use_step = INT_MAX;
timestep = get_step(from);
foreach_out_edge(def, edge) {
- ir_node *node = get_edge_src_irn(edge);
- unsigned node_step;
+ unsigned node_step;
+ node = get_edge_src_irn(edge);
if (is_Anchor(node))
continue;
if (node_step < timestep)
continue;
if (node_step < next_use_step) {
- next_use = node;
+ next_use_node = node;
next_use_step = node_step;
}
}
- if (next_use != NULL) {
+ if (next_use_node != NULL) {
be_next_use_t result;
result.time = next_use_step - timestep + skip_from_uses;
result.outermost_loop = get_loop_depth(get_irn_loop(block));
- result.before = next_use;
+ result.before = next_use_node;
return result;
}
}
{
- unsigned next_use = USES_INFINITY;
- int outermost_loop;
+ unsigned next_use = USES_INFINITY;
+ unsigned outermost_loop;
be_next_use_t result;
- ir_loop *loop = get_irn_loop(block);
- int loopdepth = get_loop_depth(loop);
- int found_visited = 0;
- int found_use = 0;
- ir_graph *irg = get_irn_irg(block);
- ir_node *startblock = get_irg_start_block(irg);
+ ir_loop *loop = get_irn_loop(block);
+ unsigned loopdepth = get_loop_depth(loop);
+ int found_visited = 0;
+ int found_use = 0;
+ ir_graph *irg = get_irn_irg(block);
+ ir_node *startblock = get_irg_start_block(irg);
result.before = NULL;
outermost_loop = loopdepth;
}
use = get_or_set_use_block(env, succ_block, def);
- DBG((env->dbg, LEVEL_5, "Found %u (loopdepth %d) (we're in block %+F)\n", use->next_use,
+ DBG((env->dbg, LEVEL_5, "Found %u (loopdepth %u) (we're in block %+F)\n", use->next_use,
use->outermost_loop, block));
if (USES_IS_INFINITE(use->next_use)) {
- if (use->outermost_loop < 0) {
+ if (use->outermost_loop == UNKNOWN_OUTERMOST_LOOP) {
found_visited = 1;
}
continue;
if (!found_use && found_visited) {
// the current result is correct for the current search, but isn't
// generally correct, so mark it
- result.outermost_loop = -1;
+ result.outermost_loop = UNKNOWN_OUTERMOST_LOOP;
}
- DBG((env->dbg, LEVEL_5, "Result: %d (outerloop: %d)\n", result.time, result.outermost_loop));
+ DBG((env->dbg, LEVEL_5, "Result: %d (outerloop: %u)\n", result.time, result.outermost_loop));
return result;
}
}
*/
static void set_sched_step_walker(ir_node *block, void *data)
{
- ir_node *node;
unsigned step = 0;
(void) data;
{
be_uses_t *env = XMALLOC(be_uses_t);
- edges_assure(irg);
+ assure_edges(irg);
//set_using_irn_link(irg);