The following fixes walking the SESE region when determining if it is 
valid.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Will commit as obvious once that passed.

Thanks,
Richard.

2017-02-08  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/69823
        * graphite-scop-detection.c (scop_detection::harmful_loop_in_region):
        Properly enumerate all BBs in the region.  Use auto_vec/auto_bitmap.

        * gcc.dg/graphite/pr69823.c: New testcase.

Index: gcc/graphite-scop-detection.c
===================================================================
--- gcc/graphite-scop-detection.c       (revision 245276)
+++ gcc/graphite-scop-detection.c       (working copy)
@@ -1062,35 +1062,18 @@ scop_detection::harmful_loop_in_region (
               print_sese (dump_file, scop));
   gcc_assert (dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb));
 
-  int depth = bb_dom_dfs_in (CDI_DOMINATORS, exit_bb)
-    - bb_dom_dfs_in (CDI_DOMINATORS, entry_bb);
+  auto_vec<basic_block> worklist;
+  auto_bitmap loops;
 
-  gcc_assert (depth > 0);
-
-  vec<basic_block> dom
-      = get_dominated_to_depth (CDI_DOMINATORS, entry_bb, depth);
-  int i;
-  basic_block bb;
-  bitmap loops = BITMAP_ALLOC (NULL);
-  FOR_EACH_VEC_ELT (dom, i, bb)
+  worklist.safe_push (entry_bb);
+  while (! worklist.is_empty ())
     {
+      basic_block bb = worklist.pop ();
       DEBUG_PRINT (dp << "Visiting bb_" << bb->index << "\n");
 
-      /* We don't want to analyze any bb outside sese.  */
-      if (!dominated_by_p (CDI_POST_DOMINATORS, bb, exit_bb))
-       continue;
-
-      /* Basic blocks dominated by the scop->exit are not in the scop.  */
-      if (bb != exit_bb && dominated_by_p (CDI_DOMINATORS, bb, exit_bb))
-       continue;
-
       /* The basic block should not be part of an irreducible loop.  */
       if (bb->flags & BB_IRREDUCIBLE_LOOP)
-       {
-         dom.release ();
-         BITMAP_FREE (loops);
-         return true;
-       }
+       return true;
 
       /* Check for unstructured control flow: CFG not generated by structured
         if-then-else.  */
@@ -1114,13 +1097,14 @@ scop_detection::harmful_loop_in_region (
             any loop fully contained in the scop: other bbs are checked below
             in loop_is_valid_in_scop.  */
          if (harmful_stmt_in_bb (scop, bb))
-           {
-             dom.release ();
-             BITMAP_FREE (loops);
-             return true;
-           }
+           return true;
        }
 
+      if (bb != exit_bb)
+       for (basic_block dom = first_dom_son (CDI_DOMINATORS, bb);
+            dom;
+            dom = next_dom_son (CDI_DOMINATORS, dom))
+         worklist.safe_push (dom);
     }
 
   /* Go through all loops and check that they are still valid in the combined
@@ -1133,15 +1117,9 @@ scop_detection::harmful_loop_in_region (
       gcc_assert (loop->num == (int) j);
 
       if (!loop_is_valid_in_scop (loop, scop))
-       {
-         dom.release ();
-         BITMAP_FREE (loops);
-         return true;
-       }
+       return true;
     }
 
-  dom.release ();
-  BITMAP_FREE (loops);
   return false;
 }
 
Index: gcc/testsuite/gcc.dg/graphite/pr69823.c
===================================================================
--- gcc/testsuite/gcc.dg/graphite/pr69823.c     (nonexistent)
+++ gcc/testsuite/gcc.dg/graphite/pr69823.c     (working copy)
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -floop-nest-optimize" } */
+
+void
+foo (int c, int *p, int *a1, int *a2, int *a3)
+{
+  int i;
+
+  if (c)
+    {
+      for (i = 0; i < 8; i++)
+       a1[i] = 1;
+
+      if (*p)
+       *a2 = 0;
+    }
+
+  for (i = 0; i < 8; i++)
+    a3[i] = 0;
+}

Reply via email to