} spill_t;
typedef struct {
- be_lv_t *lv;
+ const arch_env_t *arch_env;
ir_graph *irg;
set *spills;
ir_node **reloads;
return res;
}
+static ir_node *get_memory_edge(const ir_node *node) {
+ int i, arity;
+ ir_node *result = NULL;
+
+ arity = get_irn_arity(node);
+ for(i = arity - 1; i >= 0; --i) {
+ ir_node *arg = get_irn_n(node, i);
+ if(get_irn_mode(arg) == mode_M) {
+ assert(result == NULL);
+ result = arg;
+ }
+ }
+
+ return result;
+}
+
static void collect(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, entity* ent);
static void check_entity(be_verify_spillslots_env_t *env, ir_node *node, entity *ent) {
}
static void collect_spill(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, entity* ent) {
- entity *spillent = be_get_frame_entity(node);
+ entity *spillent = arch_get_frame_entity(env->arch_env, node);
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(be_is_Reload(node)) {
- ir_node *spill = get_irn_n(node, be_pos_Reload_mem);
- entity* ent = be_get_frame_entity(node);
+ if(arch_irn_class_is(arch_env, node, reload)) {
+ ir_node *spill = get_memory_edge(node);
+ entity *ent;
+
+ if(spill == NULL) {
+ ir_fprintf(stderr, "Verify warning: No spill attached to reload %+F in block %+F(%s)\n",
+ node, get_nodes_block(node), get_irg_dump_name(env->irg));
+ env->problem_found = 1;
+ return;
+ }
+ ent = arch_get_frame_entity(env->arch_env, node);
check_entity(env, node, ent);
collect(env, spill, node, ent);
sp2->spill, get_nodes_block(sp2->spill), get_irg_dump_name(env->irg));
env->problem_found = 1;
my_values_interfere(sp1->spill, sp2->spill);
- printf("Intf: %d\n", values_interfere(env->lv, sp1->spill, sp2->spill));
}
}
}
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)) {
- entity *ent = be_get_frame_entity(node);
+ entity *ent = arch_get_frame_entity(env->arch_env, node);
check_entity(env, node, ent);
}
}
}
-int be_verify_spillslots(ir_graph *irg)
+int be_verify_spillslots(const arch_env_t *arch_env, 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);
env.problem_found = 0;
- env.lv = be_liveness(irg);
irg_walk_graph(irg, collect_spills_walker, NULL, &env);
irg_walk_graph(irg, check_lonely_spills, NULL, &env);
check_spillslot_interference(&env);
- be_liveness_free(env.lv);
DEL_ARR_F(env.reloads);
del_set(env.spills);
const arch_register_class_t *regclass, pset *nodes) {
const arch_env_t *arch_env = env->arch_env;
ir_node *node;
+ const arch_register_t *reg;
+ int fail = 0;
bitset_t *registers = bitset_alloca(arch_register_class_n_regs(regclass));
foreach_pset(nodes, node) {
- const arch_register_t *reg;
if(arch_get_irn_reg_class(arch_env, node, -1) != regclass)
continue;
continue;
}
if(bitset_is_set(registers, reg->index)) {
- ir_fprintf(stderr, "Verify warning: Register %s assigned more than once at node %+F in block %+F(%s)\n",
- reg->name, node, get_nodes_block(node), get_irg_dump_name(env->irg));
- env->problem_found = 1;
- continue;
+ pset_break(nodes);
+ fail = 1;
+ break;
}
bitset_set(registers, reg->index);
}
+ if (fail) {
+ ir_fprintf(stderr, "Verify warning: Register %s assigned more than once in block %+F(%s)\n",
+ reg->name, get_nodes_block(node), get_irg_dump_name(env->irg));
+ env->problem_found = 1;
+
+ foreach_pset(nodes, node) {
+ if (arch_get_irn_register(arch_env, node) == reg) {
+ ir_fprintf(stderr, " at node %+F\n", node);
+ }
+ }
+ }
}
static void verify_block_register_allocation(ir_node *block, void *data) {