aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2000-10-17 14:27:53 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2000-10-17 14:27:53 +0000
commit1651ab853fdd974a1405089804c648e392a3ac72 (patch)
treed2ecd0c60ed67c2846e74417898a4295251bce67 /gcc
parenta9117427517bd43efbde79ff65637f6560e36707 (diff)
downloadgcc-1651ab853fdd974a1405089804c648e392a3ac72.zip
gcc-1651ab853fdd974a1405089804c648e392a3ac72.tar.gz
gcc-1651ab853fdd974a1405089804c648e392a3ac72.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/genrecog.c14
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 15904fa..f29d3b9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-10-17 Alexandre Oliva <aoliva@redhat.com>
+
+ * genrecog.c (write_switch): Return the first condition that needs a
+ label.
+
2000-10-17 Bernd Schmidt <bernds@redhat.co.uk>
* c-tree.h (warn_sequence_point): Move declaration to...
diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index b512181..d143798 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
{