[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc-fortran
Subject:    [PR90048] Fortran OpenACC 'private' clause rejected for predetermined private loop iteration variabl
From:       Thomas Schwinge <thomas () codesourcery ! com>
Date:       2019-04-17 8:38:26
Message-ID: yxfpwojt9gcd.fsf () hertz ! schwinge ! homeip ! net
[Download RAW message or body]

Hi!

On Mon, 11 Aug 2014 16:55:28 -0700, Cesar Philippidis <cesar@codesourcery.com> wrote:
> According to section 2.6.1 in the openacc spec, fortran loop variables
> should be implicitly private like in openmp.

More correctly, they are "predetermined private" (which cannot be
overridden), not "implicit private" (which could be overridden with a
different explicit clause).

> This patch does just so.

But it also introduced PR90048 "Fortran OpenACC 'private' clause rejected
for predetermined private loop iteration variable".

Instead of the patch "don't error on implicitly private induction
variables in gfortran" proposed by Cesar, and then challenged by Jakub, I
have now committed a different patch (more similar to the existing
handling for OpenMP) to trunk in r270406 "[PR90048] Fortran OpenACC
'private' clause rejected for predetermined private loop iteration
variable", see attached.


I have a cleanup patch (for next GCC development stage 1), which will
simply merge the special-case 'gfc_resolve_oacc_blocks' into the generic
'gfc_resolve_omp_parallel_blocks', see attached.


> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/goacc/private-1.f95
> @@ -0,0 +1,39 @@
> +! { dg-do compile } 
> +! { dg-additional-options "-fdump-tree-omplower" } 
> +
> +! test for implicit private clauses in do loops
> +
> +program test
> +  implicit none
> +  integer :: i, j, k
> +  logical :: l
> +
> +  !$acc parallel
> +  !$acc loop
> +  do i = 1, 100
> +  end do
> +  !$acc end parallel
> +
> +  !$acc parallel
> +  !$acc loop
> +  do i = 1, 100
> +     do j = 1, 100
> +     end do
> +  end do
> +  !$acc end parallel
> +
> +  !$acc parallel
> +  !$acc loop
> +  do i = 1, 100
> +     do j = 1, 100
> +        do k = 1, 100
> +        end do
> +     end do
> +  end do
> +  !$acc end parallel
> +end program test
> +! { dg-prune-output "unimplemented" }
> +! { dg-final { scan-tree-dump-times "pragma acc parallel" 3 "omplower" } } 
> +! { dg-final { scan-tree-dump-times "private\\(i\\)" 3 "omplower" } } 
> +! { dg-final { scan-tree-dump-times "private\\(j\\)" 2 "omplower" } } 
> +! { dg-final { scan-tree-dump-times "private\\(k\\)" 1 "omplower" } } 

I turned that one and 'gfortran.dg/goacc/private-2.f95' into more
elaborate testcases, committed to trunk in r270405 "[PR90067, PR90114]
Document Fortran OpenACC predetermined private status quo", see attached.


Grüße
 Thomas



["0001-PR90048-Fortran-OpenACC-private-clause-rejecte.trunk.patch" (text/x-diff)]

From b8d03885017763f914a48b19b6cb383239430b97 Mon Sep 17 00:00:00 2001
From: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed, 17 Apr 2019 08:34:20 +0000
Subject: [PATCH] [PR90048] Fortran OpenACC 'private' clause rejected for
 predetermined private loop iteration variable

	gcc/fortran/
	PR fortran/90048
	* openmp.c (gfc_resolve_do_iterator): Handle sharing_clauses for
	OpenACC, too.
	(gfc_resolve_oacc_blocks): Populate sharing_clauses with private
	clauses.
	gcc/testsuite/
	PR fortran/90048
	* gfortran.dg/goacc/private-explicit-kernels-1.f95: New file.
	* gfortran.dg/goacc/private-explicit-parallel-1.f95: Likewise.
	* gfortran.dg/goacc/private-explicit-routine-1.f95: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@270406 \
                138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/fortran/ChangeLog                         |   8 +
 gcc/fortran/openmp.c                          |  20 +-
 gcc/testsuite/ChangeLog                       |   5 +
 .../goacc/private-explicit-kernels-1.f95      | 248 ++++++++++++++++++
 .../goacc/private-explicit-parallel-1.f95     | 247 +++++++++++++++++
 .../goacc/private-explicit-routine-1.f95      | 146 +++++++++++
 6 files changed, 671 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/private-explicit-kernels-1.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/private-explicit-parallel-1.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/private-explicit-routine-1.f95

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index e27743cac280..1ff03e1e85b5 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,11 @@
+2019-04-17  Thomas Schwinge  <thomas@codesourcery.com>
+
+	PR fortran/90048
+	* openmp.c (gfc_resolve_do_iterator): Handle sharing_clauses for
+	OpenACC, too.
+	(gfc_resolve_oacc_blocks): Populate sharing_clauses with private
+	clauses.
+
 2019-04-14  Paul Thomas  <pault@gcc.gnu.org>
 
 	PR fortran/89843
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 9fc236760a1c..1c7bce6c3000 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -5510,8 +5510,7 @@ gfc_resolve_do_iterator (gfc_code *code, gfc_symbol *sym, bool \
add_clause)  if (!omp_current_ctx->is_openmp && !oacc_is_loop \
(omp_current_ctx->code))  return;
 
-  if (omp_current_ctx->is_openmp
-      && omp_current_ctx->sharing_clauses->contains (sym))
+  if (omp_current_ctx->sharing_clauses->contains (sym))
     return;
 
   if (! omp_current_ctx->private_iterators->add (sym) && add_clause)
@@ -5971,19 +5970,34 @@ void
 gfc_resolve_oacc_blocks (gfc_code *code, gfc_namespace *ns)
 {
   fortran_omp_context ctx;
+  gfc_omp_clauses *omp_clauses = code->ext.omp_clauses;
+  gfc_omp_namelist *n;
+  int list;
 
   resolve_oacc_loop_blocks (code);
 
   ctx.code = code;
-  ctx.sharing_clauses = NULL;
+  ctx.sharing_clauses = new hash_set<gfc_symbol *>;
   ctx.private_iterators = new hash_set<gfc_symbol *>;
   ctx.previous = omp_current_ctx;
   ctx.is_openmp = false;
   omp_current_ctx = &ctx;
 
+  for (list = 0; list < OMP_LIST_NUM; list++)
+    switch (list)
+      {
+      case OMP_LIST_PRIVATE:
+	for (n = omp_clauses->lists[list]; n; n = n->next)
+	  ctx.sharing_clauses->add (n->sym);
+	break;
+      default:
+	break;
+      }
+
   gfc_resolve_blocks (code->block, ns);
 
   omp_current_ctx = ctx.previous;
+  delete ctx.sharing_clauses;
   delete ctx.private_iterators;
 }
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0ed8b3c52837..937057421e45 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
 2019-04-17  Thomas Schwinge  <thomas@codesourcery.com>
 
+	PR fortran/90048
+	* gfortran.dg/goacc/private-explicit-kernels-1.f95: New file.
+	* gfortran.dg/goacc/private-explicit-parallel-1.f95: Likewise.
+	* gfortran.dg/goacc/private-explicit-routine-1.f95: Likewise.
+
 	PR fortran/90067
 	PR fortran/90114
 	* gfortran.dg/goacc/private-1.f95: Remove file.
diff --git a/gcc/testsuite/gfortran.dg/goacc/private-explicit-kernels-1.f95 \
b/gcc/testsuite/gfortran.dg/goacc/private-explicit-kernels-1.f95 new file mode 100644
index 000000000000..5d563d226b0c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/private-explicit-kernels-1.f95
@@ -0,0 +1,248 @@
+! Explicit 'private' clauses related to 'do' loops inside an OpenACC
+! 'kernels' construct.
+
+! { dg-additional-options "-fdump-tree-original -fdump-tree-gimple" }
+
+! (The 'independent' clauses are used as end of directive markers in tree dump
+! scanning.)
+
+program test
+  implicit none
+  integer :: i0_1
+  integer :: i0_2, j0_2
+  integer :: i1_s
+  integer :: i1_c
+  integer :: i2_1_s, j2_1_s
+  integer :: i2_1_c, j2_1_c
+  integer :: i2_2_s, j2_2_s
+  integer :: i2_3_s, j2_3_s
+  integer :: i2_3_c, j2_3_c
+  integer :: i3_1_s, j3_1_s, k3_1_s
+  integer :: i3_1_c, j3_1_c, k3_1_c
+  integer :: i3_2_s, j3_2_s, k3_2_s
+  integer :: i3_2_c, j3_2_c, k3_2_c
+  integer :: i3_3_s, j3_3_s, k3_3_s
+  integer :: i3_3_c, j3_3_c, k3_3_c
+  integer :: i3_4_s, j3_4_s, k3_4_s
+  integer :: i3_4_c, j3_4_c, k3_4_c
+  integer :: i3_5_s, j3_5_s, k3_5_s
+
+  !$acc kernels ! Explicit "private(i0_1)" clause cannot be specified here.
+  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "original" { xfail *-*-* \
} } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "gimple" \
{ xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "#pragma omp \
target oacc_kernels map\\(force_tofrom:i0_1 \\\[len: \[0-9\]+\\\]\\)" 0 "gimple" { \
xfail *-*-* } } } ! PR90067 +  do i0_1 = 1, 100
+  end do
+  !$acc end kernels
+
+  !$acc kernels ! Explicit "private(i0_2, j0_2)" clause cannot be specified here.
+  ! { dg-final { scan-tree-dump-times "private\\(i0_2\\)" 1 "original" { xfail *-*-* \
} } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(j0_2\\)" 1 \
"original" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times \
"private\\(i0_2\\)" 1 "gimple" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { \
scan-tree-dump-times "private\\(j0_2\\)" 1 "gimple" { xfail *-*-* } } } ! PR90067 +  \
! { dg-final { scan-tree-dump-times "#pragma omp target oacc_kernels \
map\\(force_tofrom:j0_2 \\\[len: \[0-9\]+\\\]\\) map\\(force_tofrom:i0_2 \\\[len: \
\[0-9\]+\\\]\\)" 0 "gimple" { xfail *-*-* } } } ! PR90067 +  do i0_2 = 1, 100
+     do j0_2 = 1, 100
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels
+  !$acc loop private(i1_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_s\\) independent" 1 "gimple" } } +  do i1_s = 1, 100
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop private(i1_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_c\\) independent" 1 "gimple" } } +  do i1_c = 1, 100
+  end do
+
+  !$acc kernels
+  !$acc loop private(i2_1_s, j2_1_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) \
private\\(j2_1_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) private\\(j2_1_s\\) \
independent" 1 "gimple" } } +  do i2_1_s = 1, 100
+     do j2_1_s = 1, 100
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop private(i2_1_c, j2_1_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_c\\) \
private\\(j2_1_c\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_c\\) private\\(j2_1_c\\) \
independent" 1 "gimple" } } +  do i2_1_c = 1, 100
+     do j2_1_c = 1, 100
+     end do
+  end do
+
+  !$acc kernels ! Explicit "private(i2_2_s)" clause cannot be specified here.
+  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 \
"gimple" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times \
"#pragma omp target oacc_kernels map\\(force_tofrom:i2_2_s \\\[len: \[0-9\]+\\\]\\)" \
0 "gimple" { xfail *-*-* } } } ! PR90067 +  do i2_2_s = 1, 100
+     !$acc loop private(j2_2_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_2_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_2_s\\) independent" 1 "gimple" } } +     do j2_2_s = 1, 100
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels
+  !$acc loop private(i2_3_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_s\\) independent" 1 "gimple" } } +  do i2_3_s = 1, 100
+     !$acc loop private(j2_3_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_s\\) independent" 1 "gimple" } } +     do j2_3_s = 1, 100
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop private(i2_3_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_c\\) independent" 1 "gimple" } } +  do i2_3_c = 1, 100
+     !$acc loop private(j2_3_c) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_c\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_c\\) independent" 1 "gimple" } } +     do j2_3_c = 1, 100
+     end do
+  end do
+
+  !$acc kernels
+  !$acc loop private(i3_1_s, j3_1_s, k3_1_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) \
private\\(j3_1_s\\) private\\(k3_1_s\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) private\\(j3_1_s\\) \
private\\(k3_1_s\\) independent" 1 "gimple" } } +  do i3_1_s = 1, 100
+     do j3_1_s = 1, 100
+        do k3_1_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop private(i3_1_c, j3_1_c, k3_1_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_c\\) \
private\\(j3_1_c\\) private\\(k3_1_c\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_c\\) private\\(j3_1_c\\) \
private\\(k3_1_c\\) independent" 1 "gimple" } } +  do i3_1_c = 1, 100
+     do j3_1_c = 1, 100
+        do k3_1_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc kernels
+  !$acc loop private(i3_2_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_s\\) independent" 1 "gimple" } } +  do i3_2_s = 1, 100
+     !$acc loop private(j3_2_s, k3_2_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) \
private\\(k3_2_s\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) private\\(k3_2_s\\) \
independent" 1 "gimple" } } +     do j3_2_s = 1, 100
+        do k3_2_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop private(i3_2_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_c\\) independent" 1 "gimple" } } +  do i3_2_c = 1, 100
+     !$acc loop private(j3_2_c, k3_2_c) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_c\\) \
private\\(k3_2_c\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_c\\) private\\(k3_2_c\\) \
independent" 1 "gimple" } } +     do j3_2_c = 1, 100
+        do k3_2_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc kernels
+  !$acc loop private(i3_3_s, j3_3_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) \
private\\(j3_3_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) private\\(j3_3_s\\) \
independent" 1 "gimple" } } +  do i3_3_s = 1, 100
+     do j3_3_s = 1, 100
+        !$acc loop private(k3_3_s) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_s\\) independent" 1 "gimple" } } +        do k3_3_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop private(i3_3_c, j3_3_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_c\\) \
private\\(j3_3_c\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_c\\) private\\(j3_3_c\\) \
independent" 1 "gimple" } } +  do i3_3_c = 1, 100
+     do j3_3_c = 1, 100
+        !$acc loop private(k3_3_c) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_c\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_c\\) independent" 1 "gimple" } } +        do k3_3_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc kernels
+  !$acc loop private(i3_4_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_s\\) independent" 1 "gimple" } } +  do i3_4_s = 1, 100
+     !$acc loop private(j3_4_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_s\\) independent" 1 "gimple" } } +     do j3_4_s = 1, 100
+        !$acc loop private(k3_4_s) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_s\\) independent" 1 "gimple" } } +        do k3_4_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop private(i3_4_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_c\\) independent" 1 "gimple" } } +  do i3_4_c = 1, 100
+     !$acc loop private(j3_4_c) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_c\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_c\\) independent" 1 "gimple" } } +     do j3_4_c = 1, 100
+        !$acc loop private(k3_4_c) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_c\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_c\\) independent" 1 "gimple" } } +        do k3_4_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc kernels ! Explicit "private(i3_5_s)" clause cannot be specified here.
+  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 \
"gimple" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times \
"#pragma omp target oacc_kernels map\\(force_tofrom:i3_5_s \\\[len: \[0-9\]+\\\]\\)" \
0 "gimple" { xfail *-*-* } } } ! PR90067 +  do i3_5_s = 1, 100
+     !$acc loop private(j3_5_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_5_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_5_s\\) independent" 1 "gimple" } } +     do j3_5_s = 1, 100
+        !$acc loop private(k3_5_s) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_5_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_5_s\\) independent" 1 "gimple" } } +        do k3_5_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+end program test
diff --git a/gcc/testsuite/gfortran.dg/goacc/private-explicit-parallel-1.f95 \
b/gcc/testsuite/gfortran.dg/goacc/private-explicit-parallel-1.f95 new file mode \
100644 index 000000000000..bac919b645de
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/private-explicit-parallel-1.f95
@@ -0,0 +1,247 @@
+! Explicit 'private' clauses related to 'do' loops inside an OpenACC
+! 'parallel' construct.
+
+! { dg-additional-options "-fdump-tree-original -fdump-tree-gimple" }
+
+! (The 'independent' clauses are used as end of directive markers in tree dump
+! scanning.)
+
+program test
+  implicit none
+  integer :: i0_1
+  integer :: i0_2, j0_2
+  integer :: i1_s
+  integer :: i1_c
+  integer :: i2_1_s, j2_1_s
+  integer :: i2_1_c, j2_1_c
+  integer :: i2_2_s, j2_2_s
+  integer :: i2_3_s, j2_3_s
+  integer :: i2_3_c, j2_3_c
+  integer :: i3_1_s, j3_1_s, k3_1_s
+  integer :: i3_1_c, j3_1_c, k3_1_c
+  integer :: i3_2_s, j3_2_s, k3_2_s
+  integer :: i3_2_c, j3_2_c, k3_2_c
+  integer :: i3_3_s, j3_3_s, k3_3_s
+  integer :: i3_3_c, j3_3_c, k3_3_c
+  integer :: i3_4_s, j3_4_s, k3_4_s
+  integer :: i3_4_c, j3_4_c, k3_4_c
+  integer :: i3_5_s, j3_5_s, k3_5_s
+
+  !$acc parallel private(i0_1)
+  ! { dg-final { scan-tree-dump-times "#pragma acc parallel private\\(i0_1\\)" 1 \
"original" } } +  ! { dg-final { scan-tree-dump-times "#pragma omp target \
oacc_parallel private\\(i0_1\\)" 1 "gimple" } } +  ! { dg-final { \
scan-tree-dump-times "firstprivate\\(i0_1\\)" 0 "gimple" } } +  do i0_1 = 1, 100
+  end do
+  !$acc end parallel
+
+  !$acc parallel private(i0_2, j0_2)
+  ! { dg-final { scan-tree-dump-times "#pragma acc parallel private\\(i0_2\\) \
private\\(j0_2\\)" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma \
omp target oacc_parallel private\\(i0_2\\) private\\(j0_2\\)" 1 "gimple" } } +  ! { \
dg-final { scan-tree-dump-times "firstprivate\\(i0_2\\)" 0 "gimple" } } +  ! { \
dg-final { scan-tree-dump-times "firstprivate\\(j0_2\\)" 0 "gimple" } } +  do i0_2 = \
1, 100 +     do j0_2 = 1, 100
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel
+  !$acc loop private(i1_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_s\\) independent" 1 "gimple" } } +  do i1_s = 1, 100
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop private(i1_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_c\\) independent" 1 "gimple" } } +  do i1_c = 1, 100
+  end do
+
+  !$acc parallel
+  !$acc loop private(i2_1_s, j2_1_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) \
private\\(j2_1_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) private\\(j2_1_s\\) \
independent" 1 "gimple" } } +  do i2_1_s = 1, 100
+     do j2_1_s = 1, 100
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop private(i2_1_c, j2_1_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_c\\) \
private\\(j2_1_c\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_c\\) private\\(j2_1_c\\) \
independent" 1 "gimple" } } +  do i2_1_c = 1, 100
+     do j2_1_c = 1, 100
+     end do
+  end do
+
+  !$acc parallel private(i2_2_s)
+  ! { dg-final { scan-tree-dump-times "#pragma acc parallel private\\(i2_2_s\\)" 1 \
"original" } } +  ! { dg-final { scan-tree-dump-times "#pragma omp target \
oacc_parallel private\\(i2_2_s\\)" 1 "gimple" } } +  ! { dg-final { \
scan-tree-dump-times "firstprivate\\(i2_2_s\\)" 0 "gimple" } } +  do i2_2_s = 1, 100
+     !$acc loop private(j2_2_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_2_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_2_s\\) independent" 1 "gimple" } } +     do j2_2_s = 1, 100
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel
+  !$acc loop private(i2_3_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_s\\) independent" 1 "gimple" } } +  do i2_3_s = 1, 100
+     !$acc loop private(j2_3_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_s\\) independent" 1 "gimple" } } +     do j2_3_s = 1, 100
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop private(i2_3_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_c\\) independent" 1 "gimple" } } +  do i2_3_c = 1, 100
+     !$acc loop private(j2_3_c) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_c\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_c\\) independent" 1 "gimple" } } +     do j2_3_c = 1, 100
+     end do
+  end do
+
+  !$acc parallel
+  !$acc loop private(i3_1_s, j3_1_s, k3_1_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) \
private\\(j3_1_s\\) private\\(k3_1_s\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) private\\(j3_1_s\\) \
private\\(k3_1_s\\) independent" 1 "gimple" } } +  do i3_1_s = 1, 100
+     do j3_1_s = 1, 100
+        do k3_1_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop private(i3_1_c, j3_1_c, k3_1_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_c\\) \
private\\(j3_1_c\\) private\\(k3_1_c\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_c\\) private\\(j3_1_c\\) \
private\\(k3_1_c\\) independent" 1 "gimple" } } +  do i3_1_c = 1, 100
+     do j3_1_c = 1, 100
+        do k3_1_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc parallel
+  !$acc loop private(i3_2_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_s\\) independent" 1 "gimple" } } +  do i3_2_s = 1, 100
+     !$acc loop private(j3_2_s, k3_2_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) \
private\\(k3_2_s\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) private\\(k3_2_s\\) \
independent" 1 "gimple" } } +     do j3_2_s = 1, 100
+        do k3_2_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop private(i3_2_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_c\\) independent" 1 "gimple" } } +  do i3_2_c = 1, 100
+     !$acc loop private(j3_2_c, k3_2_c) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_c\\) \
private\\(k3_2_c\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_c\\) private\\(k3_2_c\\) \
independent" 1 "gimple" } } +     do j3_2_c = 1, 100
+        do k3_2_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc parallel
+  !$acc loop private(i3_3_s, j3_3_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) \
private\\(j3_3_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) private\\(j3_3_s\\) \
independent" 1 "gimple" } } +  do i3_3_s = 1, 100
+     do j3_3_s = 1, 100
+        !$acc loop private(k3_3_s) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_s\\) independent" 1 "gimple" } } +        do k3_3_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop private(i3_3_c, j3_3_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_c\\) \
private\\(j3_3_c\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_c\\) private\\(j3_3_c\\) \
independent" 1 "gimple" } } +  do i3_3_c = 1, 100
+     do j3_3_c = 1, 100
+        !$acc loop private(k3_3_c) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_c\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_c\\) independent" 1 "gimple" } } +        do k3_3_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc parallel
+  !$acc loop private(i3_4_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_s\\) independent" 1 "gimple" } } +  do i3_4_s = 1, 100
+     !$acc loop private(j3_4_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_s\\) independent" 1 "gimple" } } +     do j3_4_s = 1, 100
+        !$acc loop private(k3_4_s) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_s\\) independent" 1 "gimple" } } +        do k3_4_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop private(i3_4_c) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_c\\) independent" 1 "gimple" } } +  do i3_4_c = 1, 100
+     !$acc loop private(j3_4_c) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_c\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_c\\) independent" 1 "gimple" } } +     do j3_4_c = 1, 100
+        !$acc loop private(k3_4_c) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_c\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_c\\) independent" 1 "gimple" } } +        do k3_4_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc parallel private(i3_5_s)
+  ! { dg-final { scan-tree-dump-times "#pragma acc parallel private\\(i3_5_s\\)" 1 \
"original" } } +  ! { dg-final { scan-tree-dump-times "#pragma omp target \
oacc_parallel private\\(i3_5_s\\)" 1 "gimple" } } +  ! { dg-final { \
scan-tree-dump-times "firstprivate\\(i3_5_s\\)" 0 "gimple" } } +  do i3_5_s = 1, 100
+     !$acc loop private(j3_5_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_5_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_5_s\\) independent" 1 "gimple" } } +     do j3_5_s = 1, 100
+        !$acc loop private(k3_5_s) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_5_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_5_s\\) independent" 1 "gimple" } } +        do k3_5_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+end program test
diff --git a/gcc/testsuite/gfortran.dg/goacc/private-explicit-routine-1.f95 \
b/gcc/testsuite/gfortran.dg/goacc/private-explicit-routine-1.f95 new file mode 100644
index 000000000000..b7f8c3d5b378
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/private-explicit-routine-1.f95
@@ -0,0 +1,146 @@
+! Explicit 'private' clauses related to 'do' loops inside an OpenACC
+! accelerator routine.
+
+! { dg-additional-options "-fdump-tree-original -fdump-tree-gimple" }
+
+! (The 'independent' clauses are used as end of directive markers in tree dump
+! scanning.)
+
+! The PR90114 XFAILs need to scan for the appropriate predetermined private
+! level.
+
+subroutine test
+  implicit none
+  integer :: i0_1
+  integer :: i0_2, j0_2
+  integer :: i1_s
+  integer :: i2_1_s, j2_1_s
+  integer :: i2_2_s, j2_2_s
+  integer :: i2_3_s, j2_3_s
+  integer :: i3_1_s, j3_1_s, k3_1_s
+  integer :: i3_2_s, j3_2_s, k3_2_s
+  integer :: i3_3_s, j3_3_s, k3_3_s
+  integer :: i3_4_s, j3_4_s, k3_4_s
+  integer :: i3_5_s, j3_5_s, k3_5_s
+  !$acc routine gang
+
+  ! Explicit "private(i0_1)" clause cannot be specified here.
+  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "original" { xfail *-*-* \
} } } ! PR90114 +  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "gimple" \
{ xfail *-*-* } } } ! PR90114 +  do i0_1 = 1, 100
+  end do
+
+  ! Explicit "private(i0_2, j0_2)" clause cannot be specified here.
+  ! { dg-final { scan-tree-dump-times "private\\(i0_2\\)" 1 "original" { xfail *-*-* \
} } } ! PR90114 +  ! { dg-final { scan-tree-dump-times "private\\(j0_2\\)" 1 \
"original" { xfail *-*-* } } } ! PR90114 +  ! { dg-final { scan-tree-dump-times \
"private\\(i0_2\\)" 1 "gimple" { xfail *-*-* } } } ! PR90114 +  ! { dg-final { \
scan-tree-dump-times "private\\(j0_2\\)" 1 "gimple" { xfail *-*-* } } } ! PR90114 +  \
do i0_2 = 1, 100 +     do j0_2 = 1, 100
+     end do
+  end do
+
+  !$acc loop private(i1_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_s\\) independent" 1 "gimple" } } +  do i1_s = 1, 100
+  end do
+
+  !$acc loop private(i2_1_s, j2_1_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) \
private\\(j2_1_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) private\\(j2_1_s\\) \
independent" 1 "gimple" } } +  do i2_1_s = 1, 100
+     do j2_1_s = 1, 100
+     end do
+  end do
+
+  ! Explicit "private(i2_2_s)" clause cannot be specified here.
+  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90114 +  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 \
"gimple" { xfail *-*-* } } } ! PR90114 +  do i2_2_s = 1, 100
+     !$acc loop private(j2_2_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_2_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_2_s\\) independent" 1 "gimple" } } +     do j2_2_s = 1, 100
+     end do
+  end do
+
+  !$acc loop private(i2_3_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_s\\) independent" 1 "gimple" } } +  do i2_3_s = 1, 100
+     !$acc loop private(j2_3_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_s\\) independent" 1 "gimple" } } +     do j2_3_s = 1, 100
+     end do
+  end do
+
+  !$acc loop private(i3_1_s, j3_1_s, k3_1_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) \
private\\(j3_1_s\\) private\\(k3_1_s\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) private\\(j3_1_s\\) \
private\\(k3_1_s\\) independent" 1 "gimple" } } +  do i3_1_s = 1, 100
+     do j3_1_s = 1, 100
+        do k3_1_s = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc loop private(i3_2_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_s\\) independent" 1 "gimple" } } +  do i3_2_s = 1, 100
+     !$acc loop private(j3_2_s, k3_2_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) \
private\\(k3_2_s\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) private\\(k3_2_s\\) \
independent" 1 "gimple" } } +     do j3_2_s = 1, 100
+        do k3_2_s = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc loop private(i3_3_s, j3_3_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) \
private\\(j3_3_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) private\\(j3_3_s\\) \
independent" 1 "gimple" } } +  do i3_3_s = 1, 100
+     do j3_3_s = 1, 100
+        !$acc loop private(k3_3_s) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_s\\) independent" 1 "gimple" } } +        do k3_3_s = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc loop private(i3_4_s) independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_s\\) independent" 1 "gimple" } } +  do i3_4_s = 1, 100
+     !$acc loop private(j3_4_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_s\\) independent" 1 "gimple" } } +     do j3_4_s = 1, 100
+        !$acc loop private(k3_4_s) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_s\\) independent" 1 "gimple" } } +        do k3_4_s = 1, 100
+        end do
+     end do
+  end do
+
+  ! Explicit "private(i3_5_s)" clause cannot be specified here.
+  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90114 +  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 \
"gimple" { xfail *-*-* } } } ! PR90114 +  do i3_5_s = 1, 100
+     !$acc loop private(j3_5_s) independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_5_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_5_s\\) independent" 1 "gimple" } } +     do j3_5_s = 1, 100
+        !$acc loop private(k3_5_s) independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_5_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_5_s\\) independent" 1 "gimple" } } +        do k3_5_s = 1, 100
+        end do
+     end do
+  end do
+end subroutine test
-- 
2.17.1


