never move around flag mofying nodes
[libfirm] / ir / be / belower.c
index b8e9cdd..7ba31cf 100644 (file)
@@ -350,11 +350,6 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
                                set_Proj_proj(pairs[i].out_node, get_Proj_proj(pairs[i].in_node));
                        }
 
-#ifdef SCHEDULE_PROJS
-                       /* remove the proj from the schedule */
-                       sched_remove(pairs[i].out_node);
-#endif
-
                        /* reroute the edges from the proj to the argument */
                        exchange(pairs[i].out_node, pairs[i].in_node);
                        //edges_reroute(pairs[i].out_node, pairs[i].in_node, env->birg->irg);
@@ -466,25 +461,12 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
                                        /* set as in for next Perm */
                                        pairs[pidx].in_node = res1;
                                }
-                               else {
-#ifdef SCHEDULE_PROJS
-                                       sched_remove(res1);
-#endif
-                               }
-
-#ifdef SCHEDULE_PROJS
-                               sched_remove(res2);
-#endif
 
                                set_Proj_pred(res2, cpyxchg);
                                set_Proj_proj(res2, 0);
                                set_Proj_pred(res1, cpyxchg);
                                set_Proj_proj(res1, 1);
 
-#ifdef SCHEDULE_PROJS
-                               sched_add_after(sched_point, res1);
-                               sched_add_after(sched_point, res2);
-#endif
                                arch_set_irn_register(arch_env, res2, cycle->elems[i + 1]);
                                arch_set_irn_register(arch_env, res1, cycle->elems[i]);
 
@@ -504,10 +486,6 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
                                arch_set_irn_register(arch_env, cpyxchg, cycle->elems[i + 1]);
                                n_ops++;
 
-#ifdef SCHEDULE_PROJS
-                               /* remove the proj from the schedule */
-                               sched_remove(res2);
-#endif
                                /* exchange copy node and proj */
                                exchange(res2, cpyxchg);
 
@@ -962,6 +940,11 @@ found_front:
                bitset_set(keep, nr);
                if (!is_Proj(op) && get_nodes_block(op) == bl
                                && (op == frontier || sched_comes_after(frontier, op))) {
+                       /* don't move around nodes that modifies the flags */
+                       if (arch_irn_is(aenv, op, modify_flags)) {
+                               continue;
+                       }
+
                        for (i = get_irn_arity(op) - 1; i >= 0; --i) {
                                ir_node *opop = get_irn_n(op, i);
                                if (!arch_irn_consider_in_reg_alloc(aenv, cls, opop)) {
@@ -1006,11 +989,6 @@ found_front:
                        /* reroute all users of the proj to the moved node. */
                        edges_reroute(proj, move, irg);
 
-#ifdef SCHEDULE_PROJS
-                       /* remove the proj from the schedule. */
-                       sched_remove(proj);
-#endif
-
                        /* and like it to bad so it is no more in the use array of the perm */
                        set_Proj_pred(proj, get_irg_bad(irg));
 
@@ -1032,15 +1010,18 @@ found_front:
  * @param walk_env The walker environment
  */
 static void lower_nodes_after_ra_walker(ir_node *irn, void *walk_env) {
-       if (! is_Block(irn) && ! is_Proj(irn)) {
-               if (be_is_Perm(irn)) {
-                       int perm_stayed = push_through_perm(irn, walk_env);
-                       if (perm_stayed)
-                               lower_perm_node(irn, walk_env);
-               }
-       }
+       int perm_stayed;
 
-       return;
+       if (is_Block(irn) || is_Proj(irn))
+               return;
+       if (!be_is_Perm(irn))
+               return;
+
+       perm_stayed = push_through_perm(irn, walk_env);
+       if (!perm_stayed)
+               return;
+
+       lower_perm_node(irn, walk_env);
 }
 
 /**