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
This commit is contained in:
Alexandre Oliva 2000-10-17 14:27:53 +00:00 committed by Alexandre Oliva
parent a911742751
commit 1651ab853f
2 changed files with 17 additions and 2 deletions

View File

@ -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...

View File

@ -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
{