tree-if-conv.c (process_phi_nodes): Process latch block.
authorDevang Patel <dpatel@apple.com>
Thu, 14 Oct 2004 18:19:47 +0000 (11:19 -0700)
committerDevang Patel <dpatel@gcc.gnu.org>
Thu, 14 Oct 2004 18:19:47 +0000 (11:19 -0700)
       * tree-if-conv.c (process_phi_nodes): Process latch block.
       (combine_blocks): Process latch block and update loop structure.

       * gcc.dg/pr17635.c : New test.

From-SVN: r89045

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/tree-if-conv.c

index 13d6db424d790c3d6a43b638354a6f57556f4ca6..9762b14e370f10d9b402e8c81bd7d4a0ae5fd8ea 100644 (file)
@@ -1,3 +1,9 @@
+2004-10-14  Devang Patel  <dpatel@apple.com>
+
+       PR 17635
+       * tree-if-conv.c (process_phi_nodes): Process latch block.
+       (combine_blocks): Process latch block and update loop structure.
+       
 2004-10-14  Olga Golovanevsky  <olga@il.ibm.com>
 
        * tree-vectorizer.c (vect_generate_tmps_on_preheader):
index 2919fb34b0794592eaa11be6305b709c43495f79..0932934fd73bb6ab0a072c7ee72470df1f6f54d6 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-14  Devang Patel  <dpatel@apple.com>
+
+       PR 17635
+       * gcc.dg/pr17635.c : New test.
+       
 2004-10-14  Olga GOlovanevsky  <olga@il.ibm.com>
 
        * testsuite/gcc.dg/vect/vect-28.c : Remove xfail.
index 88696465856f21e6d22cc6fbc471558c47c3940b..bb2ab9cf1a8198d0f7b3c4ef38c056630d9839e1 100644 (file)
@@ -815,7 +815,7 @@ process_phi_nodes (struct loop *loop)
       basic_block true_bb = NULL;
       bb = ifc_bbs[i];
 
-      if (bb == loop->header || bb == loop->latch)
+      if (bb == loop->header)
        continue;
 
       phi = phi_nodes (bb);
@@ -863,9 +863,6 @@ combine_blocks (struct loop *loop)
 
       bb = ifc_bbs[i];
 
-      if (bb == loop->latch)
-       continue;
-
       if (!exit_bb && bb_with_exit_edge_p (bb))
          exit_bb = bb;
 
@@ -891,6 +888,9 @@ combine_blocks (struct loop *loop)
          continue;
        }
 
+      if (bb == loop->latch && empty_block_p (bb))
+       continue;
+
       /* It is time to remove this basic block.         First remove edges.  */
       while (EDGE_COUNT (bb->succs) > 0)
        ssa_remove_edge (EDGE_SUCC (bb, 0));
@@ -921,6 +921,8 @@ combine_blocks (struct loop *loop)
        delete_from_dominance_info (CDI_POST_DOMINATORS, bb);
 
       /* Remove basic block.  */
+      if (bb == loop->latch)
+       loop->latch = merge_target_bb;
       remove_bb_from_loops (bb);
       expunge_block (bb);
     }
@@ -928,7 +930,10 @@ combine_blocks (struct loop *loop)
   /* Now if possible, merge loop header and block with exit edge.
      This reduces number of basic blocks to 2. Auto vectorizer addresses
      loops with two nodes only.  FIXME: Use cleanup_tree_cfg().  */
-  if (exit_bb != loop->latch && empty_block_p (loop->latch))
+  if (exit_bb
+      && loop->header != loop->latch
+      && exit_bb != loop->latch 
+      && empty_block_p (loop->latch))
     {
       if (can_merge_blocks_p (loop->header, exit_bb))
        {