diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-01-13 19:31:07 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-01-13 19:31:07 +0000 |
commit | 7903ba8d45607e08baeb937efb4148d6a158ddc3 (patch) | |
tree | 06a6176ca27dc7579e6ac0e20165bd5377d7634a /gcc/genrecog.c | |
parent | 8d7e08bd25626e9dbf6cbb7c2c963d4c763d53d1 (diff) | |
download | gcc-7903ba8d45607e08baeb937efb4148d6a158ddc3.tar.gz |
* genrecog.c (nodes_identical): Expand commentary.
(write_switch): Watch out for identical nodes.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38989 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r-- | gcc/genrecog.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/genrecog.c b/gcc/genrecog.c index 8146b7141b0..80d680a4292 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; |