Handle OpenACC 'self' clause for compute constructs in OpenACC 'kernels' decomposition

... to fix up recent commit 3a3596389c
"OpenACC 2.7: Implement self clause for compute constructs" for that case.

	gcc/
	* omp-oacc-kernels-decompose.cc (omp_oacc_kernels_decompose_1):
	Handle 'OMP_CLAUSE_SELF' like 'OMP_CLAUSE_IF'.
	* omp-expand.cc (expand_omp_target): Handle 'OMP_CLAUSE_SELF' for
	'GF_OMP_TARGET_KIND_OACC_DATA_KERNELS'.
	gcc/testsuite/
	* c-c++-common/goacc/self-clause-2.c: Verify
	'--param=openacc-kernels=decompose'.
	* gfortran.dg/goacc/kernels-tree.f95: Adjust.
	libgomp/
	* oacc-parallel.c (GOACC_data_start): Handle
	'GOACC_FLAG_LOCAL_DEVICE'.
	(GOACC_parallel_keyed): Simplify accordingly.
	* testsuite/libgomp.oacc-fortran/self-1.f90: Adjust.
This commit is contained in:
Thomas Schwinge 2023-10-23 15:28:30 +02:00
parent 047841a68e
commit 7b2ae64b68
6 changed files with 39 additions and 30 deletions

View File

@ -10334,9 +10334,19 @@ expand_omp_target (struct omp_region *region)
if ((c = omp_find_clause (clauses, OMP_CLAUSE_SELF)) != NULL_TREE) if ((c = omp_find_clause (clauses, OMP_CLAUSE_SELF)) != NULL_TREE)
{ {
gcc_assert (is_gimple_omp_oacc (entry_stmt) && offloaded); gcc_assert ((is_gimple_omp_oacc (entry_stmt) && offloaded)
|| (gimple_omp_target_kind (entry_stmt)
== GF_OMP_TARGET_KIND_OACC_DATA_KERNELS));
edge e = split_block_after_labels (new_bb); edge e;
if (offloaded)
e = split_block_after_labels (new_bb);
else
{
gsi = gsi_last_nondebug_bb (new_bb);
gsi_prev (&gsi);
e = split_block (new_bb, gsi_stmt (gsi));
}
basic_block cond_bb = e->src; basic_block cond_bb = e->src;
new_bb = e->dest; new_bb = e->dest;
remove_edge (e); remove_edge (e);

View File

@ -1519,17 +1519,18 @@ omp_oacc_kernels_decompose_1 (gimple *kernels_stmt)
break; break;
} }
} }
else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IF) else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IF
|| OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SELF)
{ {
/* If there is an 'if' clause, it must be duplicated to the /* If there is an 'if' or 'self' clause, it must be duplicated to the
enclosing data region. Temporarily remove the if clause's enclosing data region. Temporarily remove its chain to avoid
chain to avoid copying it. */ copying it. */
tree saved_chain = OMP_CLAUSE_CHAIN (c); tree saved_chain = OMP_CLAUSE_CHAIN (c);
OMP_CLAUSE_CHAIN (c) = NULL; OMP_CLAUSE_CHAIN (c) = NULL;
tree new_if_clause = unshare_expr (c); tree new_clause = unshare_expr (c);
OMP_CLAUSE_CHAIN (c) = saved_chain; OMP_CLAUSE_CHAIN (c) = saved_chain;
OMP_CLAUSE_CHAIN (new_if_clause) = data_clauses; OMP_CLAUSE_CHAIN (new_clause) = data_clauses;
data_clauses = new_if_clause; data_clauses = new_clause;
} }
} }
/* Restore the original order of the clauses. */ /* Restore the original order of the clauses. */

View File

