[cfgloop] PR middle-end/68375: Restructure get_loop_body_in_bfs_order to handle loops...
authorKyrylo Tkachov <ktkachov@gcc.gnu.org>
Tue, 24 Nov 2015 11:03:51 +0000 (11:03 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Tue, 24 Nov 2015 11:03:51 +0000 (11:03 +0000)
PR middle-end/68375
* cfgloop.c (get_loop_body_in_bfs_order): Restructure loop to avoid
bogus assertion.

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

From-SVN: r230798

gcc/ChangeLog
gcc/cfgloop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr68375.c [new file with mode: 0644]

index d91c9292f5ff72609956dbe2eb216855458f3905..cffa083cea49b9b5a0796aa0204868e03fafd35a 100644 (file)
@@ -1,3 +1,10 @@
+2015-11-24  Richard Biener  <rguenther@suse.de>
+            Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR middle-end/68375
+       * cfgloop.c (get_loop_body_in_bfs_order): Restructure loop to avoid
+       bogus assertion.
+
 2015-11-24  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/68483
index bf00e0e17f560333b45dbc7a47042c50eb1a8cb8..83a526276dbef8554b75709847645d844fbab4dd 100644 (file)
@@ -913,37 +913,32 @@ get_loop_body_in_bfs_order (const struct loop *loop)
   basic_block *blocks;
   basic_block bb;
   bitmap visited;
-  unsigned int i = 0;
-  unsigned int vc = 1;
+  unsigned int i = 1;
+  unsigned int vc = 0;
 
   gcc_assert (loop->num_nodes);
   gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
 
   blocks = XNEWVEC (basic_block, loop->num_nodes);
   visited = BITMAP_ALLOC (NULL);
-
-  bb = loop->header;
+  blocks[0] = loop->header;
+  bitmap_set_bit (visited, loop->header->index);
   while (i < loop->num_nodes)
     {
       edge e;
       edge_iterator ei;
-
-      if (bitmap_set_bit (visited, bb->index))
-       /* This basic block is now visited */
-       blocks[i++] = bb;
+      gcc_assert (i > vc);
+      bb = blocks[vc++];
 
       FOR_EACH_EDGE (e, ei, bb->succs)
        {
          if (flow_bb_inside_loop_p (loop, e->dest))
            {
+             /* This bb is now visited.  */
              if (bitmap_set_bit (visited, e->dest->index))
                blocks[i++] = e->dest;
            }
        }
-
-      gcc_assert (i > vc);
-
-      bb = blocks[vc++];
     }
 
   BITMAP_FREE (visited);
index 3c3e3cdf2bcc0ce66858a09ce7cb560eb128137d..d5a1023b94d4b99a28c0b3dedc8eda95debc4363 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-24  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR middle-end/68375
+       * gcc.dg/pr68375.c: New test.
+
 2015-11-24  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/68483
diff --git a/gcc/testsuite/gcc.dg/pr68375.c b/gcc/testsuite/gcc.dg/pr68375.c
new file mode 100644 (file)
index 0000000..bbbdd91
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized-graph" } */
+
+int a, c, d, e, g, h;
+short f;
+
+int
+foo ()
+{
+}
+
+short
+fn1 (void)
+{
+  int j[2];
+  for (; e; e++)
+    if (j[0])
+      for (;;)
+       ;
+  if (!g)
+    return f;
+}
+
+int
+main (void)
+{
+  for (; a < 1; a++)
+    {
+      for (c = 0; c < 2; c++)
+       {
+         d && (f = 0);
+         h = fn1 ();
+       }
+      __builtin_printf ("%d\n", (char) f);
+   }
+
+ return 0;
+}
+