blob: ca94fc7e376e482830990ca570347ec747795d36 [file] [log] [blame]
// { dg-do run }
// { dg-additional-options "-Wno-psabi" }
#include <omp.h>
#include <vector>
template<typename T>
bool ptr_is_aligned(T *ptr, std::size_t alignment)
{
/* ALIGNMENT must be a power of 2. */
if ((alignment & (alignment - 1)) != 0)
__builtin_abort ();
__UINTPTR_TYPE__ ptr_value
= reinterpret_cast<__UINTPTR_TYPE__>(static_cast<void*>(ptr));
return (ptr_value % alignment) == 0;
}
template<typename T, template<typename> class Alloc>
void f (T v0, T v1, T v2, T v3)
{
std::vector<T, Alloc<T>> vec;
vec.push_back (v0);
vec.push_back (v1);
vec.push_back (v2);
vec.push_back (v3);
if (vec.at (0) != v0)
__builtin_abort ();
if (vec.at (1) != v1)
__builtin_abort ();
if (vec.at (2) != v2)
__builtin_abort ();
if (vec.at (3) != v3)
__builtin_abort ();
if (!ptr_is_aligned (&vec.at (0), alignof (T)))
__builtin_abort ();
if (!ptr_is_aligned (&vec.at (1), alignof (T)))
__builtin_abort ();
if (!ptr_is_aligned (&vec.at (2), alignof (T)))
__builtin_abort ();
if (!ptr_is_aligned (&vec.at (3), alignof (T)))
__builtin_abort ();
}
struct S0
{
int _v0;
bool _v1;
float _v2;
bool operator== (S0 const& other) const noexcept {
return _v0 == other._v0
&& _v1 == other._v1
&& _v2 == other._v2;
}
bool operator!= (S0 const& other) const noexcept {
return !this->operator==(other);
}
};
struct alignas(128) S1
{
int _v0;
bool _v1;
float _v2;
bool operator== (S1 const& other) const noexcept {
return _v0 == other._v0
&& _v1 == other._v1
&& _v2 == other._v2;
}
bool operator!= (S1 const& other) const noexcept {
return !this->operator==(other);
}
};
/* Note: the test for const_mem should be disabled in the future. */
int main ()
{
f<int, omp::allocator::null_allocator >(0, 1, 2, 3);
f<int, omp::allocator::default_mem >(0, 1, 2, 3);
f<int, omp::allocator::large_cap_mem >(0, 1, 2, 3);
f<int, omp::allocator::const_mem >(0, 1, 2, 3);
f<int, omp::allocator::high_bw_mem >(0, 1, 2, 3);
f<int, omp::allocator::low_lat_mem >(0, 1, 2, 3);
f<int, omp::allocator::cgroup_mem >(0, 1, 2, 3);
f<int, omp::allocator::pteam_mem >(0, 1, 2, 3);
f<int, omp::allocator::thread_mem >(0, 1, 2, 3);
#ifdef __gnu_linux__
/* Pinning not implemented on other targets. */
f<int, ompx::allocator::gnu_pinned_mem>(0, 1, 2, 3);
#endif
f<long long, omp::allocator::null_allocator >(0, 1, 2, 3);
f<long long, omp::allocator::default_mem >(0, 1, 2, 3);
f<long long, omp::allocator::large_cap_mem >(0, 1, 2, 3);
f<long long, omp::allocator::const_mem >(0, 1, 2, 3);
f<long long, omp::allocator::high_bw_mem >(0, 1, 2, 3);
f<long long, omp::allocator::low_lat_mem >(0, 1, 2, 3);
f<long long, omp::allocator::cgroup_mem >(0, 1, 2, 3);
f<long long, omp::allocator::pteam_mem >(0, 1, 2, 3);
f<long long, omp::allocator::thread_mem >(0, 1, 2, 3);
#ifdef __gnu_linux__
f<long long, ompx::allocator::gnu_pinned_mem>(0, 1, 2, 3);
#endif
S0 s0_0{ 42, true, 111128.f};
S0 s0_1{ 142, false, 11128.f};
S0 s0_2{ 1142, true, 1128.f};
S0 s0_3{11142, false, 128.f};
f<S0, omp::allocator::null_allocator >(s0_0, s0_1, s0_2, s0_3);
f<S0, omp::allocator::default_mem >(s0_0, s0_1, s0_2, s0_3);
f<S0, omp::allocator::large_cap_mem >(s0_0, s0_1, s0_2, s0_3);
f<S0, omp::allocator::const_mem >(s0_0, s0_1, s0_2, s0_3);
f<S0, omp::allocator::high_bw_mem >(s0_0, s0_1, s0_2, s0_3);
f<S0, omp::allocator::low_lat_mem >(s0_0, s0_1, s0_2, s0_3);
f<S0, omp::allocator::cgroup_mem >(s0_0, s0_1, s0_2, s0_3);
f<S0, omp::allocator::pteam_mem >(s0_0, s0_1, s0_2, s0_3);
f<S0, omp::allocator::thread_mem >(s0_0, s0_1, s0_2, s0_3);
#ifdef __gnu_linux__
f<S0, ompx::allocator::gnu_pinned_mem>(s0_0, s0_1, s0_2, s0_3);
#endif
S1 s1_0{ 42, true, 111128.f};
S1 s1_1{ 142, false, 11128.f};
S1 s1_2{ 1142, true, 1128.f};
S1 s1_3{11142, false, 128.f};
f<S1, omp::allocator::null_allocator >(s1_0, s1_1, s1_2, s1_3);
f<S1, omp::allocator::default_mem >(s1_0, s1_1, s1_2, s1_3);
f<S1, omp::allocator::large_cap_mem >(s1_0, s1_1, s1_2, s1_3);
f<S1, omp::allocator::const_mem >(s1_0, s1_1, s1_2, s1_3);
f<S1, omp::allocator::high_bw_mem >(s1_0, s1_1, s1_2, s1_3);
f<S1, omp::allocator::low_lat_mem >(s1_0, s1_1, s1_2, s1_3);
f<S1, omp::allocator::cgroup_mem >(s1_0, s1_1, s1_2, s1_3);
f<S1, omp::allocator::pteam_mem >(s1_0, s1_1, s1_2, s1_3);
f<S1, omp::allocator::thread_mem >(s1_0, s1_1, s1_2, s1_3);
#ifdef __gnu_linux__
f<S1, ompx::allocator::gnu_pinned_mem>(s1_0, s1_1, s1_2, s1_3);
#endif
}