(merge_blocks_move_predecessor_nojumps): Re-order the basic block records so...
authorRichard Earnshaw <rearnsha@arm.com>
Wed, 20 Oct 1999 12:39:01 +0000 (12:39 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Wed, 20 Oct 1999 12:39:01 +0000 (12:39 +0000)
(merge_blocks_move_predecessor_nojumps): Re-order the basic
block records so that merge_blocks_nomove will clean up correctly.

From-SVN: r30100

gcc/ChangeLog
gcc/flow.c

index 9a7fd9484a2c67fd35ded2e9d67f2b03ff7816e3..de82cea92939271a09bb962b811005b5e3307097 100644 (file)
@@ -2,6 +2,9 @@ Wed Oct 20 10:46:41 1999  Richard Earnshaw (rearnsha@arm.com)
 
        * jump.c (jump_optimize_1): More accurately detect casesi insns.
 
+       * flow.c (merge_blocks_move_predecessor_nojumps): Re-order the basic
+       block records so that merge_blocks_nomove will clean up correctly.
+
 Tue Oct 19 23:43:50 1999  Jeffrey A Law  (law@cygnus.com)
 
        * pa.md (call, call_value): Do not emit a blockage after restoring
index aaa006ae104bb42d2cf151cbe946f8353be7a8c3..fcefe0aaa2c5251145db2b0da9f2fbdc65cfbb33 100644 (file)
@@ -2006,6 +2006,7 @@ merge_blocks_move_predecessor_nojumps (a, b)
      basic_block a, b;
 {
   rtx start, end, insertpoint, barrier;
+  int index;
 
   start = a->head;
   end = a->end;
@@ -2037,15 +2038,24 @@ merge_blocks_move_predecessor_nojumps (a, b)
   /* Scramble the insn chain.  */
   reorder_insns (start, end, insertpoint);
 
-  /* Now blocks A and B are contiguous.  Merge them.  */
-  merge_blocks_nomove (a, b);
-
   if (rtl_dump_file)
     {
       fprintf (rtl_dump_file, "Moved block %d before %d and merged.\n",
               a->index, b->index);
     }
 
+  /* Swap the records for the two blocks around.  Although we are deleting B,
+     A is now where B was and we want to compact the BB array from where
+     A used to be.  */
+  BASIC_BLOCK(a->index) = b;
+  BASIC_BLOCK(b->index) = a;
+  index = a->index;
+  a->index = b->index;
+  b->index = index;
+  
+  /* Now blocks A and B are contiguous.  Merge them.  */
+  merge_blocks_nomove (a, b);
+
   return 1;
 }