From: Matthias Braun Date: Thu, 11 Jan 2007 16:12:51 +0000 (+0000) Subject: try to fix remat spiller for cases where the inverse operation produces less than... X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=aaee7ff18e8437da8b2b82ace341469e1c22c311;p=libfirm try to fix remat spiller for cases where the inverse operation produces less than 2 values... --- diff --git a/ir/be/bespillremat.c b/ir/be/bespillremat.c index e3a284799..2a2052714 100644 --- a/ir/be/bespillremat.c +++ b/ir/be/bespillremat.c @@ -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); } diff --git a/ir/be/ia32/bearch_ia32.c b/ir/be/ia32/bearch_ia32.c index d8af7e3db..595c9235e 100644 --- a/ir/be/ia32/bearch_ia32.c +++ b/ir/be/ia32/bearch_ia32.c @@ -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; }