OSDN Git Service

PR target/28764
authorkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Sep 2006 21:41:23 +0000 (21:41 +0000)
committerkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Sep 2006 21:41:23 +0000 (21:41 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116703 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/mode-switching.c

index 71eb203..06c987f 100644 (file)
@@ -1,3 +1,12 @@
+2006-09-05  J"orn Rennecke  <joern.rennecke@st.com>
+           Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       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.
+
 2006-09-05  Paolo Bonzini  <bonzini@gnu.org>
 
        PR rtl-optimization/26847
index 0d485dd..407ae76 100644 (file)
@@ -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)