return sched_get_time_step(n1) < sched_get_time_step(n2);
}
-#define sched_foreach_from(from, irn) \
- for (ir_node *irn = from; !sched_is_end(irn); irn = sched_next(irn))
+#define sched_foreach_after(after, irn) \
+ for (ir_node *irn = (after); !sched_is_end(irn = sched_next(irn));)
-#define sched_foreach_reverse_from(from, irn) \
- for (ir_node *irn = from; !sched_is_begin(irn); irn = sched_prev(irn))
+#define sched_foreach_reverse_before(before, irn) \
+ for (ir_node *irn = (before); !sched_is_begin(irn = sched_prev(irn));)
/**
* A shorthand macro for iterating over a schedule.
* @param irn A ir node pointer used as an iterator.
*/
#define sched_foreach(block,irn) \
- sched_foreach_from(sched_first(block), irn)
+ sched_foreach_after((assert(is_Block(block)), block), irn)
/**
* A shorthand macro for reversely iterating over a schedule.
* @param irn A ir node pointer used as an iterator.
*/
#define sched_foreach_reverse(block,irn) \
- sched_foreach_reverse_from(sched_last(block), irn)
+ sched_foreach_reverse_before((assert(is_Block(block)), block), irn)
+
+/**
+ * A shorthand macro for iterating over a schedule while the current node may be
+ * removed or replaced.
+ *
+ * @param block The block.
+ * @param irn A ir node pointer used as an iterator.
+ */
+#define sched_foreach_safe(block, irn) \
+ for (ir_node *irn, *irn##__next = sched_first(block); !sched_is_end(irn = irn##__next) ? irn##__next = sched_next(irn), 1 : 0;)
+
+/**
+ * A shorthand macro for reversely iterating over a schedule while the current
+ * node may be removed or replaced.
+ *
+ * @param block The block.
+ * @param irn A ir node pointer used as an iterator.
+ */
+#define sched_foreach_reverse_safe(block, irn) \
+ for (ir_node *irn, *irn##__prev = sched_last(block); !sched_is_begin(irn = irn##__prev) ? irn##__prev = sched_prev(irn), 1 : 0;)
/**
* Type for a function scheduling a graph