From b604fe9b84e41f387222758a300dce02a39a6b1b Mon Sep 17 00:00:00 2001 From: Steven Bosscher Date: Sun, 27 Nov 2005 12:42:33 +0000 Subject: [PATCH] cfgcleanup.c (try_crossjump_to_edge): Always split SRC2 if it has EH predecessor edges. * cfgcleanup.c (try_crossjump_to_edge): Always split SRC2 if it has EH predecessor edges. From-SVN: r107565 --- gcc/ChangeLog | 5 +++++ gcc/cfgcleanup.c | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c343af9e1b0..a5b33e6fd70 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-11-27 Steven Bosscher + + * cfgcleanup.c (try_crossjump_to_edge): Always split SRC2 if it + has EH predecessor edges. + 2005-11-26 Eric Christopher * config/i386/i386.md (*zero_extendqihi2_movzbw): Avoid partial diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 66a0dec6488..7e3cb0ec768 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -1572,11 +1572,23 @@ try_crossjump_to_edge (int mode, edge e1, edge e2) } } - /* Avoid splitting if possible. */ - if (newpos2 == BB_HEAD (src2)) + /* Avoid splitting if possible. We must always split when SRC2 has + EH predecessor edges, or we may end up with basic blocks with both + normal and EH predecessor edges. */ + if (newpos2 == BB_HEAD (src2) + && !(EDGE_PRED (src2, 0)->flags & EDGE_EH)) redirect_to = src2; else { + if (newpos2 == BB_HEAD (src2)) + { + /* Skip possible basic block header. */ + if (LABEL_P (newpos2)) + newpos2 = NEXT_INSN (newpos2); + if (NOTE_P (newpos2)) + newpos2 = NEXT_INSN (newpos2); + } + if (dump_file) fprintf (dump_file, "Splitting bb %i before %i insns\n", src2->index, nmatch);