mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
047841a68e
commit
7b2ae64b68
|
@ -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);
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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" } }
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 }
|
||||||
|
|
Loading…
Reference in New Issue