diff options
Diffstat (limited to 'test/CodeGenCXX/address-space-cast-coerce.cpp')
-rw-r--r-- | test/CodeGenCXX/address-space-cast-coerce.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/test/CodeGenCXX/address-space-cast-coerce.cpp b/test/CodeGenCXX/address-space-cast-coerce.cpp new file mode 100644 index 0000000000000..940a4f55b47ab --- /dev/null +++ b/test/CodeGenCXX/address-space-cast-coerce.cpp @@ -0,0 +1,53 @@ +// RUN: %clang_cc1 %s -triple=amdgcn-amd-amdhsa -emit-llvm -o - | FileCheck %s + +template<typename T, unsigned int n> struct my_vector_base; + + template<typename T> + struct my_vector_base<T, 1> { + typedef T Native_vec_ __attribute__((ext_vector_type(1))); + + union { + Native_vec_ data; + struct { + T x; + }; + }; + }; + + template<typename T, unsigned int rank> + struct my_vector_type : public my_vector_base<T, rank> { + using my_vector_base<T, rank>::data; + using typename my_vector_base<T, rank>::Native_vec_; + + template< typename U> + my_vector_type(U x) noexcept + { + for (auto i = 0u; i != rank; ++i) data[i] = x; + } + my_vector_type& operator+=(const my_vector_type& x) noexcept + { + data += x.data; + return *this; + } + }; + +template<typename T, unsigned int n> + inline + my_vector_type<T, n> operator+( + const my_vector_type<T, n>& x, const my_vector_type<T, n>& y) noexcept + { + return my_vector_type<T, n>{x} += y; + } + +using char1 = my_vector_type<char, 1>; + +int mane() { + + char1 f1{1}; + char1 f2{1}; + +// CHECK: %[[a:[^ ]+]] = addrspacecast i16 addrspace(5)* %{{[^ ]+}} to i16* +// CHECK: %[[a:[^ ]+]] = addrspacecast %{{[^ ]+}} addrspace(5)* %{{[^ ]+}} to %{{[^ ]+}} + + char1 f3 = f1 + f2; +} |