From 1651ab853fdd974a1405089804c648e392a3ac72 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Tue, 17 Oct 2000 14:27:53 +0000 Subject: [PATCH] genrecog.c (write_switch): Return the first condition that needs a label. * genrecog.c (write_switch): Return the first condition that needs a label. From-SVN: r36903 --- gcc/ChangeLog | 5 +++++ gcc/genrecog.c | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 15904fab2dcb..f29d3b9b2bd0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-10-17 Alexandre Oliva + + * genrecog.c (write_switch): Return the first condition that needs a + label. + 2000-10-17 Bernd Schmidt * c-tree.h (warn_sequence_point): Move declaration to... diff --git a/gcc/genrecog.c b/gcc/genrecog.c index b512181e10db..d14379889475 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -1650,6 +1650,7 @@ write_switch (start, depth) { struct decision *p = start; enum decision_type type = p->tests->type; + struct decision *needs_label = NULL; /* If we have two or more nodes in sequence that test the same one thing, we may be able to use a switch statement. */ @@ -1674,6 +1675,9 @@ write_switch (start, depth) code = p->tests->u.code; do { + if (p != start && p->need_label && needs_label == NULL) + needs_label = p; + printf (" case "); print_code (code); printf (":\n goto L%d;\n", p->success.first->number); @@ -1697,7 +1701,10 @@ write_switch (start, depth) we don't actually write the test here, as it gets kinda messy. It is trivial to leave this to later by telling our caller that we only processed the CODE tests. */ - ret = p; + if (needs_label != NULL) + ret = needs_label; + else + ret = p; while (p && p->tests->type == DT_pred && p->tests->u.pred.index >= 0) @@ -1774,6 +1781,9 @@ write_switch (start, depth) do { + if (p != start && p->need_label && needs_label == NULL) + needs_label = p; + printf (" case "); switch (type) { @@ -1800,7 +1810,7 @@ write_switch (start, depth) printf (" default:\n break;\n }\n"); - return p; + return needs_label != NULL ? needs_label : p; } else {