@ -1,6 +1,8 @@
/* See also 'if-clause-2.c'. */ /* See also 'if-clause-2.c'. */
/* { dg-additional-options "-fdump-tree-gimple" } */ /* { dg-additional-options "-fdump-tree-gimple" } */
/* { dg-additional-options "--param=openacc-kernels=decompose" }
{ dg-additional-options "-fdump-tree-omp_oacc_kernels_decompose" } */
void void
f (short c) f (short c)
@ -11,6 +13,8 @@ f (short c)
#pragma acc kernels self(c) copy(c) #pragma acc kernels self(c) copy(c)
/* { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_kernels map\(tofrom:c \[len: [0-9]+\]\) self\(_[0-9]+\)$} 1 "gimple" } } */ /* { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_kernels map\(tofrom:c \[len: [0-9]+\]\) self\(_[0-9]+\)$} 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_data_kernels map\(tofrom:c \[len: [0-9]+\]\) self\(_[0-9]+\)$} 1 "omp_oacc_kernels_decompose" } }
{ dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_parallel_kernels_gang_single async\(-1\) num_gangs\(1\) map\(force_present:c \[len: [0-9]+\]\) self\(_[0-9]+\)$} 1 "omp_oacc_kernels_decompose" } } */
++c; ++c;
#pragma acc serial self(c) copy(c) #pragma acc serial self(c) copy(c)
@ -29,6 +33,8 @@ g (short d)
#pragma acc kernels self copy(d) #pragma acc kernels self copy(d)
/* { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_kernels map\(tofrom:d \[len: [0-9]+\]\) self\(1\)$} 1 "gimple" } } */ /* { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_kernels map\(tofrom:d \[len: [0-9]+\]\) self\(1\)$} 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_data_kernels map\(tofrom:d \[len: [0-9]+\]\) self\(1\)$} 1 "omp_oacc_kernels_decompose" } }
{ dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_parallel_kernels_gang_single async\(-1\) num_gangs\(1\) map\(force_present:d \[len: [0-9]+\]\) self\(1+\)$} 1 "omp_oacc_kernels_decompose" } } */
++d; ++d;
#pragma acc serial self copy(d) #pragma acc serial self copy(d)

View File

