summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/except.c6
-rw-r--r--gcc/except.h4
-rw-r--r--gcc/resource.c8
4 files changed, 20 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 084920a5075..80e638c5918 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/except.c b/gcc/except.c
index 627c32ffbf4..db9a58f9851 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -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)
}
/* 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;
{
diff --git a/gcc/except.h b/gcc/except.h
index c02507c8e37..f4db7d2ba03 100644
--- a/gcc/except.h
+++ b/gcc/except.h
@@ -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));
diff --git a/gcc/resource.c b/gcc/resource.c
index 23f5e0e4ead..d84fabeee1d 100644
--- a/gcc/resource.c
+++ b/gcc/resource.c
@@ -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: