cfgcleanup.c (merge_blocks_move_successor_nojumps): Don't leave ADDR_VEC or ADDR_DIFF...
authorRichard Earnshaw <rearnsha@arm.com>
Fri, 21 Sep 2001 15:34:54 +0000 (15:34 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Fri, 21 Sep 2001 15:34:54 +0000 (15:34 +0000)
* cfgcleanup.c (merge_blocks_move_successor_nojumps): Don't leave
ADDR_VEC or ADDR_DIFF_VEC jump insns as part of the basic block
once merging is complete.

From-SVN: r45730

gcc/ChangeLog
gcc/cfgcleanup.c

index b0ce893ef98a14b5b4b7f4e6c0bef9d5fa198c23..3c902822edac5cc29da74245b1ee13c2567da488 100644 (file)
@@ -1,3 +1,9 @@
+21-09-2001  Richard Earnshaw  (reanrsha@arm.com)
+
+       * cfgcleanup.c (merge_blocks_move_successor_nojumps): Don't leave 
+       ADDR_VEC or ADDR_DIFF_VEC jump insns as part of the basic block
+       once merging is complete.
+
 Fri Sep 21 11:20:12 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
        * integrate.c (allocate_initial_values): Eliminate unused arg warning.
index a3ddcac872ea07a181058add16edf33ce06ef554..c52d255d53b788f15acff1086253b7b7e1f2936a 100644 (file)
@@ -319,8 +319,9 @@ static void
 merge_blocks_move_successor_nojumps (a, b)
      basic_block a, b;
 {
-  rtx barrier;
+  rtx barrier, real_b_end;
 
+  real_b_end = b->end;
   barrier = NEXT_INSN (b->end);
 
   /* Recognize a jump table following block B.  */
@@ -331,6 +332,8 @@ merge_blocks_move_successor_nojumps (a, b)
       && (GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_VEC
          || GET_CODE (PATTERN (NEXT_INSN (barrier))) == ADDR_DIFF_VEC))
     {
+      /* Temporarily add the table jump insn to b, so that it will also
+        be moved to the correct location.  */
       b->end = NEXT_INSN (barrier);
       barrier = NEXT_INSN (b->end);
     }
@@ -351,6 +354,9 @@ merge_blocks_move_successor_nojumps (a, b)
   /* Scramble the insn chain.  */
   reorder_insns_nobb (b->head, b->end, a->end);
 
+  /* Restore the real end of b.  */
+  b->end = real_b_end;
+
   /* Now blocks A and B are contiguous.  Merge them.  */
   merge_blocks_nomove (a, b);