Commit 2cec75a1 by Richard Henderson Committed by Richard Henderson

genrecog.c (nodes_identical): Expand commentary.

        * genrecog.c (nodes_identical): Expand commentary.
        (write_switch): Watch out for identical nodes.

From-SVN: r38989
parent fabfd802
2001-01-13 Richard Henderson <rth@redhat.com>
* genrecog.c (nodes_identical): Expand commentary.
(write_switch): Watch out for identical nodes.
2001-01-13 Neil Booth <neil@daikokuya.demon.co.uk> 2001-01-13 Neil Booth <neil@daikokuya.demon.co.uk>
* cppfiles.c (_cpp_fake_include): New function. * cppfiles.c (_cpp_fake_include): New function.
......
...@@ -1297,7 +1297,9 @@ nodes_identical (d1, d2) ...@@ -1297,7 +1297,9 @@ nodes_identical (d1, d2)
return 0; return 0;
/* Check that their subnodes are at the same position, as any one set /* Check that their subnodes are at the same position, as any one set
of sibling decisions must be at the same position. */ of sibling decisions must be at the same position. Allowing this
requires complications to find_afterward and when change_state is
invoked. */
if (d1->success.first if (d1->success.first
&& d2->success.first && d2->success.first
&& strcmp (d1->success.first->position, d2->success.first->position)) && strcmp (d1->success.first->position, d2->success.first->position))
...@@ -1743,7 +1745,8 @@ write_switch (start, depth) ...@@ -1743,7 +1745,8 @@ write_switch (start, depth)
if (!p->next if (!p->next
|| p->tests->next || p->tests->next
|| p->next->tests->type != type || p->next->tests->type != type
|| p->next->tests->next) || p->next->tests->next
|| nodes_identical_1 (p->tests, p->next->tests))
return p; return p;
/* DT_code is special in that we can do interesting things with /* DT_code is special in that we can do interesting things with
...@@ -1866,6 +1869,14 @@ write_switch (start, depth) ...@@ -1866,6 +1869,14 @@ write_switch (start, depth)
do do
{ {
/* Merge trees will not unify identical nodes if their
sub-nodes are at different levels. Thus we must check
for duplicate cases. */
struct decision *q;
for (q = start; q != p; q = q->next)
if (nodes_identical_1 (p->tests, q->tests))
goto case_done;
if (p != start && p->need_label && needs_label == NULL) if (p != start && p->need_label && needs_label == NULL)
needs_label = p; needs_label = p;
...@@ -1892,7 +1903,8 @@ write_switch (start, depth) ...@@ -1892,7 +1903,8 @@ write_switch (start, depth)
p = p->next; p = p->next;
} }
while (p && p->tests->type == type && !p->tests->next); while (p && p->tests->type == type && !p->tests->next);
case_done:
printf (" default:\n break;\n }\n"); printf (" default:\n break;\n }\n");
return needs_label != NULL ? needs_label : p; return needs_label != NULL ? needs_label : p;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment