aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-11-26 21:38:10 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-11-26 21:38:10 +0100
commit01dde9b0e98f435232dd99d8128cd1087066d5ef (patch)
tree697c5fd4bd088240771a52a5b6bab0b09daef6b6 /gcc
parentda719a9f8e8e542e78460c648f36649164666e9d (diff)
downloadgcc-01dde9b0e98f435232dd99d8128cd1087066d5ef.zip
gcc-01dde9b0e98f435232dd99d8128cd1087066d5ef.tar.gz
gcc-01dde9b0e98f435232dd99d8128cd1087066d5ef.tar.bz2
re PR middle-end/59152 (ICE: loop 2's latch does not have an edge to its header with -fopenmp -fipa-pure-const)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/omp-low.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/gomp/pr59152.c40
4 files changed, 55 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c3eade0..b04f539 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index df9cd25..7abe456 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e16308d..26b50d1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..bcccb1b
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/pr59152.c
@@ -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]++;
+}