[PATCH] Resurrect toplevel bootstrap

Zack Weinberg zack@codesourcery.com
Wed Aug 18 01:21:00 GMT 2004


Zack Weinberg <zack@codesourcery.com> writes:

> I've reproduced #17066 and will try to come up with a patch.  I can't
> conveniently test arm-elf, so if you'd be willing to test my patch for
> me, Richard?

Here's the patch.  It just performs inline the same operation that the
recursive call to do_jump used to accomplish.  Note that Paolo's patch
removed all the uses of drop_through_label; we need it here (it might
be possible to avoid somehow, but I'm not clever enough to think of a
way) so I've compressed it into the unordered_bcc block.

zw

        * dojump.c (do_jump <unordered_bcc>): Do not recursively call
        self with a TRUTH_ORIF_EXPR; generate the appropriate jump
        sequence inline.  Move drop_through_label code into this
        block, being the only place it is used.  Adjust comments.

===================================================================
Index: dojump.c
--- dojump.c	17 Aug 2004 07:27:16 -0000	1.27
+++ dojump.c	18 Aug 2004 01:08:48 -0000
@@ -149,19 +149,12 @@ prefer_and_bit_test (enum machine_mode m
 
    do_jump always does any pending stack adjust except when it does not
    actually perform a jump.  An example where there is no jump
-   is when EXP is `(foo (), 0)' and IF_FALSE_LABEL is null.
-
-   This function is responsible for optimizing cases such as
-   &&, || and comparison operators in EXP.  */
+   is when EXP is `(foo (), 0)' and IF_FALSE_LABEL is null.  */
 
 void
 do_jump (tree exp, rtx if_false_label, rtx if_true_label)
 {
   enum tree_code code = TREE_CODE (exp);
-  /* Some cases need to create a label to jump to
-     in order to properly fall through.
-     These cases set DROP_THROUGH_LABEL nonzero.  */
-  rtx drop_through_label = 0;
   rtx temp;
   int i;
   tree type;
@@ -448,13 +441,23 @@ do_jump (tree exp, rtx if_false_label, r
             tree op0 = save_expr (TREE_OPERAND (exp, 0));
             tree op1 = save_expr (TREE_OPERAND (exp, 1));
             tree cmp0, cmp1;
+	    rtx drop_through_label = 0;
 
             /* If the target doesn't support combined unordered
                compares, decompose into two comparisons.  */
+	    if (if_true_label == 0)
+	      drop_through_label = if_true_label = gen_label_rtx ();
+	      
             cmp0 = fold (build2 (tcode1, TREE_TYPE (exp), op0, op1));
             cmp1 = fold (build2 (tcode2, TREE_TYPE (exp), op0, op1));
-            exp = build2 (TRUTH_ORIF_EXPR, TREE_TYPE (exp), cmp0, cmp1);
-            do_jump (exp, if_false_label, if_true_label);
+	    do_jump (cmp0, 0, if_true_label);
+	    do_jump (cmp1, if_false_label, if_true_label);
+
+	    if (drop_through_label)
+	      {
+		do_pending_stack_adjust ();
+		emit_label (drop_through_label);
+	      }
           }
       }
       break;
@@ -528,15 +531,6 @@ do_jump (tree exp, rtx if_false_label, r
       else
         abort ();
     }
-
-  if (drop_through_label)
-    {
-      /* If do_jump produces code that might be jumped around,
-         do any stack adjusts from that code, before the place
-         where control merges in.  */
-      do_pending_stack_adjust ();
-      emit_label (drop_through_label);
-    }
 }
 
 /* Given a comparison expression EXP for values too wide to be compared



More information about the Gcc-patches mailing list