* @date 05.05.2006
* @version $Id$
*/
-#ifdef HAVE_CONFIG_H
#include "config.h"
-#endif
#include <limits.h>
typedef struct be_verify_register_pressure_env_t_ {
ir_graph *irg; /**< the irg to verify */
be_lv_t *lv; /**< Liveness information. */
- const arch_env_t *arch_env; /**< an architecture environment */
const arch_register_class_t *cls; /**< the register class to check for */
int registers_available; /**< number of available registers */
int problem_found; /**< flag indicating if a problem was found */
/* collect register pressure info, start with end of a block */
// ir_fprintf(stderr, "liveness check %+F\n", block);
ir_nodeset_init(&live_nodes);
- be_liveness_end_of_block(env->lv, env->arch_env, env->cls, block,
+ be_liveness_end_of_block(env->lv, env->cls, block,
&live_nodes);
// print_living_values(stderr, &live_nodes);
break;
// print_living_values(stderr, &live_nodes);
- be_liveness_transfer(env->arch_env, env->cls, irn, &live_nodes);
+ be_liveness_transfer(env->cls, irn, &live_nodes);
pressure = ir_nodeset_size(&live_nodes);
env.lv = be_liveness(birg);
env.irg = irg;
- env.arch_env = birg->main_env->arch_env;
env.cls = cls;
env.registers_available = env.cls->n_regs - be_put_ignore_regs(birg, env.cls, NULL);
env.problem_found = 0;
int problem_found; /**< flags indicating if there was a problem */
bitset_t *scheduled; /**< bitset of scheduled nodes */
ir_graph *irg; /**< the irg to check */
- const arch_env_t *arch_env; /**< the arch_env */
} be_verify_schedule_env_t;
/**
}
}
-static int should_be_scheduled(be_verify_schedule_env_t *env, ir_node *node) {
+static int should_be_scheduled(ir_node *node)
+{
if(is_Block(node))
return -1;
break;
}
- if(arch_irn_get_flags(env->arch_env, node) & arch_irn_flags_ignore)
+ if (arch_irn_get_flags(node) & arch_irn_flags_ignore)
return -1;
return 1;
int should_be;
int scheduled;
- should_be = should_be_scheduled(env, node);
+ should_be = should_be_scheduled(node);
if(should_be == -1)
return;
env.problem_found = 0;
env.irg = be_get_birg_irg(birg);
env.scheduled = bitset_alloca(get_irg_last_idx(env.irg));
- env.arch_env = birg->main_env->arch_env;
irg_block_walk_graph(env.irg, verify_schedule_walker, NULL, &env);
/* check if all nodes are scheduled */
} spill_t;
typedef struct {
- const arch_env_t *arch_env;
- ir_graph *irg;
- set *spills;
- ir_node **reloads;
- int problem_found;
+ ir_graph *irg;
+ set *spills;
+ ir_node **reloads;
+ int problem_found;
} be_verify_spillslots_env_t;
static int cmp_spill(const void* d1, const void* d2, size_t size) {
static
void collect_spill(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent) {
- ir_entity *spillent = arch_get_frame_entity(env->arch_env, node);
+ ir_entity *spillent = arch_get_frame_entity(node);
be_check_entity(env, node, spillent);
get_spill(env, node, ent);
*/
static void collect_spills_walker(ir_node *node, void *data) {
be_verify_spillslots_env_t *env = data;
- const arch_env_t *arch_env = env->arch_env;
/* @@@ ia32_classify returns classification of Proj_pred :-/ */
if(is_Proj(node))
return;
- if(arch_irn_class_is(arch_env, node, reload)) {
+ if (arch_irn_class_is(node, reload)) {
ir_node *spill = get_memory_edge(node);
ir_entity *ent;
env->problem_found = 1;
return;
}
- ent = arch_get_frame_entity(env->arch_env, node);
+ ent = arch_get_frame_entity(node);
be_check_entity(env, node, ent);
collect(env, spill, node, ent);
if(be_is_Spill(node) || (is_Proj(node) && be_is_MemPerm(get_Proj_pred(node)))) {
spill_t *spill = find_spill(env, node);
if(be_is_Spill(node)) {
- ir_entity *ent = arch_get_frame_entity(env->arch_env, node);
+ ir_entity *ent = arch_get_frame_entity(node);
be_check_entity(env, node, ent);
}
}
}
-int be_verify_spillslots(const arch_env_t *arch_env, ir_graph *irg)
+int be_verify_spillslots(ir_graph *irg)
{
be_verify_spillslots_env_t env;
- env.arch_env = arch_env;
env.irg = irg;
env.spills = new_set(cmp_spill, 10);
env.reloads = NEW_ARR_F(ir_node*, 0);
int i, arity;
/* verify output register */
- if (arch_get_irn_reg_class(arch_env, node, -1) != NULL) {
- reg = arch_get_irn_register(arch_env, node);
+ if (arch_get_irn_reg_class(node, -1) != NULL) {
+ reg = arch_get_irn_register(node);
if (reg == NULL) {
ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) should have a register assigned\n",
node, get_nodes_block(node), get_irg_dump_name(irg));
problem_found = 1;
- } else if (! arch_register_type_is(reg, joker) && !arch_reg_is_allocatable(arch_env, node, -1, reg)) {
+ } else if (!arch_register_type_is(reg, joker) && !arch_reg_is_allocatable(node, -1, reg)) {
ir_fprintf(stderr, "Verify warning: Register %s assigned as output of %+F not allowed (register constraint) in block %+F(%s)\n",
reg->name, node, get_nodes_block(node), get_irg_dump_name(irg));
problem_found = 1;
continue;
}
- if (arch_get_irn_reg_class(arch_env, node, i) == NULL)
+ if (arch_get_irn_reg_class(node, i) == NULL)
continue;
- reg = arch_get_irn_register(arch_env, pred);
+ reg = arch_get_irn_register(pred);
if (reg == NULL) {
ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) should have a register assigned (%+F input constraint)\n",
pred, get_nodes_block(pred), get_irg_dump_name(irg), node);
problem_found = 1;
continue;
- }
- else if (! arch_register_type_is(reg, joker) && ! arch_reg_is_allocatable(arch_env, node, i, reg)) {
+ } else if (!arch_register_type_is(reg, joker) && ! arch_reg_is_allocatable(node, i, reg)) {
ir_fprintf(stderr, "Verify warning: Register %s as input %d of %+F not allowed (register constraint) in block %+F(%s)\n",
reg->name, i, node, get_nodes_block(node), get_irg_dump_name(irg));
problem_found = 1;
if (is_Phi(node)) {
int i, arity;
- reg = arch_get_irn_register(arch_env, node);
+ reg = arch_get_irn_register(node);
arity = get_irn_arity(node);
for (i = 0; i < arity; ++i) {
ir_node *pred = get_Phi_pred(node, i);
- const arch_register_t *pred_reg = arch_get_irn_register(arch_env, pred);
+ const arch_register_t *pred_reg = arch_get_irn_register(pred);
- if (reg != pred_reg) {
- ir_fprintf(stderr, "Verify warning: Register %s as input %d of %+F not allowed (register constraint) in block %+F(%s)\n",
- reg->name, i, node, get_nodes_block(node), get_irg_dump_name(irg));
+ if (reg != pred_reg && !arch_register_type_is(pred_reg, joker)) {
+ ir_fprintf(stderr, "Verify warning: Input %d of %+F in block %+F(%s) uses register %s instead of %s\n",
+ i, node, get_nodes_block(node), get_irg_dump_name(irg), pred_reg->name, reg->name);
problem_found = 1;
}
}
const arch_register_t *reg;
ir_node *reg_node;
- if (arch_get_irn_reg_class(arch_env, node, -1) != regclass)
+ if (arch_get_irn_reg_class(node, -1) != regclass)
return;
- reg = arch_get_irn_register(arch_env, node);
+ reg = arch_get_irn_register(node);
if (reg->type & arch_register_type_virtual)
return;
const arch_register_t *reg;
ir_node *reg_node;
- if (arch_get_irn_reg_class(arch_env, node, -1) != regclass)
+ if (arch_get_irn_reg_class(node, -1) != regclass)
return;
- reg = arch_get_irn_register(arch_env, node);
+ reg = arch_get_irn_register(node);
if (reg->type & arch_register_type_virtual)
return;
nregclasses = arch_env_get_n_reg_class(arch_env);
for (i = 0; i < nregclasses; ++i) {
ir_node *node;
- int i2;
+ int idx, i2, n_regs;
regclass = arch_env_get_reg_class(arch_env, i);
- int i;
-
assert(lv->nodes && "live sets must be computed");
- int n_regs = arch_register_class_n_regs(regclass);
- registers = alloca(n_regs * sizeof(registers[0]));
+ n_regs = arch_register_class_n_regs(regclass);
+ registers = alloca(n_regs * sizeof(registers[0]));
memset(registers, 0, n_regs * sizeof(registers[0]));
- be_lv_foreach(lv, block, be_lv_state_end, i) {
- ir_node *node = be_lv_get_irn(lv, block, i);
+ be_lv_foreach(lv, block, be_lv_state_end, idx) {
+ ir_node *node = be_lv_get_irn(lv, block, idx);
value_used(node);
}
}
}
- be_lv_foreach(lv, block, be_lv_state_in, i) {
- ir_node *node = be_lv_get_irn(lv, block, i);
+ be_lv_foreach(lv, block, be_lv_state_in, idx) {
+ ir_node *node = be_lv_get_irn(lv, block, idx);
value_def(node);
}
ir_graph *irg = env->irg;
const ir_edge_t* edge;
- if(irn_visited(node))
+ if (irn_visited_else_mark(node))
return;
- mark_irn_visited(node);
/* we find too many (uncritical) dead nodes in block out edges */
if(is_Block(node))