From b7908561f0eedb4fd052a2c5396f33e0883dfa5d Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Fri, 14 Dec 2012 09:33:52 +0100 Subject: [PATCH] besched: Add and use sched_foreach_reverse_safe(). --- ir/be/amd64/bearch_amd64.c | 5 +---- ir/be/arm/bearch_arm.c | 5 +---- ir/be/besched.h | 10 ++++++++++ ir/be/ia32/bearch_ia32.c | 5 +---- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/ir/be/amd64/bearch_amd64.c b/ir/be/amd64/bearch_amd64.c index 72cfb0485..3045a5fd0 100644 --- a/ir/be/amd64/bearch_amd64.c +++ b/ir/be/amd64/bearch_amd64.c @@ -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)) { diff --git a/ir/be/arm/bearch_arm.c b/ir/be/arm/bearch_arm.c index 57e1fea66..65f9ebeb5 100644 --- a/ir/be/arm/bearch_arm.c +++ b/ir/be/arm/bearch_arm.c @@ -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)) { diff --git a/ir/be/besched.h b/ir/be/besched.h index aa8c314ac..eb7907d1f 100644 --- a/ir/be/besched.h +++ b/ir/be/besched.h @@ -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 */ diff --git a/ir/be/ia32/bearch_ia32.c b/ir/be/ia32/bearch_ia32.c index 41f0e2c11..2592c0ce6 100644 --- a/ir/be/ia32/bearch_ia32.c +++ b/ir/be/ia32/bearch_ia32.c @@ -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)) { -- 2.20.1