From 0519ce3019d4a288ca12c3ac21086f2f0cb5e28d Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Thu, 25 May 2000 23:43:43 +0000 Subject: [PATCH] except.h (can_throw): Declare it. * 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 | 6 ++++++ gcc/except.c | 6 ++---- gcc/except.h | 4 ++++ gcc/resource.c | 8 ++++++++ 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 + + * 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 * 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: