diff mbox

[committed] Fix omp-low.c loop creation (PR middle-end/59152)

Message ID 20131126204234.GP892@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Nov. 26, 2013, 8:42 p.m. UTC
Hi!

If collapse_bb != NULL, then cont_bb isn't a latch of schedule(static,C)
collapse(N) omp for loops, and the latch for simd loops was only correct
if the loop contained just two basic blocks and not more.

Fixed thusly, bootstrapped/regtested on x86_64-linux, committed to trunk.

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.

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


	Jakub
diff mbox

Patch

--- gcc/omp-low.c.jj	2013-11-25 18:30:18.000000000 +0100
+++ gcc/omp-low.c	2013-11-26 14:20:46.137171434 +0100
@@ -6491,7 +6491,8 @@  expand_omp_for_static_chunk (struct omp_
 	{
 	  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 *regi
     {
       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;
--- gcc/testsuite/c-c++-common/gomp/pr59152.c.jj	2013-11-26 14:15:32.099779366 +0100
+++ gcc/testsuite/c-c++-common/gomp/pr59152.c	2013-11-26 13:59:36.000000000 +0100
@@ -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]++;
+}