]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[Fortran] OpenMP 5 – permit more sharing clauses for SIMD (PR94690)
authorKwok Cheung Yeung <kcy@codesourcery.com>
Fri, 14 Aug 2020 12:20:39 +0000 (05:20 -0700)
committerKwok Cheung Yeung <kcy@codesourcery.com>
Fri, 14 Aug 2020 12:28:03 +0000 (05:28 -0700)
This is a backport from master of commit
0ec52417fd9b3bef5227cdc9a18ff4f0247b0ea4.

gcc/fortran/
PR fortran/94690
* openmp.c (resolve_omp_do): Permit more clauses for SIMD
iteration variables.

gcc/testsuite/
PR fortran/94690
* gfortran.dg/gomp/openmp-simd-4.f90: New test.

gcc/fortran/ChangeLog.omp
gcc/fortran/openmp.c
gcc/testsuite/ChangeLog.omp
gcc/testsuite/gfortran.dg/gomp/openmp-simd-4.f90 [new file with mode: 0644]

index 340a4dcee7c1ba21b63e6bf84ed15067e6d8e6de..00c6be0588f66319ab1da5c645445cffa29ff88e 100644 (file)
@@ -1,3 +1,12 @@
+2020-08-14  Kwok Cheung Yeung  <kcy@codesourcery.com>
+
+       Backport from mainline
+       2020-05-15  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/94690
+       * openmp.c (resolve_omp_do): Permit more clauses for SIMD
+       iteration variables.
+
 2020-08-14  Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        Backport from mainline
index 220b1a9a22525927227a33b3756140909884835e..5c384caa980af93ff5e84ee3612151e46c0cbc17 100644 (file)
@@ -5868,26 +5868,21 @@ resolve_omp_do (gfc_code *code)
                   "at %L", name, &do_code->loc);
       if (code->ext.omp_clauses)
        for (list = 0; list < OMP_LIST_NUM; list++)
-         if (!is_simd
+         if (!is_simd || code->ext.omp_clauses->collapse > 1
              ? (list != OMP_LIST_PRIVATE && list != OMP_LIST_LASTPRIVATE)
-             : code->ext.omp_clauses->collapse > 1
-             ? (list != OMP_LIST_LASTPRIVATE)
-             : (list != OMP_LIST_LINEAR))
+             : (list != OMP_LIST_PRIVATE && list != OMP_LIST_LASTPRIVATE
+                && list != OMP_LIST_LINEAR))
            for (n = code->ext.omp_clauses->lists[list]; n; n = n->next)
              if (dovar == n->sym)
                {
-                 if (!is_simd)
+                 if (!is_simd || code->ext.omp_clauses->collapse > 1)
                    gfc_error ("%s iteration variable present on clause "
                               "other than PRIVATE or LASTPRIVATE at %L",
                               name, &do_code->loc);
-                 else if (code->ext.omp_clauses->collapse > 1)
-                   gfc_error ("%s iteration variable present on clause "
-                              "other than LASTPRIVATE at %L",
-                              name, &do_code->loc);
                  else
                    gfc_error ("%s iteration variable present on clause "
-                              "other than LINEAR at %L",
-                              name, &do_code->loc);
+                              "other than PRIVATE, LASTPRIVATE or "
+                              "LINEAR at %L", name, &do_code->loc);
                  break;
                }
       if (i > 1)
index aba7d391001d513008a90bd1f24af03e1012fb59..8f652f46a0802365385d1edab8f28211c2b0303c 100644 (file)
@@ -1,3 +1,11 @@
+2020-08-14  Kwok Cheung Yeung  <kcy@codesourcery.com>
+
+       Backport from mainline
+       2020-05-15  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/94690
+       * gfortran.dg/gomp/openmp-simd-4.f90: New test.
+
 2020-08-12  Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        * gcc.target/nvptx/sync.c: New.
diff --git a/gcc/testsuite/gfortran.dg/gomp/openmp-simd-4.f90 b/gcc/testsuite/gfortran.dg/gomp/openmp-simd-4.f90
new file mode 100644 (file)
index 0000000..4a17fb9
--- /dev/null
@@ -0,0 +1,65 @@
+! { dg-do compile }
+
+integer :: i, j, k
+integer :: x(5), y(2,5)
+
+!$omp parallel do private(i)
+do i = 1, 5
+  x(i) = 42
+end do
+
+!$omp parallel do lastprivate(i)
+do i = 1, 5
+  x(i) = 42
+end do
+
+
+!$omp simd private(i)
+do i = 1, 5
+  x(i) = 42
+end do
+
+!$omp simd linear(i)
+do i = 1, 5
+  x(i) = 42
+end do
+
+!$omp simd lastprivate(i)
+do i = 1, 5
+  x(i) = 42
+end do
+
+
+!$omp simd private(i) lastprivate(j) collapse(2)
+do i = 1, 5
+  do j = 1, 2
+    y(j, i) = 52
+  end do
+end do
+
+!$omp simd lastprivate(i) private(j) collapse(2)
+do i = 1, 5
+  do j = 1, 2
+    y(j, i) = 52
+  end do
+end do
+
+!$omp parallel do firstprivate(i)
+do i = 1, 5  ! { dg-error "PARALLEL DO iteration variable present on clause other than PRIVATE or LASTPRIVATE" }
+  x(i) = 42
+end do
+
+!$omp parallel do simd firstprivate(i)
+do i = 1, 5  ! { dg-error "PARALLEL DO SIMD iteration variable present on clause other than PRIVATE, LASTPRIVATE or LINEAR" }
+  x(i) = 42
+end do
+
+!$omp simd linear(i) collapse(2)
+do i = 1, 5  ! { dg-error "SIMD iteration variable present on clause other than PRIVATE or LASTPRIVATE" }
+  do j = 1, 2
+    y(j, i) = 52
+  end do
+end do
+
+
+end