diff --git a/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_mask_impl.hpp b/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_mask_impl.hpp index 7e59085d0836e..6303126f1a52c 100644 --- a/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_mask_impl.hpp +++ b/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_mask_impl.hpp @@ -49,7 +49,7 @@ class simd_mask_impl /// Construct from an array. To allow e.g. simd_mask m({1,0,0,1,...}). template > simd_mask_impl(const raw_element_type (&&Arr)[N1]) { - base_type::init_from_array(std::move(Arr)); + base_type::template init_from_array(std::move(Arr)); } /// Implicit conversion from simd. diff --git a/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_obj_impl.hpp b/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_obj_impl.hpp index b928179c4a46f..995e6d1a14421 100644 --- a/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_obj_impl.hpp +++ b/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_obj_impl.hpp @@ -153,13 +153,21 @@ class simd_obj_impl { static constexpr int length = N; protected: + template void init_from_array(const Ty (&&Arr)[N]) noexcept { + raw_vector_type tmp; + if constexpr (is_wrapper_elem_type_v) { for (auto I = 0; I < N; ++I) { - M_data[I] = bitcast_to_raw_type(Arr[I]); + tmp[I] = bitcast_to_raw_type(Arr[I]); } } else { - M_data = make_vector(std::move(Arr)); + tmp = make_vector(std::move(Arr)); + } + if constexpr (UseSet) { + set(std::move(tmp)); + } else { + M_data = std::move(tmp); } } @@ -216,7 +224,13 @@ class simd_obj_impl { template > simd_obj_impl(const Ty (&&Arr)[N1]) noexcept { __esimd_dbg_print(simd_obj_impl(const Ty(&&Arr)[N1])); - init_from_array(std::move(Arr)); + init_from_array(std::move(Arr)); + // It is OK not to mark a write to M_data with __esimd_vstore (via 'set') + // here because: + // - __esimd_vstore/vload are need only to mark ESIMD_PRIVATE variable + // access for the VC BE to generate proper code for them. + // - initializers are not allowed for ESIMD_PRIVATE vars, so only the + // default ctor can be used for them } /// Load constructor. @@ -239,34 +253,15 @@ class simd_obj_impl { copy_from(acc, offset, Flags{}); } - // Load the object's value from array. - template - std::enable_if_t copy_from(const RawTy (&&Arr)[N1]) { - __esimd_dbg_print(copy_from(const RawTy(&&Arr)[N1])); - raw_vector_type Tmp; - for (auto I = 0; I < N; ++I) { - Tmp[I] = Arr[I]; - } - set(Tmp); - } - - // Store the object's value to array. - template std::enable_if_t copy_to(RawTy (&&Arr)[N1]) const { - __esimd_dbg_print(copy_to(RawTy(&&Arr)[N1])); - for (auto I = 0; I < N; ++I) { - Arr[I] = data()[I]; - } + // Load the object's value from an rvalue array. + template std::enable_if_t copy_from(const Ty (&&Arr)[N1]) { + __esimd_dbg_print(copy_from(const Ty(&&Arr)[N1])); + init_from_array(std::move(Arr)); } - /// @{ - /// Conversion operators. - explicit operator const raw_vector_type &() const & { - __esimd_dbg_print(explicit operator const raw_vector_type &() const &); - return M_data; - } - explicit operator raw_vector_type &() & { - __esimd_dbg_print(explicit operator raw_vector_type &() &); - return M_data; + explicit operator raw_vector_type() const { + __esimd_dbg_print(explicit operator raw_vector_type()); + return data(); } /// Type conversion into a scalar: @@ -277,7 +272,6 @@ class simd_obj_impl { __esimd_dbg_print(operator Ty()); return bitcast_to_wrapper_type(data()[0]); } - /// @} raw_vector_type data() const { __esimd_dbg_print(raw_vector_type data()); diff --git a/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_view_impl.hpp b/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_view_impl.hpp index 6d3feb05edc44..d33dab80c80ec 100644 --- a/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_view_impl.hpp +++ b/sycl/include/sycl/ext/intel/experimental/esimd/detail/simd_view_impl.hpp @@ -68,8 +68,6 @@ class simd_view_impl { protected: simd_view_impl(BaseTy &Base, RegionTy Region) : M_base(Base), M_region(Region) {} - simd_view_impl(BaseTy &&Base, RegionTy Region) - : M_base(Base), M_region(Region) {} simd_view_impl(BaseTy &Base) : M_base(Base), M_region(RegionTy(0)) {}