flow.c (count_basic_blocks, [...]): Remove last change.
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Sat, 15 Apr 2000 15:20:58 +0000 (15:20 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 15 Apr 2000 15:20:58 +0000 (11:20 -0400)
* flow.c (count_basic_blocks, find_basic_blocks_1): Remove last change.
* optabs.c (emit_libcall_block): If have REG_EHG_REGION, update
region number to -1.

From-SVN: r33164

gcc/ChangeLog
gcc/flow.c
gcc/optabs.c

index 7d752a671b323bee2395fcab3613d50ae96cf62f..2c8a972fc155b6507324a82f6b9fcc8d8b69a417 100644 (file)
@@ -1,3 +1,9 @@
+Sat Apr 15 10:59:19 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * flow.c (count_basic_blocks, find_basic_blocks_1): Remove last change.
+       * optabs.c (emit_libcall_block): If have REG_EHG_REGION, update
+       region number to -1.
+
 2000-04-15  Richard Earnshaw (rearnsah@arm.com)
 
        * emit-rtl.c (unshare_all_rtl_again): Unmark everything, then
index c0583e87f054450ba3e695e8a417846aefa7dac3..9f7537e3aeab6a367845d82649c0851f73a9ff93 100644 (file)
@@ -462,7 +462,6 @@ count_basic_blocks (f)
   register int count = 0;
   int eh_region = 0;
   int call_had_abnormal_edge = 0;
-  int in_libcall = 0;
 
   prev_code = JUMP_INSN;
   for (insn = f; insn; insn = NEXT_INSN (insn))
@@ -473,17 +472,9 @@ count_basic_blocks (f)
          || (GET_RTX_CLASS (code) == 'i'
              && (prev_code == JUMP_INSN
                  || prev_code == BARRIER
-                 || (prev_code == CALL_INSN
-                     && call_had_abnormal_edge && in_libcall == 0))))
+                 || (prev_code == CALL_INSN && call_had_abnormal_edge))))
        count++;
 
-      /* Track whether or not we are in a LIBCALL block.  These must
-        all be within the same basic block.  */
-      if (find_reg_note (insn, REG_LIBCALL, NULL_RTX) != 0)
-       in_libcall++;
-      else if (find_reg_note (insn, REG_RETVAL, NULL_RTX) != 0)
-       in_libcall--;
-
       /* Record whether this call created an edge.  */
       if (code == CALL_INSN)
        {
@@ -538,7 +529,6 @@ find_basic_blocks_1 (f)
   rtx label_value_list = NULL_RTX;
   rtx head = NULL_RTX;
   rtx end = NULL_RTX;
-  int in_libcall = 0;
   
   /* We process the instructions in a slightly different way than we did
      previously.  This is so that we see a NOTE_BASIC_BLOCK after we have
@@ -671,9 +661,8 @@ find_basic_blocks_1 (f)
              call_has_abnormal_edge = 1;
 
            /* A basic block ends at a call that can either throw or
-              do a non-local goto.  LIBCALLs must reside totally in one
-              basic block, so don't end a block after them.  */
-           if (call_has_abnormal_edge && in_libcall == 0)
+              do a non-local goto.  */
+           if (call_has_abnormal_edge)
              {
              new_bb_inclusive:
                if (head == NULL_RTX)
@@ -713,27 +702,21 @@ find_basic_blocks_1 (f)
             we know isn't part of any otherwise visible control flow.  */
             
          for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
-           {
-             if (REG_NOTE_KIND (note) == REG_LABEL)
-               {
-                 rtx lab = XEXP (note, 0), next;
+           if (REG_NOTE_KIND (note) == REG_LABEL)
+             {
+               rtx lab = XEXP (note, 0), next;
 
-                 if (lab == eh_return_stub_label)
-                   ;
-                 else if ((next = next_nonnote_insn (lab)) != NULL
-                          && GET_CODE (next) == JUMP_INSN
-                          && (GET_CODE (PATTERN (next)) == ADDR_VEC
-                              || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC))
+               if (lab == eh_return_stub_label)
                    ;
-                 else
-                   label_value_list
-                     = alloc_EXPR_LIST (0, XEXP (note, 0), label_value_list);
-               }
-             else if (REG_NOTE_KIND (note) == REG_LIBCALL)
-               in_libcall++;
-             else if (REG_NOTE_KIND (note) == REG_RETVAL)
-               in_libcall--;
-           }
+               else if ((next = next_nonnote_insn (lab)) != NULL
+                        && GET_CODE (next) == JUMP_INSN
+                        && (GET_CODE (PATTERN (next)) == ADDR_VEC
+                            || GET_CODE (PATTERN (next)) == ADDR_DIFF_VEC))
+                 ;
+               else
+                 label_value_list
+                   = alloc_EXPR_LIST (0, XEXP (note, 0), label_value_list);
+             }
        }
     }
 
index 85bb24eae616840fb3346af3d4cd534f7319b788..5f2a76ad9b9757d75db9468dd2162dc48a7143f1 100644 (file)
@@ -2758,19 +2758,21 @@ emit_libcall_block (insns, target, result, equiv)
   rtx prev, next, first, last, insn;
 
   /* look for any CALL_INSNs in this sequence, and attach a REG_EH_REGION
-     reg note to indicate that this call cannot throw. (Unless there is
-     already a REG_EH_REGION note.) */
+     reg note to indicate that this call cannot throw or execute a nonlocal
+     goto. (Unless there is already a REG_EH_REGION note, in which case
+     we update it.)  */
 
   for (insn = insns; insn; insn = NEXT_INSN (insn))
-    {
-      if (GET_CODE (insn) == CALL_INSN)
-        {
-          rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
-          if (note == NULL_RTX)
-            REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EH_REGION, GEN_INT (-1),
-                                                  REG_NOTES (insn));
-        }
-    }
+    if (GET_CODE (insn) == CALL_INSN)
+      {
+       rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
+
+       if (note != 0)
+         XEXP (note, 0) = GEN_INT (-1);
+       else
+         REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EH_REGION, GEN_INT (-1),
+                                               REG_NOTES (insn));
+      }
 
   /* First emit all insns that set pseudos.  Remove them from the list as
      we go.  Avoid insns that set pseudos which were referenced in previous