- foreach_out_edge (perm, edge) {
- ir_node *proj = get_edge_src_irn(edge);
- int nr = get_Proj_proj(proj);
- ir_node *op = get_irn_n(perm, nr);
-
- assert(nr < n);
-
- /* we will need the last Proj as an insertion point
- * for the instruction(s) pushed through the Perm */
- if (sched_comes_after(last_proj, proj))
- last_proj = proj;
-
- projs[nr] = proj;
-
- 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;
+ ir_node *node = sched_prev(perm);
+ n_moved = 0;
+ while(!sched_is_begin(node)) {
+ int input = -1;
+ ir_node *proj;
+
+ foreach_out_edge(perm, edge) {
+ ir_node *out = get_edge_src_irn(edge);
+ int pn = get_Proj_proj(out);
+ ir_node *in = get_irn_n(perm, pn);
+ if(node == in) {
+ proj = out;
+ input = pn;
+ break;