except.h (can_throw): Declare it.
authorMark Mitchell <mark@codesourcery.com>
Thu, 25 May 2000 23:43:43 +0000 (23:43 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 25 May 2000 23:43:43 +0000 (23:43 +0000)
* except.h (can_throw): Declare it.
* except.c (can_throw): Give it external linkage.
* resource.c (find_dead_or_set_registers): Use can_throw.

From-SVN: r34178

gcc/ChangeLog
gcc/except.c
gcc/except.h
gcc/resource.c

index 084920a..80e638c 100644 (file)
@@ -1,3 +1,9 @@
+2000-05-25  Mark Mitchell  <mark@codesourcery.com>
+
+       * except.h (can_throw): Declare it.
+       * except.c (can_throw): Give it external linkage.
+       * resource.c (find_dead_or_set_registers): Use can_throw.
+       
 2000-05-25  Richard Henderson  <rth@cygnus.com>
 
        * flow.c (mark_set_1): Don't record conditionally dead memory.
index 627c32f..db9a58f 100644 (file)
@@ -463,7 +463,6 @@ static void start_dynamic_cleanup   PARAMS ((tree, tree));
 static void start_dynamic_handler      PARAMS ((void));
 static void expand_rethrow     PARAMS ((rtx));
 static void output_exception_table_entry       PARAMS ((FILE *, int));
-static int can_throw           PARAMS ((rtx));
 static rtx scan_region         PARAMS ((rtx, int, int *));
 static void eh_regs            PARAMS ((rtx *, rtx *, rtx *, int));
 static void set_insn_eh_region PARAMS ((rtx *, int));
@@ -2688,12 +2687,11 @@ free_eh_status (f)
 }
 \f
 /* This section is for the exception handling specific optimization
-   pass.  First are the internal routines, and then the main
-   optimization pass.  */
+   pass.  */
 
 /* Determine if the given INSN can throw an exception.  */
 
-static int
+int
 can_throw (insn)
      rtx insn;
 {
index c02507c..f4db7d2 100644 (file)
@@ -439,6 +439,10 @@ extern struct label_node *outer_context_label_stack;
 
 extern rtx exception_handler_labels;
 
+/* Determine if the given INSN can throw an exception.  */
+
+extern int can_throw                            PARAMS ((rtx));
+
 /* Return nonzero if nothing in this function can throw.  */
 
 extern int nothrow_function_p                  PARAMS ((void));
index 23f5e0e..d84fabe 100644 (file)
@@ -422,6 +422,14 @@ find_dead_or_set_registers (target, res, jump_target, jump_count, set, needed)
       rtx this_jump_insn = insn;
 
       next = NEXT_INSN (insn);
+
+      /* If this instruction can throw an exception, then we don't
+        know where we might end up next.  That means that we have to
+        assume that whatever we have already marked as live really is
+        live.  */
+      if (can_throw (insn))
+       break;
+
       switch (GET_CODE (insn))
        {
        case CODE_LABEL: