+ int n = get_irn_n_edges(node);
+ int n_users;
+ const ir_edge_t *edge;
+
+ if (n <= 1)
+ return 1;
+
+ n_users = 0;
+ foreach_out_edge(node, edge) {
+ ir_node *src = get_edge_src_irn(edge);
+ /* ignore anchor and keep-alive edges */
+ if (is_Anchor(src) || is_End(src))
+ continue;
+ n_users++;
+ }
+
+ return n_users == 1;
+}
+
+/*
+ * Tries to optimize a beIncSP node with its previous IncSP node.
+ * Must be run from a be_peephole_opt() context.
+ */
+ir_node *be_peephole_IncSP_IncSP(ir_node *node)
+{
+ int pred_offs;
+ int curr_offs;
+ int offs;
+ ir_node *pred = be_get_IncSP_pred(node);
+
+ if (!be_is_IncSP(pred))
+ return node;
+
+ if (!be_has_only_one_user(pred))
+ return node;
+
+ pred_offs = be_get_IncSP_offset(pred);
+ curr_offs = be_get_IncSP_offset(node);
+ 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;