diff options
author | Richard Henderson <rth@redhat.com> | 2001-01-13 11:31:07 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2001-01-13 11:31:07 -0800 |
commit | 2cec75a1bd9efacb57c9c262af45e32fd712b2dc (patch) | |
tree | 06a6176ca27dc7579e6ac0e20165bd5377d7634a /gcc/genrecog.c | |
parent | fabfd8029dc23051d9bc8c914583b2adeaef8a3b (diff) | |
download | gcc-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.c | 18 |
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; |