| /* Verify OpenACC 'firstprivate' mappings for C++ reference types. */ |
| |
| /* This file is also sourced from |
| '../../../../libgomp/testsuite/libgomp.oacc-c++/firstprivate-mappings-1.C' |
| as an execution test. |
| |
| 'long double' tests are compiled/used unless DO_LONG_DOUBLE is set to 0. */ |
| |
| /* See also '../../c-c++-common/goacc/firstprivate-mappings-1.c'. */ |
| |
| /* { dg-additional-options "-fdump-tree-omplower" } */ |
| |
| /* { dg-additional-options "-fext-numeric-literals" { target c++ } } */ |
| |
| #include <stdbool.h> |
| #include <stdint.h> |
| #include <string.h> |
| |
| |
| #ifdef __SIZEOF_INT128__ |
| # define HAVE_INT128 1 |
| #else |
| # define HAVE_INT128 0 |
| #endif |
| |
| #ifndef DO_LONG_DOUBLE |
| # define DO_LONG_DOUBLE 1 |
| #endif |
| |
| |
| /* Simplify scanning for function names in tree dumps. */ |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| |
| /* Inside the following OpenACC 'parallel' constructs' regions, we modify the |
| 'firstprivate' variables, so that we can check that we don't copy these |
| back. */ |
| |
| |
| static void |
| p (short *&spi) |
| { |
| short *spo; |
| #pragma acc parallel \ |
| copyout (spo) \ |
| firstprivate (spi) |
| { |
| spo = ++spi; |
| } |
| if (spo != spi + 1) |
| __builtin_abort (); |
| } |
| |
| |
| static void |
| b (bool &bi) |
| { |
| bool bo; |
| #pragma acc parallel \ |
| copyout (bo) \ |
| firstprivate (bi) |
| { |
| bo = (bi = !bi); |
| } |
| if (bo != !bi) |
| __builtin_abort (); |
| } |
| |
| |
| static void |
| i (int8_t &i8i, |
| uint8_t &u8i, |
| int16_t &i16i, |
| uint16_t &u16i, |
| int32_t &i32i, |
| uint32_t &u32i, |
| int64_t &i64i, |
| uint64_t &u64i) |
| { |
| int8_t i8o; |
| uint8_t u8o; |
| int16_t i16o; |
| uint16_t u16o; |
| int32_t i32o; |
| uint32_t u32o; |
| int64_t i64o; |
| uint64_t u64o; |
| #pragma acc parallel \ |
| copyout (i8o) \ |
| firstprivate (i8i) \ |
| copyout (u8o) \ |
| firstprivate (u8i) \ |
| copyout (i16o) \ |
| firstprivate (i16i) \ |
| copyout (u16o) \ |
| firstprivate (u16i) \ |
| copyout (i32o) \ |
| firstprivate (i32i) \ |
| copyout (u32o) \ |
| firstprivate (u32i) \ |
| copyout (i64o) \ |
| firstprivate (i64i) \ |
| copyout (u64o) \ |
| firstprivate (u64i) |
| { |
| i8o = --i8i; |
| u8o = ++u8i; |
| i16o = --i16i; |
| u16o = ++u16i; |
| i32o = --i32i; |
| u32o = ++u32i; |
| i64o = --i64i; |
| u64o = ++u64i; |
| } |
| if (i8o != i8i - 1) |
| __builtin_abort (); |
| if (u8o != u8i + 1) |
| __builtin_abort (); |
| if (i16o != i16i - 1) |
| __builtin_abort (); |
| if (u16o != u16i + 1) |
| __builtin_abort (); |
| if (i32o != i32i - 1) |
| __builtin_abort (); |
| if (u32o != u32i + 1) |
| __builtin_abort (); |
| if (i64o != i64i - 1) |
| __builtin_abort (); |
| if (u64o != u64i + 1) |
| __builtin_abort (); |
| } |
| |
| |
| #if HAVE_INT128 |
| static void |
| i128 (__int128 &i128i, unsigned __int128 &u128i) |
| { |
| __int128 i128o; |
| unsigned __int128 u128o; |
| # pragma acc parallel \ |
| copyout (i128o) \ |
| firstprivate (i128i) \ |
| copyout(u128o) \ |
| firstprivate (u128i) |
| { |
| i128o = --i128i; |
| u128o = ++u128i; |
| } |
| if (i128o != i128i - 1) |
| __builtin_abort (); |
| if (u128o != u128i + 1) |
| __builtin_abort (); |
| } |
| #endif |
| |
| |
| static void |
| flt_dbl (float &flti, double &dbli) |
| { |
| float flto; |
| double dblo; |
| #pragma acc parallel \ |
| copyout (flto) \ |
| firstprivate (flti) \ |
| copyout (dblo) \ |
| firstprivate (dbli) |
| { |
| flto = --flti; |
| dblo = --dbli; |
| } |
| if (flto != flti - 1) |
| __builtin_abort (); |
| if (dblo != dbli - 1) |
| __builtin_abort (); |
| } |
| |
| |
| static void |
| ldbl (long double &ldbli) |
| { |
| #if DO_LONG_DOUBLE |
| long double ldblo; |
| # pragma acc parallel \ |
| copyout (ldblo) \ |
| firstprivate (ldbli) |
| { |
| ldblo = --ldbli; |
| } |
| if (ldblo != ldbli - 1) |
| __builtin_abort (); |
| #endif |
| } |
| |
| |
| static void |
| c (_Complex unsigned char &cuci, |
| _Complex signed short &cssi, |
| _Complex unsigned int &cuii, |
| _Complex signed long &csli, |
| _Complex float &cflti, |
| _Complex double &cdbli) |
| { |
| _Complex unsigned char cuco; |
| _Complex signed short csso; |
| _Complex unsigned int cuio; |
| _Complex signed long cslo; |
| _Complex float cflto; |
| _Complex double cdblo; |
| #pragma acc parallel \ |
| copyout (cuco) \ |
| firstprivate (cuci) \ |
| copyout (csso) \ |
| firstprivate (cssi) \ |
| copyout (cuio) \ |
| firstprivate (cuii) \ |
| copyout (cslo) \ |
| firstprivate (csli) \ |
| copyout (cflto) \ |
| firstprivate (cflti) \ |
| copyout (cdblo) \ |
| firstprivate (cdbli) |
| { |
| cuco = (cuci += (1 + 1j)); |
| csso = (cssi -= (1 + 1j)); |
| cuio = (cuii += (1 + 1j)); |
| cslo = (csli -= (1 + 1j)); |
| cflto = (cflti -= (1 + 1j)); |
| cdblo = (cdbli -= (1 + 1j)); |
| } |
| if (cuco != cuci + (1 + 1j)) |
| __builtin_abort (); |
| if (csso != cssi - (1 + 1j)) |
| __builtin_abort (); |
| if (cuio != cuii + (1 + 1j)) |
| __builtin_abort (); |
| if (cslo != csli - (1 + 1j)) |
| __builtin_abort (); |
| if (cflto != cflti - (1 + 1j)) |
| __builtin_abort (); |
| if (cdblo != cdbli - (1 + 1j)) |
| __builtin_abort (); |
| } |
| |
| |
| static void |
| cldbl (_Complex long double &cldbli) |
| { |
| #if DO_LONG_DOUBLE |
| _Complex long double cldblo; |
| # pragma acc parallel \ |
| copyout (cldblo) \ |
| firstprivate (cldbli) |
| { |
| cldblo = (cldbli -= (1 + 1j)); |
| } |
| if (cldblo != cldbli - (1 + 1j)) |
| __builtin_abort (); |
| #endif |
| } |
| |
| |
| #define V_EQ(v1, v2) \ |
| ({ \ |
| __typeof__ (v1) v_d = (v1) != (v2); \ |
| __typeof__ (v_d) v_0 = { 0 }; \ |
| memcmp (&v_d, &v_0, sizeof v_d) == 0; \ |
| }) |
| |
| typedef uint8_t __attribute__ ((vector_size (2 * sizeof (uint8_t)))) v2u8; |
| typedef int16_t __attribute__ ((vector_size (4 * sizeof (int16_t)))) v4i16; |
| typedef uint32_t __attribute__ ((vector_size (8 * sizeof (uint32_t)))) v8u32; |
| typedef int64_t __attribute__ ((vector_size (16 * sizeof (int64_t)))) v16i64; |
| typedef float __attribute__ ((vector_size (1 * sizeof (float)))) v1flt; |
| typedef float __attribute__ ((vector_size (2 * sizeof (float)))) v2flt; |
| typedef float __attribute__ ((vector_size (4 * sizeof (float)))) v4flt; |
| typedef float __attribute__ ((vector_size (8 * sizeof (float)))) v8flt; |
| typedef double __attribute__ ((vector_size (1 * sizeof (double)))) v1dbl; |
| typedef double __attribute__ ((vector_size (2 * sizeof (double)))) v2dbl; |
| typedef double __attribute__ ((vector_size (4 * sizeof (double)))) v4dbl; |
| typedef double __attribute__ ((vector_size (8 * sizeof (double)))) v8dbl; |
| |
| static void |
| v (v2u8 &v2u8i, v4i16 &v4i16i, v8u32 &v8u32i, v16i64 &v16i64i, |
| v1flt &v1flti, v2flt &v2flti, v4flt &v4flti, v8flt &v8flti, |
| v1dbl &v1dbli, v2dbl &v2dbli, v4dbl &v4dbli, v8dbl &v8dbli) |
| { |
| v2u8 v2u8o; |
| v4i16 v4i16o; |
| v8u32 v8u32o; |
| v16i64 v16i64o; |
| v1flt v1flto; |
| v2flt v2flto; |
| v4flt v4flto; |
| v8flt v8flto; |
| v1dbl v1dblo; |
| v2dbl v2dblo; |
| v4dbl v4dblo; |
| v8dbl v8dblo; |
| #pragma acc parallel \ |
| copyout (v2u8o) \ |
| firstprivate (v2u8i) \ |
| copyout (v4i16o) \ |
| firstprivate (v4i16i) \ |
| copyout (v8u32o) \ |
| firstprivate (v8u32i) \ |
| copyout (v16i64o) \ |
| firstprivate (v16i64i) \ |
| copyout (v1flto) \ |
| firstprivate (v1flti) \ |
| copyout (v2flto) \ |
| firstprivate (v2flti) \ |
| copyout (v4flto) \ |
| firstprivate (v4flti) \ |
| copyout (v8flto) \ |
| firstprivate (v8flti) \ |
| copyout (v1dblo) \ |
| firstprivate (v1dbli) \ |
| copyout (v2dblo) \ |
| firstprivate (v2dbli) \ |
| copyout (v4dblo) \ |
| firstprivate (v4dbli) \ |
| copyout (v8dblo) \ |
| firstprivate (v8dbli) |
| { |
| v2u8o = ++v2u8i; |
| v4i16o = --v4i16i; |
| v8u32o = ++v8u32i; |
| v16i64o = --v16i64i; |
| v1flto = --v1flti; |
| v2flto = --v2flti; |
| v4flto = --v4flti; |
| v8flto = --v8flti; |
| v1dblo = --v1dbli; |
| v2dblo = --v2dbli; |
| v4dblo = --v4dbli; |
| v8dblo = --v8dbli; |
| } |
| if (!V_EQ (v2u8o, v2u8i + 1)) |
| __builtin_abort (); |
| if (!V_EQ (v4i16o, v4i16i - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v8u32o, v8u32i + 1)) |
| __builtin_abort (); |
| if (!V_EQ (v16i64o, v16i64i - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v1flto, v1flti - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v2flto, v2flti - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v4flto, v4flti - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v8flto, v8flti - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v1dblo, v1dbli - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v2dblo, v2dbli - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v4dblo, v4dbli - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v8dblo, v8dbli - 1)) |
| __builtin_abort (); |
| } |
| |
| |
| /* "error: could not find an integer type of the same size as 'long double'" */ |
| #if HAVE_INT128 |
| typedef long double __attribute__ ((vector_size (1 * sizeof (long double)))) v1ldbl; |
| typedef long double __attribute__ ((vector_size (2 * sizeof (long double)))) v2ldbl; |
| typedef long double __attribute__ ((vector_size (4 * sizeof (long double)))) v4ldbl; |
| typedef long double __attribute__ ((vector_size (8 * sizeof (long double)))) v8ldbl; |
| |
| static void |
| vldbl (v1ldbl &v1ldbli, v2ldbl &v2ldbli, v4ldbl &v4ldbli, v8ldbl &v8ldbli) |
| { |
| # if DO_LONG_DOUBLE |
| v1ldbl v1ldblo; |
| v2ldbl v2ldblo; |
| v4ldbl v4ldblo; |
| v8ldbl v8ldblo; |
| # pragma acc parallel \ |
| copyout (v1ldblo) \ |
| firstprivate (v1ldbli) \ |
| copyout (v2ldblo) \ |
| firstprivate (v2ldbli) \ |
| copyout (v4ldblo) \ |
| firstprivate (v4ldbli) \ |
| copyout (v8ldblo) \ |
| firstprivate (v8ldbli) |
| { |
| v1ldblo = --v1ldbli; |
| v2ldblo = --v2ldbli; |
| v4ldblo = --v4ldbli; |
| v8ldblo = --v8ldbli; |
| } |
| if (!V_EQ (v1ldblo, v1ldbli - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v2ldblo, v2ldbli - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v4ldblo, v4ldbli - 1)) |
| __builtin_abort (); |
| if (!V_EQ (v8ldblo, v8ldbli - 1)) |
| __builtin_abort (); |
| # endif |
| } |
| #endif |
| |
| |
| static void |
| vla (int &array_li) |
| { |
| _Complex double array[array_li]; |
| uint32_t array_so; |
| #pragma acc parallel \ |
| copyout (array_so) |
| /* The gimplifier has created an implicit 'firstprivate' clause for the array |
| length. |
| { dg-final { scan-tree-dump {(?n)#pragma omp target oacc_parallel map\(from:array_so \[len: 4\]\) firstprivate\(} omplower } } |
| (C++ computes an intermediate value, so can't scan for 'firstprivate(array_li)'.) */ |
| { |
| array_so = sizeof array; |
| } |
| if (array_so != sizeof array) |
| __builtin_abort (); |
| } |
| |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| { |
| short s; |
| short *sp = &s; |
| p (sp); |
| } |
| |
| { |
| bool bi = true; |
| b (bi); |
| } |
| |
| { |
| int8_t i8i = -1; |
| uint8_t u8i = 1; |
| int16_t i16i = -2; |
| uint16_t u16i = 2; |
| int32_t i32i = -3; |
| uint32_t u32i = 3; |
| int64_t i64i = -4; |
| uint64_t u64i = 4; |
| i (i8i, u8i, i16i, u16i, i32i, u32i, i64i, u64i); |
| } |
| |
| #if HAVE_INT128 |
| { |
| __int128 i128i = -8; |
| unsigned __int128 u128i = 8; |
| i128 (i128i, u128i); |
| } |
| #endif |
| |
| { |
| float flti = .5; |
| double dbli = .25; |
| flt_dbl (flti, dbli); |
| } |
| |
| { |
| long double ldbli = .125; |
| ldbl (ldbli); |
| } |
| |
| { |
| _Complex unsigned char cuci = 1 + 2j; |
| _Complex signed short cssi = -2 + (-4j); |
| _Complex unsigned int cuii = 3 + 6j; |
| _Complex signed long csli = -4 + (-8j); |
| _Complex float cflti = .5 + 1j; |
| _Complex double cdbli = .25 + .5j; |
| c (cuci, cssi, cuii, csli, cflti, cdbli); |
| } |
| |
| { |
| _Complex long double cldbli = .125 + .25j; |
| cldbl (cldbli); |
| } |
| |
| { |
| v2u8 v2u8i = {2, 3}; |
| v4i16 v4i16i = { -1, -2, 5, 4 }; |
| v8u32 v8u32i = { 3, 6, 9, 11}; |
| v16i64 v16i64i = { 10, 21, -25, 44, 31, -1, 1, 222, -1, -12, 52, -44, -13, 1, -1, -222}; |
| v1flt v1flti = { -.5 }; |
| v2flt v2flti = { 1.5, -2.5 }; |
| v4flt v4flti = { 3.5, -4.5, -5.5, -6.5 }; |
| v8flt v8flti = { -7.5, 8.5, 9.5, 10.5, -11.5, -12.5, 13.5, 14.5 }; |
| v1dbl v1dbli = { 0.25 }; |
| v2dbl v2dbli = { -1.25, -2.25 }; |
| v4dbl v4dbli = { 3.25, -4.25, 5.25, 6.25 }; |
| v8dbl v8dbli = { 7.25, 8.25, -9.25, -10.25, -11.25, 12.25, 13.25, -14.25 }; |
| v (v2u8i, v4i16i, v8u32i, v16i64i, |
| v1flti, v2flti, v4flti, v8flti, |
| v1dbli, v2dbli, v4dbli, v8dbli); |
| } |
| |
| #if HAVE_INT128 |
| { |
| v1ldbl v1ldbli = { -0.125 }; |
| v2ldbl v2ldbli = { 1.125, -2.125 }; |
| v4ldbl v4ldbli = { -3.125, -4.125, 5.125, -6.125 }; |
| v8ldbl v8ldbli = { 7.125, -8.125, -9.125, 10.125, 11.125, 12.125, 13.125, 14.125 }; |
| vldbl (v1ldbli, v2ldbli, v4ldbli, v8ldbli); |
| } |
| #endif |
| |
| vla (argc); |
| |
| return 0; |
| } |