------- Comment #8 from kkojima at gcc dot gnu dot org 2006-08-25 10:56 ------- > And when the other code to handle abnormal edges is fixed, we should not > even try to insert a mode set on an abnormal edge, so the above code can > be changed into > gcc_assert (! (eg_flags & EDGE_ABNORMAL))
Do you mean the patch like this? --- ORIG/trunk/gcc/mode-switching.c 2006-03-09 15:11:37.000000000 +0900 +++ LOCAL/trunk/gcc/mode-switching.c 2006-08-25 09:17:13.000000000 +0900 @@ -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) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28764