besched: Add and use sched_foreach_reverse_safe().
authorChristoph Mallon <christoph.mallon@gmx.de>
Fri, 14 Dec 2012 08:33:52 +0000 (09:33 +0100)
committerChristoph Mallon <christoph.mallon@gmx.de>
Fri, 14 Dec 2012 23:11:05 +0000 (00:11 +0100)
ir/be/amd64/bearch_amd64.c
ir/be/arm/bearch_arm.c
ir/be/besched.h
ir/be/ia32/bearch_ia32.c

index 72cfb04..3045a5f 100644 (file)
@@ -166,12 +166,9 @@ static void transform_Spill(ir_node *node)
 
 static void amd64_after_ra_walker(ir_node *block, void *data)
 {
-       ir_node *node, *prev;
        (void) data;
 
-       for (node = sched_last(block); !sched_is_begin(node); node = prev) {
-               prev = sched_prev(node);
-
+       sched_foreach_reverse_safe(block, node) {
                if (be_is_Reload(node)) {
                        transform_Reload(node);
                } else if (be_is_Spill(node)) {
index 57e1fea..65f9ebe 100644 (file)
@@ -209,12 +209,9 @@ static void transform_Spill(ir_node *node)
 
 static void arm_after_ra_walker(ir_node *block, void *data)
 {
-       ir_node *node, *prev;
        (void) data;
 
-       for (node = sched_last(block); !sched_is_begin(node); node = prev) {
-               prev = sched_prev(node);
-
+       sched_foreach_reverse_safe(block, node) {
                if (be_is_Reload(node)) {
                        transform_Reload(node);
                } else if (be_is_Spill(node)) {
index aa8c314..eb7907d 100644 (file)
@@ -188,6 +188,16 @@ static inline bool sched_comes_after(const ir_node *n1, const ir_node *n2)
 #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
  */
index 41f0e2c..2592c0c 100644 (file)
@@ -893,13 +893,10 @@ static void transform_MemPerm(ir_node *node)
  */
 static void ia32_after_ra_walker(ir_node *block, void *env)
 {
-       ir_node *node, *prev;
        (void) env;
 
        /* beware: the schedule is changed here */
-       for (node = sched_last(block); !sched_is_begin(node); node = prev) {
-               prev = sched_prev(node);
-
+       sched_foreach_reverse_safe(block, node) {
                if (be_is_Reload(node)) {
                        transform_to_Load(node);
                } else if (be_is_Spill(node)) {