From: Michael Beck Date: Wed, 28 May 2008 22:47:36 +0000 (+0000) Subject: - moved peephole_IncSP_IncSP() to bepeephole.c, as this is a generic function and... X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=9003bb80f110a064291884dc408221d528686543;p=libfirm - moved peephole_IncSP_IncSP() to bepeephole.c, as this is a generic function and can be used from other BE's [r19817] --- diff --git a/ir/be/bepeephole.c b/ir/be/bepeephole.c index d23779000..3194b4be9 100644 --- a/ir/be/bepeephole.c +++ b/ir/be/bepeephole.c @@ -261,6 +261,58 @@ static void kill_barriers(ir_graph *irg) { skip_barrier(start_blk, irg); } +/* + * Tries to optimize a beIncSp node with it's previous IncSP node. + * Must be run from a be_peephole_opt() context. + */ +void be_peephole_IncSP_IncSP(ir_node *node) +{ + int pred_offs; + int curr_offs; + int offs; + ir_node *pred = be_get_IncSP_pred(node); + ir_node *predpred; + + if (!be_is_IncSP(pred)) + return; + + if (get_irn_n_edges(pred) > 1) + return; + + pred_offs = be_get_IncSP_offset(pred); + curr_offs = be_get_IncSP_offset(node); + + if (pred_offs == BE_STACK_FRAME_SIZE_EXPAND) { + if (curr_offs != BE_STACK_FRAME_SIZE_SHRINK) { + return; + } + offs = 0; + } else if (pred_offs == BE_STACK_FRAME_SIZE_SHRINK) { + if (curr_offs != BE_STACK_FRAME_SIZE_EXPAND) { + return; + } + offs = 0; + } else if (curr_offs == BE_STACK_FRAME_SIZE_EXPAND || + curr_offs == BE_STACK_FRAME_SIZE_SHRINK) { + return; + } else { + offs = curr_offs + pred_offs; + } + + /* add pred offset to ours and remove pred IncSP */ + be_set_IncSP_offset(node, offs); + + predpred = be_get_IncSP_pred(pred); + be_peephole_before_exchange(pred, predpred); + + /* rewire dependency edges */ + edges_reroute_kind(pred, predpred, EDGE_KIND_DEP, current_ir_graph); + be_set_IncSP_pred(node, predpred); + sched_remove(pred); + be_kill_node(pred); + + be_peephole_after_exchange(predpred); +} void be_peephole_opt(be_irg_t *birg) { diff --git a/ir/be/bepeephole.h b/ir/be/bepeephole.h index fdbe39902..cb7dd0b77 100644 --- a/ir/be/bepeephole.h +++ b/ir/be/bepeephole.h @@ -63,6 +63,14 @@ void be_peephole_before_exchange(const ir_node *old_node, ir_node *new_node); */ void be_peephole_after_exchange(ir_node *new_node); +/** + * Tries to optimize a beIncSp node with it's previous IncSP node. + * Must be run from a be_peephole_opt() context. + * + * @param node a be_IncSP node + */ +void be_peephole_IncSP_IncSP(ir_node *node); + /** * Do peephole optimisations. It traverses the schedule of all blocks in * backward direction. The register_values variable indicates which (live) diff --git a/ir/be/ia32/ia32_optimize.c b/ir/be/ia32/ia32_optimize.c index 40735ae65..7d93493d9 100644 --- a/ir/be/ia32/ia32_optimize.c +++ b/ir/be/ia32/ia32_optimize.c @@ -477,58 +477,6 @@ static void peephole_IncSP_Store_to_push(ir_node *irn) be_set_IncSP_pred(irn, curr_sp); } -/** - * Tries to optimize two following IncSP. - */ -static void peephole_IncSP_IncSP(ir_node *node) -{ - int pred_offs; - int curr_offs; - int offs; - ir_node *pred = be_get_IncSP_pred(node); - ir_node *predpred; - - if(!be_is_IncSP(pred)) - return; - - if(get_irn_n_edges(pred) > 1) - return; - - pred_offs = be_get_IncSP_offset(pred); - curr_offs = be_get_IncSP_offset(node); - - if(pred_offs == BE_STACK_FRAME_SIZE_EXPAND) { - if(curr_offs != BE_STACK_FRAME_SIZE_SHRINK) { - return; - } - offs = 0; - } else if(pred_offs == BE_STACK_FRAME_SIZE_SHRINK) { - if(curr_offs != BE_STACK_FRAME_SIZE_EXPAND) { - return; - } - offs = 0; - } else if(curr_offs == BE_STACK_FRAME_SIZE_EXPAND - || curr_offs == BE_STACK_FRAME_SIZE_SHRINK) { - return; - } else { - offs = curr_offs + pred_offs; - } - - /* add pred offset to ours and remove pred IncSP */ - be_set_IncSP_offset(node, offs); - - predpred = be_get_IncSP_pred(pred); - be_peephole_before_exchange(pred, predpred); - - /* rewire dependency edges */ - edges_reroute_kind(pred, predpred, EDGE_KIND_DEP, current_ir_graph); - be_set_IncSP_pred(node, predpred); - sched_remove(pred); - be_kill_node(pred); - - be_peephole_after_exchange(predpred); -} - /** * Find a free GP register if possible, else return NULL. */ @@ -634,7 +582,7 @@ static void peephole_be_IncSP(ir_node *node) int offset; /* first optimize incsp->incsp combinations */ - peephole_IncSP_IncSP(node); + be_peephole_IncSP_IncSP(node); /* transform IncSP->Store combinations to Push where possible */ peephole_IncSP_Store_to_push(node);