["0001-Fortran-Clean-up-gfc_resolve_oacc_blocks.patch" (text/x-diff)]

From e2a781a0e6519ca5b135e697668dbc85dea1fe0f Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Wed, 17 Apr 2019 09:22:06 +0200
Subject: [PATCH] [Fortran] Clean up 'gfc_resolve_oacc_blocks'

Developed in context of PR90048.
---
 gcc/fortran/gfortran.h | 12 ++++++++--
 gcc/fortran/openmp.c   | 52 +++++++++++-------------------------------
 gcc/fortran/resolve.c  |  6 ++---
 3 files changed, 26 insertions(+), 44 deletions(-)

diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index d4426908ed2a..3dc8d57c78b5 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -671,6 +671,14 @@ enum gfc_param_spec_type
   SPEC_DEFERRED
 };
 
+/* Kind of an OMP construct.  */
+
+enum omp_kind
+{
+ OMP_OPENACC,
+ OMP_OPENMP
+};
+
 /************************* Structures *****************************/
 
 /* Used for keeping things in balanced binary trees.  */
@@ -3196,7 +3204,8 @@ gfc_omp_udr *gfc_omp_udr_find (gfc_symtree *, gfc_typespec *);
 void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *);
 void gfc_resolve_do_iterator (gfc_code *, gfc_symbol *, bool);
 void gfc_resolve_omp_local_vars (gfc_namespace *);
