From 2ea7f6345ba7064d6f5ff69b88e0047f1d9c432c Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Wed, 11 Jul 2007 10:07:02 +0000 Subject: [PATCH] moved the fixpoint iteration of the current node from optimize_graph() to transform_node(), a more logical place [r15025] --- ir/ir/irgopt.c | 18 ++++++------------ ir/ir/iropt.c | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/ir/ir/irgopt.c b/ir/ir/irgopt.c index cad60d63a..8e306ec9e 100644 --- a/ir/ir/irgopt.c +++ b/ir/ir/irgopt.c @@ -169,19 +169,13 @@ static void enqueue_users(ir_node *n, pdeq *waitq) { static void opt_walker(ir_node *n, void *env) { pdeq *waitq = env; ir_node *optimized; - ir_node *oldn = n; - - for (;;) { - optimized = optimize_in_place_2(n); - set_irn_link(optimized, NULL); - if (optimized == n) - break; - n = optimized; - } - if (optimized != oldn) { - enqueue_users(oldn, waitq); - exchange(oldn, optimized); + optimized = optimize_in_place_2(n); + set_irn_link(optimized, NULL); + + if (optimized != n) { + enqueue_users(n, waitq); + exchange(n, optimized); } } diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 7198ae739..29056bb77 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -3580,8 +3580,19 @@ static ir_node *transform_node_Psi(ir_node *n) { * not be freed even if the equivalent node isn't the old one. */ static ir_node *transform_node(ir_node *n) { - if (n->op->ops.transform_node) - n = n->op->ops.transform_node(n); + ir_node *oldn; + + /* + * Transform_node is the only "optimizing transformation" that might + * return a node with a different opcode. We iterate HERE until fixpoint + * to get the final result. + */ + do { + oldn = n; + if (n->op->ops.transform_node) + n = n->op->ops.transform_node(n); + } while (oldn != n); + return n; } /* transform_node */ -- 2.20.1