- moved peephole_IncSP_IncSP() to bepeephole.c, as this is a generic function and...
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 28 May 2008 22:47:36 +0000 (22:47 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 28 May 2008 22:47:36 +0000 (22:47 +0000)
[r19817]

ir/be/bepeephole.c
ir/be/bepeephole.h
ir/be/ia32/ia32_optimize.c

index d237790..3194b4b 100644 (file)
@@ -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)
 {
index fdbe399..cb7dd0b 100644 (file)
@@ -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)
index 40735ae..7d93493 100644 (file)
@@ -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);