- sched_foreach_reverse(ret_blk, irn) {
- if (be_is_Barrier(irn)) {
- const ir_edge_t *edge, *next;
+ sched_foreach_reverse(block, irn) {
+ int arity;
+ unsigned *used;
+ size_t n_used;
+ const ir_edge_t *edge, *next;
+
+ if (!be_is_Barrier(irn))
+ continue;
+
+ /* track which outputs are actually used, as we have to create
+ * keep nodes for unused outputs */
+ arity = get_irn_arity(irn);
+ rbitset_alloca(used, arity);
+
+ foreach_out_edge_safe(irn, edge, next) {
+ ir_node *proj = get_edge_src_irn(edge);
+ int pn;
+ ir_node *pred;
+
+ if (is_Anchor(proj))
+ continue;
+
+ pn = (int) get_Proj_proj(proj);
+ pred = get_irn_n(irn, pn);
+
+ rbitset_set(used, pn);