Hi! On Sun, 2 Aug 2015 21:23:30 -0400, Nathan Sidwell wrote: > I've committed this to gomp4 branch. It expands the acc_on_device builtin > earlier in the new oacc_xform pass. This will allow more optimization earlier on. As far as I remember, the Fortran front end doesn't know about/doesn't know how to use these GCC builtins, so it's not currently able to do such compile-time folding of acc_on_device. > libgomp/ > * openacc.h (acc_on_device): Take int and explain why. > --- libgomp/openacc.h (revision 226462) > +++ libgomp/openacc.h (working copy) > @@ -78,7 +78,11 @@ void acc_wait_all (void) __GOACC_NOTHROW > void acc_wait_all_async (int) __GOACC_NOTHROW; > void acc_init (acc_device_t) __GOACC_NOTHROW; > void acc_shutdown (acc_device_t) __GOACC_NOTHROW; > -int acc_on_device (acc_device_t) __GOACC_NOTHROW; > +/* Library function declaration. Although it should take an > + acc_device_t argument, that causes problems with matching the > + builtin, which takes an int (to avoid declaring the enumeration > + inside the compiler). */ > +int acc_on_device (int) __GOACC_NOTHROW; > void *acc_malloc (size_t) __GOACC_NOTHROW; > void acc_free (void *) __GOACC_NOTHROW; > /* Some of these would be more correct with const qualifiers, but Hmm, too bad this doesn't resolve the following C++ XFAIL (the test case is fine for C), gcc/testsuite/c-c++-common/goacc/acc_on_device-2.c: /* Have to enable optimizations, as otherwise builtins won't be expanded. */ /* { dg-additional-options "-O -fdump-rtl-expand" } */ /* Duplicate parts of libgomp/openacc.h, because we can't include it here. */ #if __cplusplus extern "C" { #endif typedef enum acc_device_t { acc_device_X = 123 } acc_device_t; extern int acc_on_device (int); #if __cplusplus } #endif int f (void) { const acc_device_t dev = acc_device_X; return acc_on_device (dev); } /* With -fopenacc, we're expecting the builtin to be expanded, so no calls. TODO: in C++, the use of enum acc_device_t for acc_on_device's parameter perturbs expansion as a builtin, which expects an int parameter. It's fine when changing acc_device_t to plain int, but that's not necessarily what a user will be doing. { dg-final { scan-rtl-dump-times "\\\(call \[^\\n\]* acc_on_device" 0 "expand" { xfail c++ } } } */ Do you happen to have any insight into that? Meanwhile, committed to gomp-4_0-branch in r226501: commit 38d7f116bf18f4a4012fda532aa70d47f3f20652 Author: tschwinge Date: Mon Aug 3 11:59:15 2015 +0000 Update acc_on_device test cases ... to match r226484 changes. gcc/testsuite/ * c-c++-common/goacc/acc_on_device-2-off.c (acc_on_device): Change formal parameter to int. * c-c++-common/goacc/acc_on_device-2.c (acc_on_device): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@226501 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/testsuite/ChangeLog.gomp | 4 ++++ gcc/testsuite/c-c++-common/goacc/acc_on_device-2-off.c | 4 +++- gcc/testsuite/c-c++-common/goacc/acc_on_device-2.c | 10 ++++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git gcc/testsuite/ChangeLog.gomp gcc/testsuite/ChangeLog.gomp index 33519ef..8dd9a4c 100644 --- gcc/testsuite/ChangeLog.gomp +++ gcc/testsuite/ChangeLog.gomp @@ -1,5 +1,9 @@ 2015-08-03 Thomas Schwinge + * c-c++-common/goacc/acc_on_device-2-off.c (acc_on_device): Change + formal parameter to int. + * c-c++-common/goacc/acc_on_device-2.c (acc_on_device): Likewise. + * c-c++-common/restrict-2.c: Update for new pass_lim. * c-c++-common/restrict-4.c: Same. * g++.dg/tree-ssa/pr33615.C: Same. diff --git gcc/testsuite/c-c++-common/goacc/acc_on_device-2-off.c gcc/testsuite/c-c++-common/goacc/acc_on_device-2-off.c index 59c72f7..71abe11 100644 --- gcc/testsuite/c-c++-common/goacc/acc_on_device-2-off.c +++ gcc/testsuite/c-c++-common/goacc/acc_on_device-2-off.c @@ -1,12 +1,14 @@ /* Have to enable optimizations, as otherwise builtins won't be expanded. */ /* { dg-additional-options "-O -fdump-rtl-expand -fno-openacc" } */ +/* Duplicate parts of libgomp/openacc.h, because we can't include it here. */ + #if __cplusplus extern "C" { #endif typedef enum acc_device_t { acc_device_X = 123 } acc_device_t; -extern int acc_on_device (acc_device_t); +extern int acc_on_device (int); #if __cplusplus } diff --git gcc/testsuite/c-c++-common/goacc/acc_on_device-2.c gcc/testsuite/c-c++-common/goacc/acc_on_device-2.c index ef622a8..243e562 100644 --- gcc/testsuite/c-c++-common/goacc/acc_on_device-2.c +++ gcc/testsuite/c-c++-common/goacc/acc_on_device-2.c @@ -1,12 +1,14 @@ /* Have to enable optimizations, as otherwise builtins won't be expanded. */ /* { dg-additional-options "-O -fdump-rtl-expand" } */ +/* Duplicate parts of libgomp/openacc.h, because we can't include it here. */ + #if __cplusplus extern "C" { #endif typedef enum acc_device_t { acc_device_X = 123 } acc_device_t; -extern int acc_on_device (acc_device_t); +extern int acc_on_device (int); #if __cplusplus } @@ -20,9 +22,9 @@ f (void) } /* With -fopenacc, we're expecting the builtin to be expanded, so no calls. - TODO: in C++, even under extern "C", the use of enum for acc_device_t + TODO: in C++, the use of enum acc_device_t for acc_on_device's parameter perturbs expansion as a builtin, which expects an int parameter. It's fine - when changing acc_device_t to plain int, but that's not what we're doing in - . + when changing acc_device_t to plain int, but that's not necessarily what a + user will be doing. { dg-final { scan-rtl-dump-times "\\\(call \[^\\n\]* acc_on_device" 0 "expand" { xfail c++ } } } */ Grüße, Thomas