@ -42,5 +42,5 @@ end program test
! { dg-final { scan-tree-dump-times "map\\(force_deviceptr:u\\)" 1 "original" } } ! { dg-final { scan-tree-dump-times "map\\(force_deviceptr:u\\)" 1 "original" } }
! { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_data_kernels if\((?:D\.|_)[0-9]+\)$} 1 "omp_oacc_kernels_decompose" } } ! { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_data_kernels if\((?:D\.|_)[0-9]+\) self\(1\)$} 1 "omp_oacc_kernels_decompose" } }
! { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_parallel_kernels_gang_single num_gangs\(1\) if\((?:D\.|_)[0-9]+\) self\(1\) async\(-1\)$} 1 "omp_oacc_kernels_decompose" } } ! { dg-final { scan-tree-dump-times {(?n)#pragma omp target oacc_parallel_kernels_gang_single num_gangs\(1\) if\((?:D\.|_)[0-9]+\) self\(1\) async\(-1\)$} 1 "omp_oacc_kernels_decompose" } }

View File

@ -184,19 +184,11 @@ GOACC_parallel_keyed (int flags_m, void (*fn) (void *),
/* Host fallback if "if" clause is false or if the current device is set to /* Host fallback if "if" clause is false or if the current device is set to
the host. */ the host. */
if (flags & GOACC_FLAG_HOST_FALLBACK) if ((flags & GOACC_FLAG_HOST_FALLBACK)
{
prof_info.device_type = acc_device_host;
api_info.device_type = prof_info.device_type;
goacc_save_and_set_bind (acc_device_host);
fn (hostaddrs);
goacc_restore_bind ();
goto out_prof;
}
else if (flags & GOACC_FLAG_LOCAL_DEVICE)
{
/* TODO: a proper pthreads based "multi-core CPU" local device /* TODO: a proper pthreads based "multi-core CPU" local device
implementation. Currently, this is still the same as host-fallback. */ implementation. Currently, this is still the same as host-fallback. */
|| (flags & GOACC_FLAG_LOCAL_DEVICE))
{
prof_info.device_type = acc_device_host; prof_info.device_type = acc_device_host;
api_info.device_type = prof_info.device_type; api_info.device_type = prof_info.device_type;
goacc_save_and_set_bind (acc_device_host); goacc_save_and_set_bind (acc_device_host);
@ -457,7 +449,8 @@ GOACC_data_start (int flags_m, size_t mapnum,
/* Host fallback or 'do nothing'. */ /* Host fallback or 'do nothing'. */
if ((acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) if ((acc_dev->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)
|| (flags & GOACC_FLAG_HOST_FALLBACK)) || (flags & GOACC_FLAG_HOST_FALLBACK)
|| (flags & GOACC_FLAG_LOCAL_DEVICE))
{ {
prof_info.device_type = acc_device_host; prof_info.device_type = acc_device_host;
api_info.device_type = prof_info.device_type; api_info.device_type = prof_info.device_type;

View File

@ -2,7 +2,6 @@
! This is 'if-1.f90' with 'self(!cond)' instead of 'if(cond)' on compute ! This is 'if-1.f90' with 'self(!cond)' instead of 'if(cond)' on compute
! constructs. ! constructs.
! ..., which the exception of certain 'kernels' constructs.
! { dg-do run } ! { dg-do run }
! { dg-additional-options "-cpp" } ! { dg-additional-options "-cpp" }
@ -523,7 +522,7 @@ program main
a(:) = 16.0 a(:) = 16.0
!$acc kernels if (0 == 1) ! { dg-line l_compute[incr c_compute] } !$acc kernels self (0 /= 1) ! { dg-line l_compute[incr c_compute] }
! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute } ! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute }
! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */ ! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */
! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 } ! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 }
@ -569,7 +568,7 @@ program main
a(:) = 22.0 a(:) = 22.0
!$acc kernels if (zero == 1) ! { dg-line l_compute[incr c_compute] } !$acc kernels self (zero /= 1) ! { dg-line l_compute[incr c_compute] }
! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute } ! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute }
! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */ ! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */
! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 } ! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 }
@ -615,7 +614,7 @@ program main
a(:) = 76.0 a(:) = 76.0
!$acc kernels if (.FALSE.) ! { dg-line l_compute[incr c_compute] } !$acc kernels self (.TRUE.) ! { dg-line l_compute[incr c_compute] }
! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute } ! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute }
! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */ ! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */
! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 } ! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 }
@ -665,7 +664,7 @@ program main
nn = 0 nn = 0
!$acc kernels if (nn == 1) ! { dg-line l_compute[incr c_compute] } !$acc kernels self (nn /= 1) ! { dg-line l_compute[incr c_compute] }
! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute } ! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute }
! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */ ! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */
! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 } ! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 }
@ -715,7 +714,7 @@ program main
nn = 0; nn = 0;
!$acc kernels copyin (a(1:N)) copyout (b(1:N)) if ((nn + nn) > 0) ! { dg-line l_compute[incr c_compute] } !$acc kernels copyin (a(1:N)) copyout (b(1:N)) self (.NOT. ((nn + nn) > 0)) ! { dg-line l_compute[incr c_compute] }
! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute } ! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute }
! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */ ! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */
! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 } ! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 }
@ -735,7 +734,7 @@ program main
a(:) = 91.0 a(:) = 91.0
!$acc kernels copyin (a(1:N)) copyout (b(1:N)) if (-2 > 0) ! { dg-line l_compute[incr c_compute] } !$acc kernels copyin (a(1:N)) copyout (b(1:N)) self (.NOT. (-2 > 0)) ! { dg-line l_compute[incr c_compute] }
! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute } ! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute }
! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */ ! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */
! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 } ! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 }
@ -781,7 +780,7 @@ program main
a(:) = 87.0 a(:) = 87.0
!$acc kernels if (one == 0) ! { dg-line l_compute[incr c_compute] } !$acc kernels self (one /= 0) ! { dg-line l_compute[incr c_compute] }
! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute } ! { dg-note {OpenACC 'kernels' decomposition: variable 'i' in 'copy' clause requested to be made addressable} {} { target *-*-* } l_compute$c_compute }
! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */ ! { dg-note {variable 'i' already made addressable} {} { target *-*-* } l_compute$c_compute } */
! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 } ! { dg-note {beginning 'parloops' part in OpenACC 'kernels' region} "" { target *-*-* } .+1 }