blob: 1b1badb1a9040c419b169b88e48410e2a82e75f9 [file] [log] [blame]
/* 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;
}