aboutsummaryrefslogtreecommitdiff
path: root/gcc/genrecog.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-01-13 11:31:07 -0800
committerRichard Henderson <rth@gcc.gnu.org>2001-01-13 11:31:07 -0800
commit2cec75a1bd9efacb57c9c262af45e32fd712b2dc (patch)
tree06a6176ca27dc7579e6ac0e20165bd5377d7634a /gcc/genrecog.c
parentfabfd8029dc23051d9bc8c914583b2adeaef8a3b (diff)
downloadgcc-2cec75a1bd9efacb57c9c262af45e32fd712b2dc.zip
gcc-2cec75a1bd9efacb57c9c262af45e32fd712b2dc.tar.gz
gcc-2cec75a1bd9efacb57c9c262af45e32fd712b2dc.tar.bz2
genrecog.c (nodes_identical): Expand commentary.
* genrecog.c (nodes_identical): Expand commentary. (write_switch): Watch out for identical nodes. From-SVN: r38989
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r--gcc/genrecog.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index 8146b71..80d680a 100644
--- a/gcc/genrecog.c
+++ b/gcc/genrecog.c
@@ -1297,7 +1297,9 @@ nodes_identical (d1, d2)
return 0;
/* 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
&& d2->success.first
&& strcmp (d1->success.first->position, d2->success.first->position))
@@ -1743,7 +1745,8 @@ write_switch (start, depth)
if (!p->next
|| p->tests->next
|| p->next->tests->type != type
- || p->next->tests->next)
+ || p->next->tests->next
+ || nodes_identical_1 (p->tests, p->next->tests))
return p;
/* DT_code is special in that we can do interesting things with
@@ -1866,6 +1869,14 @@ write_switch (start, depth)
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)
needs_label = p;
@@ -1892,7 +1903,8 @@ write_switch (start, depth)
p = p->next;
}
while (p && p->tests->type == type && !p->tests->next);
-
+
+ case_done:
printf (" default:\n break;\n }\n");
return needs_label != NULL ? needs_label : p;