From 29c246a7a7c5a90aa45a58924ddd1d6f67d1ba18 Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Mon, 26 Apr 2004 03:17:08 +0000 Subject: [PATCH] re PR bootstrap/15141 (MMIX breakage in except.c:connect_post_landing_pads:handle insns after actual call insn) PR bootstrap/15141 * except.c (connect_post_landing_pads): Delete insns after the barrier when generating a unwind_resume_libfunc call. From-SVN: r81176 --- gcc/ChangeLog | 6 ++++++ gcc/except.c | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b74866cd47a6..f9f097fe2428 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-04-26 Hans-Peter Nilsson + + PR bootstrap/15141 + * except.c (connect_post_landing_pads): Delete insns after the + barrier when generating a unwind_resume_libfunc call. + 2004-04-25 Richard Kenner PR/c++ 15119 diff --git a/gcc/except.c b/gcc/except.c index 36e3f43dca0a..d7daec3e6025 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1830,8 +1830,21 @@ connect_post_landing_pads (void) e->count = src->count; } else - emit_library_call (unwind_resume_libfunc, LCT_THROW, - VOIDmode, 1, cfun->eh->exc_ptr, ptr_mode); + { + emit_library_call (unwind_resume_libfunc, LCT_THROW, + VOIDmode, 1, cfun->eh->exc_ptr, ptr_mode); + + /* What we just emitted was a throwing libcall, so it got a + barrier automatically added after it. If the last insn in + the libcall sequence isn't the barrier, it's because the + target emits multiple insns for a call, and there are insns + after the actual call insn (which are redundant and would be + optimized away). The barrier is inserted exactly after the + call insn, so let's go get that and delete the insns after + it, because below we need the barrier to be the last insn in + the sequence. */ + delete_insns_since (NEXT_INSN (last_call_insn ())); + } seq = get_insns (); end_sequence ();