genrecog.c (write_switch): Return the first condition that needs a label.
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 17 Oct 2000 14:27:53 +0000 (14:27 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 17 Oct 2000 14:27:53 +0000 (14:27 +0000)
* genrecog.c (write_switch): Return the first condition that needs a
label.

From-SVN: r36903

gcc/ChangeLog
gcc/genrecog.c

index 15904fab2dcbc30373ef170af21682853802d6e1..f29d3b9b2bd02659d2b07dbb507956c60a521c2b 100644 (file)
@@ -1,3 +1,8 @@
+2000-10-17  Alexandre Oliva  <aoliva@redhat.com>
+
+       * genrecog.c (write_switch): Return the first condition that needs a
+       label.
+
 2000-10-17  Bernd Schmidt  <bernds@redhat.co.uk>
 
        * c-tree.h (warn_sequence_point): Move declaration to...
index b512181e10db31fc29131e4a6411a12636f48adc..d14379889475f872e50433e563ece5f3d567d753 100644 (file)
@@ -1650,6 +1650,7 @@ write_switch (start, depth)
 {
   struct decision *p = start;
   enum decision_type type = p->tests->type;
+  struct decision *needs_label = NULL;
 
   /* If we have two or more nodes in sequence that test the same one
      thing, we may be able to use a switch statement.  */
@@ -1674,6 +1675,9 @@ write_switch (start, depth)
       code = p->tests->u.code;
       do 
        {
+         if (p != start && p->need_label && needs_label == NULL)
+           needs_label = p;
+
          printf ("    case ");
          print_code (code);
          printf (":\n      goto L%d;\n", p->success.first->number);
@@ -1697,7 +1701,10 @@ write_switch (start, depth)
         we don't actually write the test here, as it gets kinda messy.
         It is trivial to leave this to later by telling our caller that
         we only processed the CODE tests.  */
-      ret = p;
+      if (needs_label != NULL)
+       ret = needs_label;
+      else
+       ret = p;
 
       while (p && p->tests->type == DT_pred
             && p->tests->u.pred.index >= 0)
@@ -1774,6 +1781,9 @@ write_switch (start, depth)
 
       do
        {
+         if (p != start && p->need_label && needs_label == NULL)
+           needs_label = p;
+
          printf ("    case ");
          switch (type)
            {
@@ -1800,7 +1810,7 @@ write_switch (start, depth)
       
       printf ("    default:\n      break;\n    }\n");
 
-      return p;
+      return needs_label != NULL ? needs_label : p;
     }
   else
     {