+ if(store == NULL || is_Bad(store))
+ break;
+
+ val = get_irn_n(store, 2);
+ mem = get_irn_n(store, 3);
+ spreg = arch_get_irn_register(cg->arch_env, curr_sp);
+
+ // create a push
+ push = new_rd_ia32_Push(NULL, irg, block, noreg, noreg, val, curr_sp, mem);
+ if(get_ia32_immop_type(store) != ia32_ImmNone) {
+ copy_ia32_Immop_attr(push, store);
+ }
+ sched_add_before(irn, push);
+
+ // create stackpointer proj
+ curr_sp = new_r_Proj(irg, block, push, spmode, pn_ia32_Push_stack);
+ arch_set_irn_register(cg->arch_env, curr_sp, spreg);
+ sched_add_before(irn, curr_sp);
+
+ // rewire memprojs of the store
+ foreach_out_edge_safe(store, edge, next) {
+ ir_node *succ = get_edge_src_irn(edge);
+
+ assert(is_Proj(succ) && get_Proj_proj(succ) == pn_ia32_Store_M);
+ set_irn_n(succ, 0, push);
+ }
+
+ // we can remove the store now
+ set_irn_n(store, 0, new_Bad());
+ set_irn_n(store, 1, new_Bad());
+ set_irn_n(store, 2, new_Bad());
+ set_irn_n(store, 3, new_Bad());
+ sched_remove(store);
+
+ offset -= 4;
+ }
+
+ be_set_IncSP_offset(irn, offset);
+
+ // can we remove the IncSP now?
+ if(offset == 0) {
+ const ir_edge_t *edge, *next;
+
+ foreach_out_edge_safe(irn, edge, next) {
+ ir_node *arg = get_edge_src_irn(edge);
+ int pos = get_edge_src_pos(edge);
+
+ set_irn_n(arg, pos, curr_sp);
+ }
+
+ set_irn_n(irn, 0, new_Bad());
+ sched_remove(irn);
+ } else {
+ set_irn_n(irn, 0, curr_sp);
+ }