* genrecog.c (nodes_identical): Expand commentary.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 13 Jan 2001 19:31:07 +0000 (19:31 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 13 Jan 2001 19:31:07 +0000 (19:31 +0000)
        (write_switch): Watch out for identical nodes.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38989 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/genrecog.c

index 91d328a..e5d71d9 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
         * cppfiles.c (_cpp_fake_include): New function.
index 8146b71..80d680a 100644 (file)
@@ -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;