besched: Add and use sched_foreach_safe().
[libfirm] / ir / be / besched.h
index 15e0996..aa8c314 100644 (file)
@@ -1,20 +1,6 @@
 /*
- * Copyright (C) 1995-2010 University of Karlsruhe.  All right reserved.
- *
  * This file is part of libFirm.
- *
- * This file may be distributed and/or modified under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation and appearing in the file LICENSE.GPL included in the
- * packaging of this file.
- *
- * Licensees holding valid libFirm Professional Edition licenses may use
- * this file in accordance with the libFirm Commercial License.
- * Agreement provided with the Software.
- *
- * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE.
+ * Copyright (C) 2012 University of Karlsruhe.
  */
 
 /**
@@ -170,11 +156,11 @@ static inline bool sched_comes_after(const ir_node *n1, const ir_node *n2)
        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.
@@ -182,7 +168,7 @@ static inline bool sched_comes_after(const ir_node *n1, const ir_node *n2)
  * @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.
@@ -190,7 +176,17 @@ static inline bool sched_comes_after(const ir_node *n1, const ir_node *n2)
  * @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;)
 
 /**
  * Type for a function scheduling a graph