| // 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; |
| } |