diff options
author | J"orn Rennecke <joern.rennecke@st.com> | 2006-09-05 21:41:23 +0000 |
---|---|---|
committer | Kaz Kojima <kkojima@gcc.gnu.org> | 2006-09-05 21:41:23 +0000 |
commit | 650a59ef78e60584d88905c266ddd4faf7ca4679 (patch) | |
tree | 609974c074f0c5de52b68f305975f08af487b385 /gcc/mode-switching.c | |
parent | ec1ee65573108066a357ff00027a5c3a6b9a6031 (diff) |
re PR target/28764 (libjava build failure on sh4)
PR target/28764
* mode-switching.c (optimize_mode_switching): Make the destination
block of an abnormal edge have no anticipatable mode. Don't
insert mode switching code at the end of the source block of
an abnormal edge.
Co-Authored-By: Kaz Kojima <kkojima@gcc.gnu.org>
From-SVN: r116703
Diffstat (limited to 'gcc/mode-switching.c')
-rw-r--r-- | gcc/mode-switching.c | 43 |
1 files changed, 10 insertions, 33 deletions
diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c index 0d485dd0a1e..407ae76a8c6 100644 --- a/gcc/mode-switching.c +++ b/gcc/mode-switching.c @@ -465,7 +465,11 @@ optimize_mode_switching (void) if (e->flags & EDGE_COMPLEX) break; if (e) - RESET_BIT (transp[bb->index], j); + { + ptr = new_seginfo (no_mode, BB_HEAD (bb), bb->index, live_now); + add_seginfo (info + bb->index, ptr); + RESET_BIT (transp[bb->index], j); + } } for (insn = BB_HEAD (bb); @@ -608,38 +612,11 @@ optimize_mode_switching (void) if (mode_set == NULL_RTX) continue; - /* If this is an abnormal edge, we'll insert at the end - of the previous block. */ - if (eg->flags & EDGE_ABNORMAL) - { - emited = true; - if (JUMP_P (BB_END (src_bb))) - emit_insn_before (mode_set, BB_END (src_bb)); - else - { - /* It doesn't make sense to switch to normal - mode after a CALL_INSN. The cases in which a - CALL_INSN may have an abnormal edge are - sibcalls and EH edges. In the case of - sibcalls, the dest basic-block is the - EXIT_BLOCK, that runs in normal mode; it is - assumed that a sibcall insn requires normal - mode itself, so no mode switch would be - required after the call (it wouldn't make - sense, anyway). In the case of EH edges, EH - entry points also start in normal mode, so a - similar reasoning applies. */ - gcc_assert (NONJUMP_INSN_P (BB_END (src_bb))); - emit_insn_after (mode_set, BB_END (src_bb)); - } - bb_info[j][src_bb->index].computing = mode; - RESET_BIT (transp[src_bb->index], j); - } - else - { - need_commit = 1; - insert_insn_on_edge (mode_set, eg); - } + /* We should not get an abnormal edge here. */ + gcc_assert (! (eg->flags & EDGE_ABNORMAL)); + + need_commit = 1; + insert_insn_on_edge (mode_set, eg); } FOR_EACH_BB_REVERSE (bb) |