From: David Given Date: Mon, 10 Oct 2016 21:18:37 +0000 (+0200) Subject: D'oh, need multiple passes over the edge splitter in order to properly find all X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=a4d06d1795ddec398ade72a423c6e0a9dc2dcb6f;p=ack.git D'oh, need multiple passes over the edge splitter in order to properly find all cases. --- diff --git a/mach/proto/mcg/pass_splitcriticaledges.c b/mach/proto/mcg/pass_splitcriticaledges.c index 7962974cc..38628d995 100644 --- a/mach/proto/mcg/pass_splitcriticaledges.c +++ b/mach/proto/mcg/pass_splitcriticaledges.c @@ -63,29 +63,44 @@ static void split_edge(struct basicblock* source, struct basicblock* sink) array_append(¤t_proc->blocks, bb); } -static void consider_edges_leading_to(struct basicblock* bb) +static bool consider_edges_leading_from(struct basicblock* bb) { - if (bb->prevs.count > 1) + bool changed = false; + + if (bb->nexts.count > 1) { int i; - for (i=0; iprevs.count; i++) + for (i=0; inexts.count; i++) { - struct basicblock* prev = bb->prevs.item[i]; - if (prev->nexts.count > 1) - split_edge(prev, bb); + struct basicblock* next = bb->nexts.item[i]; + if (next->prevs.count > 1) + { + split_edge(bb, next); + changed = true; + } } } + + return changed; } void pass_split_critical_edges(struct procedure* proc) { int i; + bool changed; current_proc = proc; - for (i=0; iblocks.count; i++) - consider_edges_leading_to(proc->blocks.item[i]); + do + { + changed = false; + + for (i=0; iblocks.count; i++) + changed |= consider_edges_leading_from(proc->blocks.item[i]); + + } + while (changed); } /* vim: set sw=4 ts=4 expandtab : */