From: Matthias Braun Date: Sun, 30 Sep 2007 17:18:16 +0000 (+0000) Subject: add assert for not getting bad out regs, and fix some bugs related to this X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=7afc3e2cc7c463124a83262e7cabce6f167b3270;p=libfirm add assert for not getting bad out regs, and fix some bugs related to this [r16015] --- diff --git a/ir/be/bepeephole.c b/ir/be/bepeephole.c index 508f142a0..e590aab23 100644 --- a/ir/be/bepeephole.c +++ b/ir/be/bepeephole.c @@ -77,7 +77,7 @@ static void set_value(ir_node *node) if(!mode_is_data(get_irn_mode(node))) return; - reg = arch_get_irn_register(arch_env, node); + reg = arch_get_irn_register(arch_env, node); if(reg == NULL) { panic("No register assigned at %+F\n", node); } diff --git a/ir/be/bestate.c b/ir/be/bestate.c index 97639e29e..69636421f 100644 --- a/ir/be/bestate.c +++ b/ir/be/bestate.c @@ -401,6 +401,10 @@ void belady(minibelady_env_t *env, ir_node *block) arity = get_irn_arity(node); for(i = 0; i < arity; ++i) { ir_node *in = get_irn_n(node, i); + + if(!mode_is_data(get_irn_mode(in))) + continue; + const arch_register_t *reg = arch_get_irn_register(env->arch_env, in); if(reg == env->reg) { @@ -424,6 +428,10 @@ void belady(minibelady_env_t *env, ir_node *block) foreach_out_edge(node, edge) { ir_node *proj = get_edge_src_irn(edge); + + if(!mode_is_data(get_irn_mode(proj))) + continue; + const arch_register_t *reg = arch_get_irn_register(env->arch_env, proj); if(reg == env->reg) { @@ -432,11 +440,13 @@ void belady(minibelady_env_t *env, ir_node *block) } } } else { - const arch_register_t *reg = - arch_get_irn_register(env->arch_env, node); - if(reg == env->reg) { - current_state = node; - DBG((dbg, LEVEL_3, "\t... current_state <- %+F\n", current_state)); + if(mode_is_data(get_irn_mode(node))) { + const arch_register_t *reg = + arch_get_irn_register(env->arch_env, node); + if(reg == env->reg) { + current_state = node; + DBG((dbg, LEVEL_3, "\t... current_state <- %+F\n", current_state)); + } } } } diff --git a/ir/be/ia32/bearch_ia32.c b/ir/be/ia32/bearch_ia32.c index 35195c09f..03e6353ea 100644 --- a/ir/be/ia32/bearch_ia32.c +++ b/ir/be/ia32/bearch_ia32.c @@ -294,6 +294,7 @@ static const arch_register_t *ia32_get_irn_reg(const void *self, if (is_ia32_irn(irn)) { const arch_register_t **slots; slots = get_ia32_slots(irn); + assert(pos < get_ia32_n_res(irn)); reg = slots[pos]; } else { reg = ia32_get_firm_reg(irn, cur_reg_set); diff --git a/ir/be/ia32/ia32_fpu.c b/ir/be/ia32/ia32_fpu.c index b19c944d4..d5cdf87e4 100644 --- a/ir/be/ia32/ia32_fpu.c +++ b/ir/be/ia32/ia32_fpu.c @@ -154,6 +154,9 @@ void collect_fpu_mode_nodes_walker(ir_node *node, void *data) { collect_fpu_mode_nodes_env_t *env = data; + if(!mode_is_data(get_irn_mode(node))) + return; + const arch_register_t *reg = arch_get_irn_register(env->arch_env, node); if(reg == &ia32_fp_cw_regs[REG_FPCW] && !is_ia32_ChangeCW(node)) { ARR_APP1(ir_node*, env->state_nodes, node); diff --git a/ir/be/ia32/ia32_spec.pl b/ir/be/ia32/ia32_spec.pl index 2ad3189e8..2933796cf 100644 --- a/ir/be/ia32/ia32_spec.pl +++ b/ir/be/ia32/ia32_spec.pl @@ -2077,56 +2077,55 @@ fistp => { fldz => { op_flags => "R|c|K", - irn_flags => "R", - reg_req => { }, + irn_flags => "R", emit => '. fldz', attr_type => "ia32_x87_attr_t", }, fld1 => { op_flags => "R|c|K", - irn_flags => "R", - reg_req => { }, + irn_flags => "R", + reg_req => { out => [ "vfp" ] }, emit => '. fld1', attr_type => "ia32_x87_attr_t", }, fldpi => { op_flags => "R|c|K", - irn_flags => "R", - reg_req => { }, + irn_flags => "R", + reg_req => { out => [ "vfp" ] }, emit => '. fldpi', attr_type => "ia32_x87_attr_t", }, fldln2 => { op_flags => "R|c|K", - irn_flags => "R", - reg_req => { }, + irn_flags => "R", + reg_req => { out => [ "vfp" ] }, emit => '. fldln2', attr_type => "ia32_x87_attr_t", }, fldlg2 => { op_flags => "R|c|K", - irn_flags => "R", - reg_req => { }, + irn_flags => "R", + reg_req => { out => [ "vfp" ] }, emit => '. fldlg2', attr_type => "ia32_x87_attr_t", }, fldl2t => { op_flags => "R|c|K", - irn_flags => "R", - reg_req => { }, + irn_flags => "R", + reg_req => { out => [ "vfp" ] }, emit => '. fldll2t', attr_type => "ia32_x87_attr_t", }, fldl2e => { op_flags => "R|c|K", - irn_flags => "R", - reg_req => { }, + irn_flags => "R", + reg_req => { out => [ "vfp" ] }, emit => '. fldl2e', attr_type => "ia32_x87_attr_t", }, diff --git a/ir/be/ia32/ia32_x87.c b/ir/be/ia32/ia32_x87.c index 965d11e70..4a270d9f0 100644 --- a/ir/be/ia32/ia32_x87.c +++ b/ir/be/ia32/ia32_x87.c @@ -1800,8 +1800,7 @@ static int sim_Copy(x87_state *state, ir_node *n) { keep_float_node_alive(state, pred); } - DB((dbg, LEVEL_1, "<<< %+F %s -> %s\n", node, op1->name, - arch_get_irn_register(sim->arch_env, node)->name)); + DB((dbg, LEVEL_1, "<<< %+F %s -> ?\n", node, op1->name)); } else { out_idx = x87_on_stack(state, arch_register_get_index(out));