-void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *);
+void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *,
+				      enum omp_kind);
 void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *);
 void gfc_resolve_omp_declare_simd (gfc_namespace *);
 void gfc_resolve_omp_udrs (gfc_symtree *);
@@ -3206,7 +3215,6 @@ void gfc_free_expr_list (gfc_expr_list *);
 void gfc_resolve_oacc_directive (gfc_code *, gfc_namespace *);
 void gfc_resolve_oacc_declare (gfc_namespace *);
 void gfc_resolve_oacc_parallel_loop_blocks (gfc_code *, gfc_namespace *);
-void gfc_resolve_oacc_blocks (gfc_code *, gfc_namespace *);
 void gfc_resolve_oacc_routines (gfc_namespace *);
 
 /* expr.c */
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index e372326db1aa..414dd5e355e5 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -5432,9 +5432,15 @@ gfc_resolve_omp_do_blocks (gfc_code *code, gfc_namespace *ns)
 }
 
 
+static void resolve_oacc_loop_blocks (gfc_code *);
+
 void
-gfc_resolve_omp_parallel_blocks (gfc_code *code, gfc_namespace *ns)
+gfc_resolve_omp_parallel_blocks (gfc_code *code, gfc_namespace *ns,
+				 enum omp_kind omp_kind)
 {
+  if (omp_kind == OMP_OPENACC)
+    resolve_oacc_loop_blocks (code);
+
   struct fortran_omp_context ctx;
   gfc_omp_clauses *omp_clauses = code->ext.omp_clauses;
   gfc_omp_namelist *n;
@@ -5444,18 +5450,21 @@ gfc_resolve_omp_parallel_blocks (gfc_code *code, gfc_namespace *ns)
   ctx.sharing_clauses = new hash_set<gfc_symbol *>;
   ctx.private_iterators = new hash_set<gfc_symbol *>;
   ctx.previous = omp_current_ctx;
-  ctx.is_openmp = true;
+  ctx.is_openmp = (omp_kind == OMP_OPENMP);
   omp_current_ctx = &ctx;
 
   for (list = 0; list < OMP_LIST_NUM; list++)
     switch (list)
       {
       case OMP_LIST_SHARED:
-      case OMP_LIST_PRIVATE:
       case OMP_LIST_FIRSTPRIVATE:
       case OMP_LIST_LASTPRIVATE:
       case OMP_LIST_REDUCTION:
       case OMP_LIST_LINEAR:
+	if (omp_kind == OMP_OPENACC)
+	  continue;
+	/* FALLTHRU */
+      case OMP_LIST_PRIVATE:
 	for (n = omp_clauses->lists[list]; n; n = n->next)
 	  ctx.sharing_clauses->add (n->sym);
 	break;
@@ -5479,6 +5488,7 @@ gfc_resolve_omp_parallel_blocks (gfc_code *code, gfc_namespace *ns)
     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
     case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
+      gcc_checking_assert (omp_kind == OMP_OPENMP);
       gfc_resolve_omp_do_blocks (code, ns);
       break;
     default:
@@ -5976,42 +5986,6 @@ resolve_oacc_loop_blocks (gfc_code *code)
 }
 
 
-void
-gfc_resolve_oacc_blocks (gfc_code *code, gfc_namespace *ns)
-{
-  fortran_omp_context ctx;
-  gfc_omp_clauses *omp_clauses = code->ext.omp_clauses;
-  gfc_omp_namelist *n;
-  int list;
-
-  resolve_oacc_loop_blocks (code);
-
-  ctx.code = code;
-  ctx.sharing_clauses = new hash_set<gfc_symbol *>;
-  ctx.private_iterators = new hash_set<gfc_symbol *>;
-  ctx.previous = omp_current_ctx;
-  ctx.is_openmp = false;
-  omp_current_ctx = &ctx;
-
-  for (list = 0; list < OMP_LIST_NUM; list++)
-    switch (list)
-      {
-      case OMP_LIST_PRIVATE:
-	for (n = omp_clauses->lists[list]; n; n = n->next)
-	  ctx.sharing_clauses->add (n->sym);
-	break;
-      default:
-	break;
-      }
-
-  gfc_resolve_blocks (code->block, ns);
-
-  omp_current_ctx = ctx.previous;
-  delete ctx.sharing_clauses;
-  delete ctx.private_iterators;
-}
-
-
 static void
 resolve_oacc_loop (gfc_code *code)
 {
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index cb41da08526f..8ee3f9fb3afb 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -11291,12 +11291,12 @@ gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
 	    case EXEC_OACC_DATA:
 	    case EXEC_OACC_HOST_DATA:
 	    case EXEC_OACC_LOOP:
-	      gfc_resolve_oacc_blocks (code, ns);
+	      gfc_resolve_omp_parallel_blocks (code, ns, OMP_OPENACC);
 	      break;
 	    case EXEC_OMP_PARALLEL_WORKSHARE:
 	      omp_workshare_save = omp_workshare_flag;
 	      omp_workshare_flag = 1;
-	      gfc_resolve_omp_parallel_blocks (code, ns);
+	      gfc_resolve_omp_parallel_blocks (code, ns, OMP_OPENMP);
 	      break;
 	    case EXEC_OMP_PARALLEL:
 	    case EXEC_OMP_PARALLEL_DO:
@@ -11320,7 +11320,7 @@ gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
 	    case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
 	      omp_workshare_save = omp_workshare_flag;
 	      omp_workshare_flag = 0;
-	      gfc_resolve_omp_parallel_blocks (code, ns);
+	      gfc_resolve_omp_parallel_blocks (code, ns, OMP_OPENMP);
 	      break;
 	    case EXEC_OMP_DISTRIBUTE:
 	    case EXEC_OMP_DISTRIBUTE_SIMD:
-- 
2.17.1


["0001-PR90067-PR90114-Document-Fortran-OpenACC-prede.trunk.patch" (text/x-diff)]

From 27d00f9196a9ca0d48b0f0934b715307c4b08f5d Mon Sep 17 00:00:00 2001
From: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed, 17 Apr 2019 08:34:10 +0000
Subject: [PATCH] [PR90067, PR90114] Document Fortran OpenACC predetermined
 private status quo

	gcc/testsuite/
	PR fortran/90067
	PR fortran/90114
	* gfortran.dg/goacc/private-1.f95: Remove file.
	* gfortran.dg/goacc/private-2.f95: Likewise.
	* gfortran.dg/goacc/private-predetermined-kernels-1.f95: New file.
	* gfortran.dg/goacc/private-predetermined-parallel-1.f95:
	Likewise.
	* gfortran.dg/goacc/private-predetermined-routine-1.f95: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@270405 \
                138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/testsuite/ChangeLog                       |  11 +
 gcc/testsuite/gfortran.dg/goacc/private-1.f95 |  37 ---
 gcc/testsuite/gfortran.dg/goacc/private-2.f95 |  39 ---
 .../goacc/private-predetermined-kernels-1.f95 | 248 +++++++++++++++++
 .../private-predetermined-parallel-1.f95      | 253 ++++++++++++++++++
 .../goacc/private-predetermined-routine-1.f95 | 142 ++++++++++
 6 files changed, 654 insertions(+), 76 deletions(-)
 delete mode 100644 gcc/testsuite/gfortran.dg/goacc/private-1.f95
 delete mode 100644 gcc/testsuite/gfortran.dg/goacc/private-2.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/private-predetermined-kernels-1.f95
  create mode 100644 \
gcc/testsuite/gfortran.dg/goacc/private-predetermined-parallel-1.f95  create mode \
100644 gcc/testsuite/gfortran.dg/goacc/private-predetermined-routine-1.f95

diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 23f77ec781a6..0ed8b3c52837 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,14 @@
+2019-04-17  Thomas Schwinge  <thomas@codesourcery.com>
+
+	PR fortran/90067
+	PR fortran/90114
+	* gfortran.dg/goacc/private-1.f95: Remove file.
+	* gfortran.dg/goacc/private-2.f95: Likewise.
+	* gfortran.dg/goacc/private-predetermined-kernels-1.f95: New file.
+	* gfortran.dg/goacc/private-predetermined-parallel-1.f95:
+	Likewise.
+	* gfortran.dg/goacc/private-predetermined-routine-1.f95: Likewise.
+
 2019-04-17  Jakub Jelinek  <jakub@redhat.com>
 
 	PR target/89093
diff --git a/gcc/testsuite/gfortran.dg/goacc/private-1.f95 \
b/gcc/testsuite/gfortran.dg/goacc/private-1.f95 deleted file mode 100644
index 23ce95ad8d24..000000000000
--- a/gcc/testsuite/gfortran.dg/goacc/private-1.f95
+++ /dev/null
@@ -1,37 +0,0 @@
-! { dg-do compile }
-! { dg-additional-options "-fdump-tree-omplower" }
-
-! test for implicit private clauses in do loops
-
-program test
-  implicit none
-  integer :: i, j, k
-
-  !$acc parallel
-  !$acc loop
-  do i = 1, 100
-  end do
-  !$acc end parallel
-
-  !$acc parallel
-  !$acc loop
-  do i = 1, 100
-     do j = 1, 100
-     end do
-  end do
-  !$acc end parallel
-
-  !$acc parallel
-  !$acc loop
-  do i = 1, 100
-     do j = 1, 100
-        do k = 1, 100
-        end do
-     end do
-  end do
-  !$acc end parallel
-end program test
-! { dg-final { scan-tree-dump-times "pragma omp target oacc_parallel" 3 "omplower" } \
                }
-! { dg-final { scan-tree-dump-times "private\\(i\\)" 3 "omplower" } }
-! { dg-final { scan-tree-dump-times "private\\(j\\)" 2 "omplower" } }
-! { dg-final { scan-tree-dump-times "private\\(k\\)" 1 "omplower" } }
diff --git a/gcc/testsuite/gfortran.dg/goacc/private-2.f95 \
b/gcc/testsuite/gfortran.dg/goacc/private-2.f95 deleted file mode 100644
index 4b038f2b5f20..000000000000
--- a/gcc/testsuite/gfortran.dg/goacc/private-2.f95
+++ /dev/null
@@ -1,39 +0,0 @@
-! { dg-do compile }
-
-! test for implicit private clauses in do loops
-
-program test
-  implicit none
-  integer :: i, j, k, a(10)
-
-  !$acc parallel
-  !$acc loop
-  do i = 1, 100
-  end do
-  !$acc end parallel
-
-  !$acc parallel
-  !$acc loop
-  do i = 1, 100
-     do j = 1, 100
-     end do
-  end do
-  !$acc end parallel
-
-  !$acc data copy(a)
-
-  if(mod(1,10) .eq. 0) write(*,'(i5)') i
-
-  do i = 1, 100
-    !$acc parallel
-    !$acc loop
-     do j = 1, 100
-        do k = 1, 100
-        end do
-     end do
-    !$acc end parallel
-  end do
-
-  !$acc end data
-
-end program test
diff --git a/gcc/testsuite/gfortran.dg/goacc/private-predetermined-kernels-1.f95 \
b/gcc/testsuite/gfortran.dg/goacc/private-predetermined-kernels-1.f95 new file mode \
100644 index 000000000000..12a7854526a9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/private-predetermined-kernels-1.f95
@@ -0,0 +1,248 @@
+! Predetermined 'private' clauses related to 'do' loops inside an OpenACC
+! 'kernels' construct.
+
+! { dg-additional-options "-fdump-tree-original -fdump-tree-gimple" }
+
+! (The 'independent' clauses are used as end of directive markers in tree dump
+! scanning.)
+
+program test
+  implicit none
+  integer :: i0_1
+  integer :: i0_2, j0_2
+  integer :: i1_s
+  integer :: i1_c
+  integer :: i2_1_s, j2_1_s
+  integer :: i2_1_c, j2_1_c
+  integer :: i2_2_s, j2_2_s
+  integer :: i2_3_s, j2_3_s
+  integer :: i2_3_c, j2_3_c
+  integer :: i3_1_s, j3_1_s, k3_1_s
+  integer :: i3_1_c, j3_1_c, k3_1_c
+  integer :: i3_2_s, j3_2_s, k3_2_s
+  integer :: i3_2_c, j3_2_c, k3_2_c
+  integer :: i3_3_s, j3_3_s, k3_3_s
+  integer :: i3_3_c, j3_3_c, k3_3_c
+  integer :: i3_4_s, j3_4_s, k3_4_s
+  integer :: i3_4_c, j3_4_c, k3_4_c
+  integer :: i3_5_s, j3_5_s, k3_5_s
+
+  !$acc kernels
+  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "original" { xfail *-*-* \
} } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "gimple" \
{ xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "#pragma omp \
target oacc_kernels map\\(force_tofrom:i0_1 \\\[len: \[0-9\]+\\\]\\)" 0 "gimple" { \
xfail *-*-* } } } ! PR90067 +  do i0_1 = 1, 100
+  end do
+  !$acc end kernels
+
+  !$acc kernels
+  ! { dg-final { scan-tree-dump-times "private\\(i0_2\\)" 1 "original" { xfail *-*-* \
} } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(j0_2\\)" 1 \
"original" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times \
"private\\(i0_2\\)" 1 "gimple" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { \
scan-tree-dump-times "private\\(j0_2\\)" 1 "gimple" { xfail *-*-* } } } ! PR90067 +  \
! { dg-final { scan-tree-dump-times "#pragma omp target oacc_kernels \
map\\(force_tofrom:j0_2 \\\[len: \[0-9\]+\\\]\\) map\\(force_tofrom:i0_2 \\\[len: \
\[0-9\]+\\\]\\)" 0 "gimple" { xfail *-*-* } } } ! PR90067 +  do i0_2 = 1, 100
+     do j0_2 = 1, 100
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_s\\) independent" 1 "gimple" } } +  do i1_s = 1, 100
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_c\\) independent" 1 "gimple" } } +  do i1_c = 1, 100
+  end do
+
+  !$acc kernels
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) \
private\\(j2_1_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) private\\(j2_1_s\\) \
independent" 1 "gimple" } } +  do i2_1_s = 1, 100
+     do j2_1_s = 1, 100
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_c\\) \
private\\(j2_1_c\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_c\\) private\\(j2_1_c\\) \
independent" 1 "gimple" } } +  do i2_1_c = 1, 100
+     do j2_1_c = 1, 100
+     end do
+  end do
+
+  !$acc kernels
+  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 \
"gimple" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times \
"#pragma omp target oacc_kernels map\\(force_tofrom:i2_2_s \\\[len: \[0-9\]+\\\]\\)" \
0 "gimple" { xfail *-*-* } } } ! PR90067 +  do i2_2_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_2_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_2_s\\) independent" 1 "gimple" } } +     do j2_2_s = 1, 100
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_s\\) independent" 1 "gimple" } } +  do i2_3_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_s\\) independent" 1 "gimple" } } +     do j2_3_s = 1, 100
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_c\\) independent" 1 "gimple" } } +  do i2_3_c = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_c\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_c\\) independent" 1 "gimple" } } +     do j2_3_c = 1, 100
+     end do
+  end do
+
+  !$acc kernels
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) \
private\\(j3_1_s\\) private\\(k3_1_s\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) private\\(j3_1_s\\) \
private\\(k3_1_s\\) independent" 1 "gimple" } } +  do i3_1_s = 1, 100
+     do j3_1_s = 1, 100
+        do k3_1_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_c\\) \
private\\(j3_1_c\\) private\\(k3_1_c\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_c\\) private\\(j3_1_c\\) \
private\\(k3_1_c\\) independent" 1 "gimple" } } +  do i3_1_c = 1, 100
+     do j3_1_c = 1, 100
+        do k3_1_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc kernels
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_s\\) independent" 1 "gimple" } } +  do i3_2_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) \
private\\(k3_2_s\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) private\\(k3_2_s\\) \
independent" 1 "gimple" } } +     do j3_2_s = 1, 100
+        do k3_2_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_c\\) independent" 1 "gimple" } } +  do i3_2_c = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_c\\) \
private\\(k3_2_c\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_c\\) private\\(k3_2_c\\) \
independent" 1 "gimple" } } +     do j3_2_c = 1, 100
+        do k3_2_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc kernels
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) \
private\\(j3_3_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) private\\(j3_3_s\\) \
independent" 1 "gimple" } } +  do i3_3_s = 1, 100
+     do j3_3_s = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_s\\) independent" 1 "gimple" } } +        do k3_3_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_c\\) \
private\\(j3_3_c\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_c\\) private\\(j3_3_c\\) \
independent" 1 "gimple" } } +  do i3_3_c = 1, 100
+     do j3_3_c = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_c\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_c\\) independent" 1 "gimple" } } +        do k3_3_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc kernels
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_s\\) independent" 1 "gimple" } } +  do i3_4_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_s\\) independent" 1 "gimple" } } +     do j3_4_s = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_s\\) independent" 1 "gimple" } } +        do k3_4_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+
+  !$acc kernels loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_c\\) independent" 1 "gimple" } } +  do i3_4_c = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_c\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_c\\) independent" 1 "gimple" } } +     do j3_4_c = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_c\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_c\\) independent" 1 "gimple" } } +        do k3_4_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc kernels
+  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 \
"gimple" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times \
"#pragma omp target oacc_kernels map\\(force_tofrom:i3_5_s \\\[len: \[0-9\]+\\\]\\)" \
0 "gimple" { xfail *-*-* } } } ! PR90067 +  do i3_5_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_5_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_5_s\\) independent" 1 "gimple" } } +     do j3_5_s = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_5_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_5_s\\) independent" 1 "gimple" } } +        do k3_5_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end kernels
+end program test
diff --git a/gcc/testsuite/gfortran.dg/goacc/private-predetermined-parallel-1.f95 \
b/gcc/testsuite/gfortran.dg/goacc/private-predetermined-parallel-1.f95 new file mode \
100644 index 000000000000..a2fa71a58b72
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/private-predetermined-parallel-1.f95
@@ -0,0 +1,253 @@
+! Predetermined 'private' clauses related to 'do' loops inside an OpenACC
+! 'parallel' construct.
+
+! { dg-additional-options "-fdump-tree-original -fdump-tree-gimple" }
+
+! (The 'independent' clauses are used as end of directive markers in tree dump
+! scanning.)
+
+program test
+  implicit none
+  integer :: i0_1
+  integer :: i0_2, j0_2
+  integer :: i1_s
+  integer :: i1_c
+  integer :: i2_1_s, j2_1_s
+  integer :: i2_1_c, j2_1_c
+  integer :: i2_2_s, j2_2_s
+  integer :: i2_3_s, j2_3_s
+  integer :: i2_3_c, j2_3_c
+  integer :: i3_1_s, j3_1_s, k3_1_s
+  integer :: i3_1_c, j3_1_c, k3_1_c
+  integer :: i3_2_s, j3_2_s, k3_2_s
+  integer :: i3_2_c, j3_2_c, k3_2_c
+  integer :: i3_3_s, j3_3_s, k3_3_s
+  integer :: i3_3_c, j3_3_c, k3_3_c
+  integer :: i3_4_s, j3_4_s, k3_4_s
+  integer :: i3_4_c, j3_4_c, k3_4_c
+  integer :: i3_5_s, j3_5_s, k3_5_s
+
+  !$acc parallel
+  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "original" { xfail *-*-* \
} } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "gimple" \
} } +  ! { dg-final { scan-tree-dump-times "firstprivate\\(i0_1\\)" 0 "gimple" { \
xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "#pragma omp \
target oacc_parallel firstprivate\\(i0_1\\)" 0 "gimple" { xfail *-*-* } } } ! PR90067 \
+  do i0_1 = 1, 100 +  end do
+  !$acc end parallel
+
+  !$acc parallel
+  ! { dg-final { scan-tree-dump-times "private\\(i0_2\\)" 1 "original" { xfail *-*-* \
} } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(j0_2\\)" 1 \
"original" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times \
"private\\(i0_2\\)" 1 "gimple" } } +  ! { dg-final { scan-tree-dump-times \
"private\\(j0_2\\)" 1 "gimple" } } +  ! { dg-final { scan-tree-dump-times \
"firstprivate\\(i0_2\\)" 0 "gimple" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { \
scan-tree-dump-times "firstprivate\\(j0_2\\)" 0 "gimple" { xfail *-*-* } } } ! \
PR90067 +  ! { dg-final { scan-tree-dump-times "#pragma omp target oacc_parallel \
firstprivate\\(j0_2\\) firstprivate\\(i0_2\\)" 0 "gimple" { xfail *-*-* } } } ! \
PR90067 +  do i0_2 = 1, 100
+     do j0_2 = 1, 100
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_s\\) independent" 1 "gimple" } } +  do i1_s = 1, 100
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_c\\) independent" 1 "gimple" } } +  do i1_c = 1, 100
+  end do
+
+  !$acc parallel
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) \
private\\(j2_1_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) private\\(j2_1_s\\) \
independent" 1 "gimple" } } +  do i2_1_s = 1, 100
+     do j2_1_s = 1, 100
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_c\\) \
private\\(j2_1_c\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_c\\) private\\(j2_1_c\\) \
independent" 1 "gimple" } } +  do i2_1_c = 1, 100
+     do j2_1_c = 1, 100
+     end do
+  end do
+
+  !$acc parallel
+  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 \
"gimple" } } +  ! { dg-final { scan-tree-dump-times "firstprivate\\(i2_2_s\\)" 0 \
"gimple" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times \
"#pragma omp target oacc_parallel firstprivate\\(i2_2_s\\)" 0 "gimple" { xfail *-*-* \
} } } ! PR90067 +  do i2_2_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_2_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_2_s\\) independent" 1 "gimple" } } +     do j2_2_s = 1, 100
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_s\\) independent" 1 "gimple" } } +  do i2_3_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_s\\) independent" 1 "gimple" } } +     do j2_3_s = 1, 100
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_c\\) independent" 1 "gimple" } } +  do i2_3_c = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_c\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_c\\) independent" 1 "gimple" } } +     do j2_3_c = 1, 100
+     end do
+  end do
+
+  !$acc parallel
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) \
private\\(j3_1_s\\) private\\(k3_1_s\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) private\\(j3_1_s\\) \
private\\(k3_1_s\\) independent" 1 "gimple" } } +  do i3_1_s = 1, 100
+     do j3_1_s = 1, 100
+        do k3_1_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_c\\) \
private\\(j3_1_c\\) private\\(k3_1_c\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_c\\) private\\(j3_1_c\\) \
private\\(k3_1_c\\) independent" 1 "gimple" } } +  do i3_1_c = 1, 100
+     do j3_1_c = 1, 100
+        do k3_1_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc parallel
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_s\\) independent" 1 "gimple" } } +  do i3_2_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) \
private\\(k3_2_s\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) private\\(k3_2_s\\) \
independent" 1 "gimple" } } +     do j3_2_s = 1, 100
+        do k3_2_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_c\\) independent" 1 "gimple" } } +  do i3_2_c = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_c\\) \
private\\(k3_2_c\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_c\\) private\\(k3_2_c\\) \
independent" 1 "gimple" } } +     do j3_2_c = 1, 100
+        do k3_2_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc parallel
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) \
private\\(j3_3_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) private\\(j3_3_s\\) \
independent" 1 "gimple" } } +  do i3_3_s = 1, 100
+     do j3_3_s = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_s\\) independent" 1 "gimple" } } +        do k3_3_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_c\\) \
private\\(j3_3_c\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_c\\) private\\(j3_3_c\\) \
independent" 1 "gimple" } } +  do i3_3_c = 1, 100
+     do j3_3_c = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_c\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_c\\) independent" 1 "gimple" } } +        do k3_3_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc parallel
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_s\\) independent" 1 "gimple" } } +  do i3_4_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_s\\) independent" 1 "gimple" } } +     do j3_4_s = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_s\\) independent" 1 "gimple" } } +        do k3_4_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+
+  !$acc parallel loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_c\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_c\\) independent" 1 "gimple" } } +  do i3_4_c = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_c\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_c\\) independent" 1 "gimple" } } +     do j3_4_c = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_c\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_c\\) independent" 1 "gimple" } } +        do k3_4_c = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc parallel
+  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 \
"gimple" } } +  ! { dg-final { scan-tree-dump-times "firstprivate\\(i3_5_s\\)" 0 \
"gimple" { xfail *-*-* } } } ! PR90067 +  ! { dg-final { scan-tree-dump-times \
"#pragma omp target oacc_parallel firstprivate\\(i3_5_s\\)" 0 "gimple" { xfail *-*-* \
} } } ! PR90067 +  do i3_5_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_5_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_5_s\\) independent" 1 "gimple" } } +     do j3_5_s = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_5_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_5_s\\) independent" 1 "gimple" } } +        do k3_5_s = 1, 100
+        end do
+     end do
+  end do
+  !$acc end parallel
+end program test
diff --git a/gcc/testsuite/gfortran.dg/goacc/private-predetermined-routine-1.f95 \
b/gcc/testsuite/gfortran.dg/goacc/private-predetermined-routine-1.f95 new file mode \
100644 index 000000000000..6190669d63ae
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/private-predetermined-routine-1.f95
@@ -0,0 +1,142 @@
+! Predetermined 'private' clauses related to 'do' loops inside an OpenACC
+! accelerator routine.
+
+! { dg-additional-options "-fdump-tree-original -fdump-tree-gimple" }
+
+! (The 'independent' clauses are used as end of directive markers in tree dump
+! scanning.)
+
+! The PR90114 XFAILs need to scan for the appropriate predetermined private
+! level.
+
+subroutine test
+  implicit none
+  integer :: i0_1
+  integer :: i0_2, j0_2
+  integer :: i1_s
+  integer :: i2_1_s, j2_1_s
+  integer :: i2_2_s, j2_2_s
+  integer :: i2_3_s, j2_3_s
+  integer :: i3_1_s, j3_1_s, k3_1_s
+  integer :: i3_2_s, j3_2_s, k3_2_s
+  integer :: i3_3_s, j3_3_s, k3_3_s
+  integer :: i3_4_s, j3_4_s, k3_4_s
+  integer :: i3_5_s, j3_5_s, k3_5_s
+  !$acc routine gang
+
+  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "original" { xfail *-*-* \
} } } ! PR90114 +  ! { dg-final { scan-tree-dump-times "private\\(i0_1\\)" 1 "gimple" \
{ xfail *-*-* } } } ! PR90114 +  do i0_1 = 1, 100
+  end do
+
+  ! { dg-final { scan-tree-dump-times "private\\(i0_2\\)" 1 "original" { xfail *-*-* \
} } } ! PR90114 +  ! { dg-final { scan-tree-dump-times "private\\(j0_2\\)" 1 \
"original" { xfail *-*-* } } } ! PR90114 +  ! { dg-final { scan-tree-dump-times \
"private\\(i0_2\\)" 1 "gimple" { xfail *-*-* } } } ! PR90114 +  ! { dg-final { \
scan-tree-dump-times "private\\(j0_2\\)" 1 "gimple" { xfail *-*-* } } } ! PR90114 +  \
do i0_2 = 1, 100 +     do j0_2 = 1, 100
+     end do
+  end do
+
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i1_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i1_s\\) independent" 1 "gimple" } } +  do i1_s = 1, 100
+  end do
+
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) \
private\\(j2_1_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i2_1_s\\) private\\(j2_1_s\\) \
independent" 1 "gimple" } } +  do i2_1_s = 1, 100
+     do j2_1_s = 1, 100
+     end do
+  end do
+
+  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90114 +  ! { dg-final { scan-tree-dump-times "private\\(i2_2_s\\)" 1 \
"gimple" { xfail *-*-* } } } ! PR90114 +  do i2_2_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_2_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_2_s\\) independent" 1 "gimple" } } +     do j2_2_s = 1, 100
+     end do
+  end do
+
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i2_3_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i2_3_s\\) independent" 1 "gimple" } } +  do i2_3_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j2_3_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j2_3_s\\) independent" 1 "gimple" } } +     do j2_3_s = 1, 100
+     end do
+  end do
+
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) \
private\\(j3_1_s\\) private\\(k3_1_s\\) independent" 1 "original" } } +  ! { dg-final \
{ scan-tree-dump-times "#pragma acc loop private\\(i3_1_s\\) private\\(j3_1_s\\) \
private\\(k3_1_s\\) independent" 1 "gimple" } } +  do i3_1_s = 1, 100
+     do j3_1_s = 1, 100
+        do k3_1_s = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_2_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_2_s\\) independent" 1 "gimple" } } +  do i3_2_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) \
private\\(k3_2_s\\) independent" 1 "original" } } +     ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(j3_2_s\\) private\\(k3_2_s\\) \
independent" 1 "gimple" } } +     do j3_2_s = 1, 100
+        do k3_2_s = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) \
private\\(j3_3_s\\) independent" 1 "original" } } +  ! { dg-final { \
scan-tree-dump-times "#pragma acc loop private\\(i3_3_s\\) private\\(j3_3_s\\) \
independent" 1 "gimple" } } +  do i3_3_s = 1, 100
+     do j3_3_s = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_3_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_3_s\\) independent" 1 "gimple" } } +        do k3_3_s = 1, 100
+        end do
+     end do
+  end do
+
+  !$acc loop independent
+  ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(i3_4_s\\) \
independent" 1 "original" } } +  ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(i3_4_s\\) independent" 1 "gimple" } } +  do i3_4_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_4_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_4_s\\) independent" 1 "gimple" } } +     do j3_4_s = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_4_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_4_s\\) independent" 1 "gimple" } } +        do k3_4_s = 1, 100
+        end do
+     end do
+  end do
+
+  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 "original" { xfail \
*-*-* } } } ! PR90114 +  ! { dg-final { scan-tree-dump-times "private\\(i3_5_s\\)" 1 \
"gimple" { xfail *-*-* } } } ! PR90114 +  do i3_5_s = 1, 100
+     !$acc loop independent
+     ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(j3_5_s\\) \
independent" 1 "original" } } +     ! { dg-final { scan-tree-dump-times "#pragma acc \
loop private\\(j3_5_s\\) independent" 1 "gimple" } } +     do j3_5_s = 1, 100
+        !$acc loop independent
+        ! { dg-final { scan-tree-dump-times "#pragma acc loop private\\(k3_5_s\\) \
independent" 1 "original" } } +        ! { dg-final { scan-tree-dump-times "#pragma \
acc loop private\\(k3_5_s\\) independent" 1 "gimple" } } +        do k3_5_s = 1, 100
+        end do
+     end do
+  end do
+end subroutine test
-- 
2.17.1



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic