PR tree-optimization/23048
authordpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Aug 2005 17:54:16 +0000 (17:54 +0000)
committerdpatel <dpatel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Aug 2005 17:54:16 +0000 (17:54 +0000)
       * tree-if-conv.c (if_convertible_bb_p): Supply basic_block as
       third parameter. Check whether latch is dominated by exit
       block or not.
       (if_convertible_loop_p): Supply exit block itself to
       if_convertible_bb_p.

       * gcc.dg/tree-ssa/pr23048.c: New test.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr23048.c [new file with mode: 0644]
gcc/tree-if-conv.c

index d325007..7631710 100644 (file)
@@ -1,3 +1,12 @@
+2005-08-19  Devang Patel  <dpatel@apple.com>
+
+       PR tree-optimization/23048
+       * tree-if-conv.c (if_convertible_bb_p): Supply basic_block as
+       third parameter. Check whether latch is dominated by exit
+       block or not.
+       (if_convertible_loop_p): Supply exit block itself to
+       if_convertible_bb_p.
+       
 2005-08-19  Richard Earnshaw  <richard.earnshaw@arm.com>
 
        PR target/23473
index c8dfcfb..ffb5f05 100644 (file)
@@ -1,3 +1,8 @@
+2005-08-19  Devang Patel  <dpatel@apple.com>
+
+       PR tree-optimization/23048
+       * gcc.dg/tree-ssa/pr23048.c: New test.
+       
 2005-08-19  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR middle-end/20624
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr23048.c b/gcc/testsuite/gcc.dg/tree-ssa/pr23048.c
new file mode 100644 (file)
index 0000000..7dc67ea
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -ftree-vectorize" } */
+
+void f(unsigned char *mem)
+{
+   int i;
+
+   for(i=0;i<4;i++) {
+     while(mem[i]==0) ;
+   }
+}
index 11f0ca1..303ae2b 100644 (file)
@@ -110,7 +110,7 @@ static void tree_if_convert_cond_expr (struct loop *, tree, tree,
 static bool if_convertible_phi_p (struct loop *, basic_block, tree);
 static bool if_convertible_modify_expr_p (struct loop *, basic_block, tree);
 static bool if_convertible_stmt_p (struct loop *, basic_block, tree);
-static bool if_convertible_bb_p (struct loop *, basic_block, bool);
+static bool if_convertible_bb_p (struct loop *, basic_block, basic_block);
 static bool if_convertible_loop_p (struct loop *, bool);
 static void add_to_predicate_list (basic_block, tree);
 static tree add_to_dst_predicate_list (struct loop * loop, basic_block, tree, tree,
@@ -437,7 +437,7 @@ if_convertible_stmt_p (struct loop *loop, basic_block bb, tree stmt)
    BB is inside loop LOOP.  */
 
 static bool
-if_convertible_bb_p (struct loop *loop, basic_block bb, bool exit_bb_seen)
+if_convertible_bb_p (struct loop *loop, basic_block bb, basic_block exit_bb)
 {
   edge e;
   edge_iterator ei;
@@ -445,7 +445,7 @@ if_convertible_bb_p (struct loop *loop, basic_block bb, bool exit_bb_seen)
   if (dump_file && (dump_flags & TDF_DETAILS))
     fprintf (dump_file, "----------[%d]-------------\n", bb->index);
 
-  if (exit_bb_seen)
+  if (exit_bb)
     {
       if (bb != loop->latch)
        {
@@ -459,6 +459,14 @@ if_convertible_bb_p (struct loop *loop, basic_block bb, bool exit_bb_seen)
            fprintf (dump_file, "non empty basic block after exit bb\n");
          return false;
        }
+      else if (bb == loop->latch 
+              && bb != exit_bb
+              && !dominated_by_p (CDI_DOMINATORS, bb, exit_bb))
+         {
+           if (dump_file && (dump_flags & TDF_DETAILS))
+             fprintf (dump_file, "latch is not dominated by exit_block\n");
+           return false;
+         }
     }
 
   /* Be less adventurous and handle only normal edges.  */
@@ -494,7 +502,7 @@ if_convertible_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED)
   unsigned int i;
   edge e;
   edge_iterator ei;
-  bool exit_bb_seen = false;
+  basic_block exit_bb = NULL;
 
   /* Handle only inner most loop.  */
   if (!loop || loop->inner)
@@ -547,7 +555,7 @@ if_convertible_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED)
     {
       bb = ifc_bbs[i];
 
-      if (!if_convertible_bb_p (loop, bb, exit_bb_seen))
+      if (!if_convertible_bb_p (loop, bb, exit_bb))
        return false;
 
       /* Check statements.  */
@@ -562,7 +570,7 @@ if_convertible_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED)
          return false;
 
       if (bb_with_exit_edge_p (loop, bb))
-       exit_bb_seen = true;
+       exit_bb = bb;
     }
 
   /* OK. Did not find any potential issues so go ahead in if-convert