]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
function.c (block_fragments_nreverse, [...]): New functions.
authorJakub Jelinek <jakub@redhat.com>
Tue, 17 Aug 2010 06:49:20 +0000 (08:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 17 Aug 2010 06:49:20 +0000 (08:49 +0200)
* function.c (block_fragments_nreverse, blocks_nreverse_all): New
functions.
(reorder_blocks): Use blocks_nreverse_all instead of blocks_nreverse.
(reorder_blocks_1): Assert BLOCK_FRAGMENT_ORIGIN is NULL.  Don't
call block_nreverse here.
(blocks_nreverse): Rename decl temporary to block.

From-SVN: r163292

gcc/ChangeLog
gcc/function.c

index a070f06d1429bc0866d9b2e9a4b648693f56c9f0..a01b1ae513509c463521f24edf18b47038f0a209 100644 (file)
@@ -1,3 +1,12 @@
+2010-08-17  Jakub Jelinek  <jakub@redhat.com>
+
+       * function.c (block_fragments_nreverse, blocks_nreverse_all): New
+       functions.
+       (reorder_blocks): Use blocks_nreverse_all instead of blocks_nreverse.
+       (reorder_blocks_1): Assert BLOCK_FRAGMENT_ORIGIN is NULL.  Don't
+       call block_nreverse here.
+       (blocks_nreverse): Rename decl temporary to block.
+
 2010-08-16  Bernd Schmidt  <bernds@codesourcery.com>
 
        * config/arm/thumb2.md (thumb2_notsi_shiftsi,
index 5a4dc10bab13a204287e481221fa8230029a79c3..95b9577076d810dbdf218d6bcd80d0458c019b82 100644 (file)
@@ -3953,6 +3953,46 @@ generate_setjmp_warnings (void)
 }
 
 \f
+/* Reverse the order of elements in the fragment chain T of blocks,
+   and return the new head of the chain (old last element).  */
+
+static tree
+block_fragments_nreverse (tree t)
+{
+  tree prev = 0, block, next;
+  for (block = t; block; block = next)
+    {
+      next = BLOCK_FRAGMENT_CHAIN (block);
+      BLOCK_FRAGMENT_CHAIN (block) = prev;
+      prev = block;
+    }
+  return prev;
+}
+
+/* Reverse the order of elements in the chain T of blocks,
+   and return the new head of the chain (old last element).
+   Also do the same on subblocks and reverse the order of elements
+   in BLOCK_FRAGMENT_CHAIN as well.  */
+
+static tree
+blocks_nreverse_all (tree t)
+{
+  tree prev = 0, block, next;
+  for (block = t; block; block = next)
+    {
+      next = BLOCK_CHAIN (block);
+      BLOCK_CHAIN (block) = prev;
+      BLOCK_SUBBLOCKS (block) = blocks_nreverse_all (BLOCK_SUBBLOCKS (block));
+      if (BLOCK_FRAGMENT_CHAIN (block)
+         && BLOCK_FRAGMENT_ORIGIN (block) == NULL_TREE)
+       BLOCK_FRAGMENT_CHAIN (block)
+         = block_fragments_nreverse (BLOCK_FRAGMENT_CHAIN (block));
+      prev = block;
+    }
+  return prev;
+}
+
+
 /* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
    and create duplicate blocks.  */
 /* ??? Need an option to either create block fragments or to create
@@ -3979,7 +4019,7 @@ reorder_blocks (void)
 
   /* Recreate the block tree from the note nesting.  */
   reorder_blocks_1 (get_insns (), block, &block_stack);
-  BLOCK_SUBBLOCKS (block) = blocks_nreverse (BLOCK_SUBBLOCKS (block));
+  BLOCK_SUBBLOCKS (block) = blocks_nreverse_all (BLOCK_SUBBLOCKS (block));
 
   VEC_free (tree, heap, block_stack);
 }
@@ -4011,9 +4051,8 @@ reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
              tree block = NOTE_BLOCK (insn);
              tree origin;
 
-             origin = (BLOCK_FRAGMENT_ORIGIN (block)
-                       ? BLOCK_FRAGMENT_ORIGIN (block)
-                       : block);
+             gcc_assert (BLOCK_FRAGMENT_ORIGIN (block) == NULL_TREE);
+             origin = block;
 
              /* If we have seen this block before, that means it now
                 spans multiple address regions.  Create a new fragment.  */
@@ -4050,8 +4089,6 @@ reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
          else if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_END)
            {
              NOTE_BLOCK (insn) = VEC_pop (tree, *p_block_stack);
-             BLOCK_SUBBLOCKS (current_block)
-               = blocks_nreverse (BLOCK_SUBBLOCKS (current_block));
              current_block = BLOCK_SUPERCONTEXT (current_block);
            }
        }
@@ -4064,12 +4101,12 @@ reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
 tree
 blocks_nreverse (tree t)
 {
-  tree prev = 0, decl, next;
-  for (decl = t; decl; decl = next)
+  tree prev = 0, block, next;
+  for (block = t; block; block = next)
     {
-      next = BLOCK_CHAIN (decl);
-      BLOCK_CHAIN (decl) = prev;
-      prev = decl;
+      next = BLOCK_CHAIN (block);
+      BLOCK_CHAIN (block) = prev;
+      prev = block;
     }
   return prev;
 }