From ff91d3ca1053b9409de7713276a2a6efd5c75da8 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Fri, 26 Aug 2005 12:02:46 +0000 Subject: [PATCH] BugFix: in place_late, do NOT count keep-alive edges as consuming ones, or nodes might be placed wrong! [r6508] --- ir/ir/irgopt.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ir/ir/irgopt.c b/ir/ir/irgopt.c index 239768580..0ec7ad266 100644 --- a/ir/ir/irgopt.c +++ b/ir/ir/irgopt.c @@ -1714,18 +1714,25 @@ place_floats_late(ir_node *n, pdeq *worklist) dominator tree of all nodes' blocks depending on us; our final placement has to dominate DCA. */ - for (i = 0; i < get_irn_n_outs(n); ++i) { + for (i = get_irn_n_outs(n) - 1; i >= 0; --i) { ir_node *out = get_irn_out(n, i); + if (get_irn_op(out) == op_End) { + /* + * This consumer is the End node, a keep alive edge. + * This is not a real consumer, so we ignore it + */ + continue; + } + /* ignore if out is in dead code */ - ir_node *outbl = get_nodes_block(out); + ir_node *outbl = get_irn_n(out, -1); if (is_Block_unreachable(outbl)) continue; dca = consumer_dom_dca(dca, out, n); } if (dca) { set_nodes_block(n, dca); - move_out_of_loops (n, early); } /* else all outs are in dead code */ -- 2.20.1