add assert for not getting bad out regs, and fix some bugs related to this
authorMatthias Braun <matze@braunis.de>
Sun, 30 Sep 2007 17:18:16 +0000 (17:18 +0000)
committerMatthias Braun <matze@braunis.de>
Sun, 30 Sep 2007 17:18:16 +0000 (17:18 +0000)
[r16015]

ir/be/bepeephole.c
ir/be/bestate.c
ir/be/ia32/bearch_ia32.c
ir/be/ia32/ia32_fpu.c
ir/be/ia32/ia32_spec.pl
ir/be/ia32/ia32_x87.c

index 508f142..e590aab 100644 (file)
@@ -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);
        }
index 97639e2..6963642 100644 (file)
@@ -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));
+                               }
                        }
                }
        }
index 35195c0..03e6353 100644 (file)
@@ -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);
index b19c944..d5cdf87 100644 (file)
@@ -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);
index 2ad3189..2933796 100644 (file)
@@ -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",
 },
index 965d11e..4a270d9 100644 (file)
@@ -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));