+ int pred_offs;
+ int curr_offs;
+ int offs;
+ ir_node *pred = be_get_IncSP_pred(node);
+
+ if (!be_is_IncSP(pred))
+ return node;
+
+ if (!has_only_one_user(pred))
+ return node;
+
+ 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 node;
+ }
+ offs = 0;
+ } else if (pred_offs == BE_STACK_FRAME_SIZE_SHRINK) {
+ if (curr_offs != BE_STACK_FRAME_SIZE_EXPAND) {
+ return node;
+ }
+ offs = 0;
+ } else if (curr_offs == BE_STACK_FRAME_SIZE_EXPAND ||
+ curr_offs == BE_STACK_FRAME_SIZE_SHRINK) {
+ return node;
+ } else {
+ offs = curr_offs + pred_offs;
+ }
+
+ /* add node offset to pred and remove our IncSP */
+ be_set_IncSP_offset(pred, offs);
+
+ be_peephole_exchange(node, pred);
+ return pred;
+}
+
+void be_peephole_opt(ir_graph *irg)
+{
+ unsigned n_classes;
+ unsigned i;