OSDN Git Service

* tree-ssa-sink.c (sink_code_in_bb): Don't stop sinking after
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Oct 2007 20:39:03 +0000 (20:39 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Oct 2007 20:39:03 +0000 (20:39 +0000)
sinking the last stmt in a BB.

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

gcc/ChangeLog
gcc/tree-ssa-sink.c

index 3c6aa3d..4534424 100644 (file)
@@ -1,5 +1,10 @@
 2007-10-01  Alexandre Oliva  <aoliva@redhat.com>
 
+       * tree-ssa-sink.c (sink_code_in_bb): Don't stop sinking after
+       sinking the last stmt in a BB.
+
+2007-10-01  Alexandre Oliva  <aoliva@redhat.com>
+
        PR middle-end/22156
        * tree-sra.c (struct sra_elt): Add in_bitfld_block.
        (sra_hash_tree): Handle BIT_FIELD_REFs.
index b70d082..cd57baa 100644 (file)
@@ -433,6 +433,7 @@ sink_code_in_bb (basic_block bb)
   block_stmt_iterator bsi;
   edge_iterator ei;
   edge e;
+  bool last = true;
   
   /* If this block doesn't dominate anything, there can't be any place to sink
      the statements to.  */
@@ -454,6 +455,7 @@ sink_code_in_bb (basic_block bb)
        {
          if (!bsi_end_p (bsi))
            bsi_prev (&bsi);
+         last = false;
          continue;
        }      
       if (dump_file)
@@ -472,6 +474,19 @@ sink_code_in_bb (basic_block bb)
        bsi_move_before (&bsi, &tobsi);
 
       sink_stats.sunk++;
+
+      /* If we've just removed the last statement of the BB, the
+        bsi_end_p() test below would fail, but bsi_prev() would have
+        succeeded, and we want it to succeed.  So we keep track of
+        whether we're at the last statement and pick up the new last
+        statement.  */
+      if (last)
+       {
+         bsi = bsi_last (bb);
+         continue;
+       }
+
+      last = false;
       if (!bsi_end_p (bsi))
        bsi_prev (&bsi);