diff options
author | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-11-27 12:42:33 +0000 |
---|---|---|
committer | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-11-27 12:42:33 +0000 |
commit | 12ea147810176c39f1b08a24be5cf3d440fdef05 (patch) | |
tree | 3275a36b973741ba9113ada9078449fb83e19c2a /gcc/cfgcleanup.c | |
parent | 99c45f125a3ea69faab6a2ddf8d89f4d35d4646c (diff) | |
download | gcc-12ea147810176c39f1b08a24be5cf3d440fdef05.tar.gz |
* cfgcleanup.c (try_crossjump_to_edge): Always split SRC2 if it
has EH predecessor edges.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@107565 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfgcleanup.c')
-rw-r--r-- | gcc/cfgcleanup.c | 16 |
1 files changed, 14 insertions, 2 deletions
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); |