try to fix remat spiller for cases where the inverse operation produces less than...
authorMatthias Braun <matze@braunis.de>
Thu, 11 Jan 2007 16:12:51 +0000 (16:12 +0000)
committerMatthias Braun <matze@braunis.de>
Thu, 11 Jan 2007 16:12:51 +0000 (16:12 +0000)
ir/be/bespillremat.c
ir/be/ia32/bearch_ia32.c

index e3a2847..2a20527 100644 (file)
@@ -527,7 +527,7 @@ get_remat_from_op(spill_ilp_t * si, const ir_node * dest_value, const ir_node *
                                pset_insert_ptr(si->inverse_ops, inverse.nodes[i]);
                        }
 
-                       if(inverse.n <= 2) {
+                       if(inverse.n >= 2) {
                                remat = obstack_alloc(si->obst, sizeof(*remat));
                                remat->op = inverse.nodes[0];
                                remat->cost = inverse.costs;
@@ -753,6 +753,7 @@ sched_put_after(ir_node * insert, ir_node * irn)
        } else {
                insert = sched_next_op(insert);
        }
+       sched_reset(irn);
        sched_add_before(insert, irn);
 }
 
@@ -765,6 +766,7 @@ sched_put_before(const spill_ilp_t * si, ir_node * insert, ir_node * irn)
          insert = sched_next_nonproj(insert, 0);
          insert = sched_prev(insert);
   }
+  sched_reset(irn);
   sched_add_after(insert, irn);
 }
 
index d8af7e3..595c923 100644 (file)
@@ -653,10 +653,7 @@ static arch_inverse_t *ia32_get_inverse(const void *self, const ir_node *irn, in
                        }
                        else {
                                /* normal add: inverse == sub */
-                               ir_node *proj = ia32_get_res_proj(irn);
-                               assert(proj);
-
-                               inverse->nodes[0] = new_rd_ia32_Sub(dbg, irg, block, noreg, noreg, proj, get_irn_n(irn, i ^ 1), nomem, irn_mode);
+                               inverse->nodes[0] = new_rd_ia32_Sub(dbg, irg, block, noreg, noreg, (ir_node*) irn, get_irn_n(irn, i ^ 1), nomem, irn_mode);
                                inverse->costs   += 2;
                        }
                        break;
@@ -670,14 +667,11 @@ static arch_inverse_t *ia32_get_inverse(const void *self, const ir_node *irn, in
                        }
                        else {
                                /* normal sub */
-                               ir_node *proj = ia32_get_res_proj(irn);
-                               assert(proj);
-
                                if (i == 2) {
-                                       inverse->nodes[0] = new_rd_ia32_Add(dbg, irg, block, noreg, noreg, proj, get_irn_n(irn, 3), nomem, irn_mode);
+                                       inverse->nodes[0] = new_rd_ia32_Add(dbg, irg, block, noreg, noreg, (ir_node*) irn, get_irn_n(irn, 3), nomem, irn_mode);
                                }
                                else {
-                                       inverse->nodes[0] = new_rd_ia32_Sub(dbg, irg, block, noreg, noreg, get_irn_n(irn, 2), proj, nomem, irn_mode);
+                                       inverse->nodes[0] = new_rd_ia32_Sub(dbg, irg, block, noreg, noreg, get_irn_n(irn, 2), (ir_node*) irn, nomem, irn_mode);
                                }
                                inverse->costs += 1;
                        }
@@ -691,23 +685,17 @@ static arch_inverse_t *ia32_get_inverse(const void *self, const ir_node *irn, in
                        }
                        else {
                                /* normal xor */
-                               inverse->nodes[0] = new_rd_ia32_Eor(dbg, irg, block, noreg, noreg, (ir_node *)irn, get_irn_n(irn, i), nomem, irn_mode);
+                               inverse->nodes[0] = new_rd_ia32_Eor(dbg, irg, block, noreg, noreg, (ir_node *) irn, get_irn_n(irn, i), nomem, irn_mode);
                                inverse->costs   += 1;
                        }
                        break;
                case iro_ia32_Not: {
-                       ir_node *proj = ia32_get_res_proj(irn);
-                       assert(proj);
-
-                       inverse->nodes[0] = new_rd_ia32_Not(dbg, irg, block, noreg, noreg, proj, nomem, irn_mode);
+                       inverse->nodes[0] = new_rd_ia32_Not(dbg, irg, block, noreg, noreg, (ir_node*) irn, nomem, irn_mode);
                        inverse->costs   += 1;
                        break;
                }
                case iro_ia32_Minus: {
-                       ir_node *proj = ia32_get_res_proj(irn);
-                       assert(proj);
-
-                       inverse->nodes[0] = new_rd_ia32_Minus(dbg, irg, block, noreg, noreg, proj, nomem, irn_mode);
+                       inverse->nodes[0] = new_rd_ia32_Minus(dbg, irg, block, noreg, noreg, (ir_node*) irn, nomem, irn_mode);
                        inverse->costs   += 1;
                        break;
                }