]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/59152 (ICE: loop 2's latch does not have an edge to its header with...
authorJakub Jelinek <jakub@redhat.com>
Tue, 26 Nov 2013 20:38:10 +0000 (21:38 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 26 Nov 2013 20:38:10 +0000 (21:38 +0100)
PR middle-end/59152
* omp-low.c (expand_omp_for_static_chunk): Don't set loop->latch
for the inner loop if collapse_bb is non-NULL.
(expand_omp_simd): Use cont_bb rather than e->dest as latch.

* c-c++-common/gomp/pr59152.c: New test.

From-SVN: r205410

gcc/ChangeLog
gcc/omp-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/pr59152.c [new file with mode: 0644]

index c3eade0df5f08a6e37b04ec249d7d092ae8c96b8..b04f539736855710b809894fd8073eefdfcd6f36 100644 (file)
@@ -1,3 +1,10 @@
+2013-11-26  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/59152
+       * omp-low.c (expand_omp_for_static_chunk): Don't set loop->latch
+       for the inner loop if collapse_bb is non-NULL.
+       (expand_omp_simd): Use cont_bb rather than e->dest as latch.
+
 2013-11-26  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        Remove parameter keep_aligning from get_inner_reference.
index df9cd25b4019dcd6436a6baa45f6826b59091ea4..7abe45677114d6a71555f65892f67bca4af8e3d6 100644 (file)
@@ -6491,7 +6491,8 @@ expand_omp_for_static_chunk (struct omp_region *region,
        {
          struct loop *loop = alloc_loop ();
          loop->header = body_bb;
-         loop->latch = cont_bb;
+         if (collapse_bb == NULL)
+           loop->latch = cont_bb;
          add_loop (loop, trip_loop);
        }
     }
@@ -6771,7 +6772,7 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd)
     {
       struct loop *loop = alloc_loop ();
       loop->header = l1_bb;
-      loop->latch = e->dest;
+      loop->latch = cont_bb;
       add_loop (loop, l1_bb->loop_father);
       if (safelen == NULL_TREE)
        loop->safelen = INT_MAX;
index e16308d1d93fc2eaef115138353559d22d60100a..26b50d11cacd4fb4b7b32ef4cd798e1893b68a42 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-26  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/59152
+       * c-c++-common/gomp/pr59152.c: New test.
+
 2013-11-26  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.dg/gomp/openmp-simd-1.c: Cleanup original tree dump.
diff --git a/gcc/testsuite/c-c++-common/gomp/pr59152.c b/gcc/testsuite/c-c++-common/gomp/pr59152.c
new file mode 100644 (file)
index 0000000..bcccb1b
--- /dev/null
@@ -0,0 +1,40 @@
+/* PR middle-end/59152 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -fipa-pure-const" } */
+
+extern int b[];
+void
+foo (void)
+{
+  unsigned long v1, v2, v3;
+  #pragma omp parallel for schedule(static, 32) collapse(3)
+    for (v1 = 0; v1 < 20; v1 += 2)
+      for (v2 = __LONG_MAX__; v2 > __LONG_MAX__ - 30; v2 -= 3)
+       for (v3 = 10; v3 > 0; v3--)
+         #pragma omp atomic
+           b[v3]++;
+}
+
+void
+bar (void)
+{
+  unsigned long v1, v2, v3;
+  #pragma omp parallel for schedule(static) collapse(3)
+    for (v1 = 0; v1 < 20; v1 += 2)
+      for (v2 = __LONG_MAX__; v2 > __LONG_MAX__ - 30; v2 -= 3)
+       for (v3 = 10; v3 > 0; v3--)
+         #pragma omp atomic
+           b[v3]++;
+}
+
+void
+baz (void)
+{
+  unsigned long v1, v2, v3;
+  #pragma omp parallel for schedule(runtime) collapse(3)
+    for (v1 = 0; v1 < 20; v1 += 2)
+      for (v2 = __LONG_MAX__; v2 > __LONG_MAX__ - 30; v2 -= 3)
+       for (v3 = 10; v3 > 0; v3--)
+         #pragma omp atomic
+           b[v3]++;
+}