aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorCesar Philippidis <cesar@codesourcery.com>2019-02-26 15:55:23 -0800
committerSandra Loosemore <sloosemore@baylibre.com>2025-05-15 20:25:45 +0000
commit928a71527927b7ab638b886e11cb02221faa0b97 (patch)
tree9aeba4b6c861bae2ff38201025a6ebda57cb8591 /gcc
parent8f1fe6c2b2f17d02561435ad301f7fdc3271a90b (diff)
downloadgcc-928a71527927b7ab638b886e11cb02221faa0b97.zip
gcc-928a71527927b7ab638b886e11cb02221faa0b97.tar.gz
gcc-928a71527927b7ab638b886e11cb02221faa0b97.tar.bz2
Don't mark OpenACC auto loops as independent inside acc parallel regions
gcc/ChangeLog * omp-low.cc (lower_oacc_head_mark): Don't mark OpenACC auto loops as independent inside acc parallel regions. gcc/testsuite/ChangeLog * c-c++-common/goacc/loop-auto-1.c: Adjust test case to conform to the new behavior of the auto clause in OpenACC 2.5. * c-c++-common/goacc/loop-auto-2.c: Likewise. * gcc.dg/goacc/loop-processing-1.c: Likewise. * c-c++-common/goacc/loop-auto-3.c: New test. * gfortran.dg/goacc/loop-auto-1.f90: New test. libgomp/ChangeLog * testsuite/libgomp.oacc-c-c++-common/loop-auto-1.c: Adjust test case to conform to the new behavior of the auto clause in OpenACC 2.5.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/omp-low.cc6
-rw-r--r--gcc/testsuite/c-c++-common/goacc/loop-auto-1.c50
-rw-r--r--gcc/testsuite/c-c++-common/goacc/loop-auto-2.c4
-rw-r--r--gcc/testsuite/c-c++-common/goacc/loop-auto-3.c78
-rw-r--r--gcc/testsuite/gcc.dg/goacc/loop-processing-1.c2
-rw-r--r--gcc/testsuite/gfortran.dg/goacc/loop-auto-1.f9088
6 files changed, 198 insertions, 30 deletions
diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index b6b53a7..387517c 100644
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -8584,8 +8584,10 @@ lower_oacc_head_mark (location_t loc, tree ddvar, tree clauses,
else
gcc_unreachable ();
- /* In a parallel region, loops are implicitly INDEPENDENT. */
- if (!tgt || is_oacc_parallel_or_serial (tgt))
+ /* In a parallel region, loops without auto and seq clauses are
+ implicitly INDEPENDENT. */
+ if ((!tgt || is_oacc_parallel_or_serial (tgt))
+ && !(tag & (OLF_SEQ | OLF_AUTO)))
tag |= OLF_INDEPENDENT;
/* Loops inside OpenACC 'kernels' decomposed parts' regions are expected to
diff --git a/gcc/testsuite/c-c++-common/goacc/loop-auto-1.c b/gcc/testsuite/c-c++-common/goacc/loop-auto-1.c
index 124befc..dcad07f 100644
--- a/gcc/testsuite/c-c++-common/goacc/loop-auto-1.c
+++ b/gcc/testsuite/c-c++-common/goacc/loop-auto-1.c
@@ -10,7 +10,7 @@ void Foo ()
#pragma acc loop seq
for (int jx = 0; jx < 10; jx++) {}
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int jx = 0; jx < 10; jx++) {}
}
@@ -20,7 +20,7 @@ void Foo ()
#pragma acc loop auto
for (int jx = 0; jx < 10; jx++) {}
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int jx = 0; jx < 10; jx++)
{
#pragma acc loop vector
@@ -51,7 +51,7 @@ void Foo ()
#pragma acc loop vector
for (int jx = 0; jx < 10; jx++)
{
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int kx = 0; kx < 10; kx++) {}
}
@@ -64,27 +64,27 @@ void Foo ()
}
-#pragma acc loop auto
+#pragma acc loop auto independent
for (int ix = 0; ix < 10; ix++)
{
-#pragma acc loop auto
+#pragma acc loop auto independent
for (int jx = 0; jx < 10; jx++)
{
-#pragma acc loop auto
+#pragma acc loop auto independent
for (int kx = 0; kx < 10; kx++) {}
}
}
-#pragma acc loop auto
+#pragma acc loop auto independent
for (int ix = 0; ix < 10; ix++)
{
-#pragma acc loop auto
+#pragma acc loop auto independent
for (int jx = 0; jx < 10; jx++)
{
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int kx = 0; kx < 10; kx++)
{
-#pragma acc loop auto
+#pragma acc loop auto independent
for (int lx = 0; lx < 10; lx++) {}
}
}
@@ -101,7 +101,7 @@ void Gang (void)
#pragma acc loop seq
for (int jx = 0; jx < 10; jx++) {}
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int jx = 0; jx < 10; jx++) {}
}
@@ -111,7 +111,7 @@ void Gang (void)
#pragma acc loop auto
for (int jx = 0; jx < 10; jx++) {}
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int jx = 0; jx < 10; jx++)
{
#pragma acc loop vector
@@ -142,7 +142,7 @@ void Gang (void)
#pragma acc loop vector
for (int jx = 0; jx < 10; jx++)
{
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int kx = 0; kx < 10; kx++) {}
}
@@ -176,7 +176,7 @@ void Worker (void)
#pragma acc loop seq
for (int jx = 0; jx < 10; jx++) {}
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int jx = 0; jx < 10; jx++) {}
}
@@ -186,7 +186,7 @@ void Worker (void)
#pragma acc loop auto
for (int jx = 0; jx < 10; jx++) {}
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int jx = 0; jx < 10; jx++)
{
#pragma acc loop vector
@@ -194,20 +194,20 @@ void Worker (void)
}
}
-#pragma acc loop auto
+#pragma acc loop
for (int ix = 0; ix < 10; ix++)
{
-#pragma acc loop auto
+#pragma acc loop
for (int jx = 0; jx < 10; jx++) {}
}
-#pragma acc loop auto
+#pragma acc loop
for (int ix = 0; ix < 10; ix++)
{
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop /* { dg-warning "insufficient partitioning" } */
for (int jx = 0; jx < 10; jx++)
{
-#pragma acc loop auto
+#pragma acc loop
for (int kx = 0; kx < 10; kx++) {}
}
}
@@ -222,17 +222,17 @@ void Vector (void)
#pragma acc loop seq
for (int jx = 0; jx < 10; jx++) {}
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int jx = 0; jx < 10; jx++) {}
}
-#pragma acc loop auto
+#pragma acc loop auto independent
for (int ix = 0; ix < 10; ix++) {}
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int ix = 0; ix < 10; ix++)
{
-#pragma acc loop auto
+#pragma acc loop auto independent
for (int jx = 0; jx < 10; jx++) {}
}
}
@@ -240,6 +240,6 @@ void Vector (void)
#pragma acc routine seq
void Seq (void)
{
-#pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int ix = 0; ix < 10; ix++) {}
}
diff --git a/gcc/testsuite/c-c++-common/goacc/loop-auto-2.c b/gcc/testsuite/c-c++-common/goacc/loop-auto-2.c
index af3f0bd..5aa36e9 100644
--- a/gcc/testsuite/c-c++-common/goacc/loop-auto-2.c
+++ b/gcc/testsuite/c-c++-common/goacc/loop-auto-2.c
@@ -72,12 +72,12 @@ void Bad ()
#pragma acc loop tile(*) gang vector
for (int ix = 0; ix < 10; ix++)
{
- #pragma acc loop auto /* { dg-warning "insufficient partitioning" } */
+ #pragma acc loop auto independent /* { dg-warning "insufficient partitioning" } */
for (int jx = 0; jx < 10; jx++)
;
}
-#pragma acc loop tile(*) auto /* { dg-warning "insufficient partitioning" } */
+#pragma acc loop tile(*) auto independent /* { dg-warning "insufficient partitioning" } */
for (int ix = 0; ix < 10; ix++)
{
#pragma acc loop worker
diff --git a/gcc/testsuite/c-c++-common/goacc/loop-auto-3.c b/gcc/testsuite/c-c++-common/goacc/loop-auto-3.c
new file mode 100644
index 0000000..8f79ead
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/goacc/loop-auto-3.c
@@ -0,0 +1,78 @@
+/* Ensure that the auto clause falls back to seq parallelism when the
+ OpenACC loop is not explicitly independent. */
+
+/* { dg-additional-options "-fopt-info-optimized-omp" } */
+
+void
+test ()
+{
+ int i, j, k, l, n = 100;
+
+#pragma acc parallel loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+ for (i = 0; i < n; i++)
+#pragma acc loop auto independent /* { dg-message "optimized: assigned OpenACC gang loop parallelism" } */
+ for (j = 0; j < n; j++)
+#pragma acc loop worker vector /* { dg-message "optimized: assigned OpenACC worker vector loop parallelism" } */
+ for (k = 0; k < n; k++)
+ ;
+
+#pragma acc parallel loop auto independent /* { dg-message "optimized: assigned OpenACC gang worker loop parallelism" } */
+ for (i = 0; i < n; i++)
+#pragma acc loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+ for (j = 0; j < n; j++)
+#pragma acc loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+ for (k = 0; k < n; k++)
+#pragma acc loop auto independent /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+ for (l = 0; l < n; l++)
+ ;
+
+#pragma acc parallel loop gang /* { dg-message "optimized: assigned OpenACC gang loop parallelism" } */
+ for (i = 0; i < n; i++)
+#pragma acc loop worker /* { dg-message "optimized: assigned OpenACC worker loop parallelism" } */
+ for (j = 0; j < n; j++)
+#pragma acc loop vector /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+ for (k = 0; k < n; k++)
+ {
+#pragma acc loop auto independent /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+ /* { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 } */
+ for (l = 0; l < n; l++)
+ ;
+#pragma acc loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+ for (l = 0; l < n; l++)
+ ;
+ }
+
+#pragma acc parallel loop /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+ /* { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 } */
+ for (i = 0; i < n; i++)
+ {
+#pragma acc loop gang worker /* { dg-message "optimized: assigned OpenACC gang worker loop parallelism" } */
+ for (j = 0; j < n; j++)
+#pragma acc loop auto /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+ for (k = 0; k < n; k++)
+ {
+#pragma acc loop vector /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+ for (l = 0; l < n; l++)
+ ;
+#pragma acc loop auto independent /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+ for (l = 0; l < n; l++)
+ ;
+ }
+#pragma acc loop worker /* { dg-message "optimized: assigned OpenACC worker loop parallelism" } */
+ for (j = 0; j < n; j++)
+#pragma acc loop vector /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+ for (k = 0; k < n; k++)
+ ;
+ }
+
+#pragma acc parallel loop /* { dg-message "optimized: assigned OpenACC gang loop parallelism" } */
+ for (i = 0; i < n; i++)
+#pragma acc loop /* { dg-message "optimized: assigned OpenACC worker loop parallelism" } */
+ for (j = 0; j < n; j++)
+#pragma acc loop /* { dg-message "optimized: assigned OpenACC seq loop parallelism" } */
+ /* { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 } */
+ for (k = 0; k < n; k++)
+#pragma acc loop /* { dg-message "optimized: assigned OpenACC vector loop parallelism" } */
+ for (l = 0; l < n; l++)
+ ;
+}
diff --git a/gcc/testsuite/gcc.dg/goacc/loop-processing-1.c b/gcc/testsuite/gcc.dg/goacc/loop-processing-1.c
index d7447fd..6e034d1 100644
--- a/gcc/testsuite/gcc.dg/goacc/loop-processing-1.c
+++ b/gcc/testsuite/gcc.dg/goacc/loop-processing-1.c
@@ -9,7 +9,7 @@ void vector_1 (int *ary, int size)
{
#pragma acc loop gang
for (int jx = 0; jx < 1; jx++)
-#pragma acc loop auto
+#pragma acc loop auto independent
for (int ix = 0; ix < size; ix++)
ary[ix] = place ();
}
diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-auto-1.f90 b/gcc/testsuite/gfortran.dg/goacc/loop-auto-1.f90
new file mode 100644
index 0000000..8d600f4
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/loop-auto-1.f90
@@ -0,0 +1,88 @@
+! Ensure that the auto clause falls back to seq parallelism when the
+! OpenACC loop is not explicitly independent.
+
+! { dg-additional-options "-fopt-info-optimized-omp" }
+
+program test
+ implicit none
+ integer, parameter :: n = 100
+ integer i, j, k, l
+
+ !$acc parallel loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+ do i = 1, n
+ !$acc loop auto independent ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
+ do j = 1, n
+ !$acc loop worker vector ! { dg-message "optimized: assigned OpenACC worker vector loop parallelism" }
+ do k = 1, n
+ end do
+ end do
+ end do
+
+ !$acc parallel loop auto independent ! { dg-message "optimized: assigned OpenACC gang worker loop parallelism" }
+ do i = 1, n
+ !$acc loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+ do j = 1, n
+ !$acc loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+ do k = 1, n
+ !$acc loop auto independent ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+ do l = 1, n
+ end do
+ end do
+ end do
+ end do
+
+ !$acc parallel loop gang ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
+ do i = 1, n
+ !$acc loop worker ! { dg-message "optimized: assigned OpenACC worker loop parallelism" }
+ do j = 1, n
+ !$acc loop vector ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+ do k = 1, n
+ !$acc loop auto independent ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+ ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
+ do l = 1, n
+ end do
+ !$acc loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+ do l = 1, n
+ end do
+ end do
+ end do
+ end do
+
+
+ !$acc parallel loop ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+ ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
+ do i = 1, n
+ !$acc loop gang worker ! { dg-message "optimized: assigned OpenACC gang worker loop parallelism" }
+ do j = 1, n
+ !$acc loop auto ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+ do k = 1, n
+ !$acc loop vector ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+ do l = 1, n
+ end do
+ end do
+ !$acc loop auto independent ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+ do l = 1, n
+ end do
+ end do
+ !$acc loop worker ! { dg-message "optimized: assigned OpenACC worker loop parallelism" }
+ do j = 1, n
+ !$acc loop vector ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+ do k = 1, n
+ end do
+ end do
+ end do
+
+ !$acc parallel loop ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
+ do i = 1, n
+ !$acc loop ! { dg-message "optimized: assigned OpenACC worker loop parallelism" }
+ do j = 1, n
+ !$acc loop ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+ ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
+ do k = 1, n
+ !$acc loop ! { dg-message "optimized: assigned OpenACC vector loop parallelism" }
+ do l = 1, n
+ end do
+ end do
+ end do
+ end do
+end program test