- when a graph is lowered because of struct return changes, transform
[libfirm] / ir / be / bepeephole.c
index c9bb6e3..c8869dd 100644 (file)
@@ -298,8 +298,31 @@ static void        kill_barriers(ir_graph *irg) {
        skip_barrier(start_blk, irg);
 }
 
+/**
+ * Check whether the node has only one user.  Explicitly ignore the anchor.
+ */
+static int has_only_one_user(ir_node *node)
+{
+       int              n = get_irn_n_edges(node);
+       const ir_edge_t *edge;
+
+       if (n <= 1)
+               return 1;
+
+       if (n > 2)
+               return 0;
+
+       foreach_out_edge(node, edge) {
+               ir_node *src = get_edge_src_irn(edge);
+               if (is_Anchor(src))
+                       return 1;
+       }
+
+       return 0;
+}
+
 /*
- * Tries to optimize a beIncSp node with it's previous IncSP node.
+ * 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)
@@ -312,7 +335,7 @@ ir_node *be_peephole_IncSP_IncSP(ir_node *node)
        if (!be_is_IncSP(pred))
                return node;
 
-       if (get_irn_n_edges(pred) > 1)
+       if (!has_only_one_user(pred))
                return node;
 
        pred_offs = be_get_IncSP_offset(pred);
@@ -361,11 +384,11 @@ void be_peephole_opt(be_irg_t *birg)
        lv       = be_get_birg_liveness(birg);
 
        n_classes = arch_env_get_n_reg_class(arch_env);
-       register_values = alloca(sizeof(register_values[0]) * n_classes);
+       register_values = ALLOCAN(ir_node**, n_classes);
        for(i = 0; i < n_classes; ++i) {
                const arch_register_class_t *cls    = arch_env_get_reg_class(arch_env, i);
                unsigned                     n_regs = arch_register_class_n_regs(cls);
-               register_values[i] = alloca(sizeof(ir_node*) * n_regs);
+               register_values[i] = ALLOCAN(ir_node*, n_regs);
        }
 
        irg_block_walk_graph(irg, process_block, NULL, NULL);