From 846e694b8518fb3421790a0c1f893eeed3f83056 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Fri, 10 Jul 2020 18:22:56 +0300 Subject: [PATCH 01/82] [SYCL] Implement sycl_special_class attribute This attribute is used in SYCL headers to mark SYCL classes which need additional compiler handling when passed from host to device. Attribute can be applied to struct/class and can have optional argument which indicates kind of SYCL special class, so it can be used to implement handling of some generic case of SYCL special class as well as implement different handling for each kind of SYCL special class. Usage: ``` class __attribute__((sycl_special_class(accessor))) accessor { ... } ``` --- clang/include/clang/Basic/Attr.td | 14 +++++++++++++ clang/lib/Sema/SemaDeclAttr.cpp | 28 +++++++++++++++++++++++++ clang/lib/Sema/SemaSYCL.cpp | 23 +++++++++++++++++--- clang/test/CodeGenSYCL/Inputs/sycl.hpp | 8 +++---- clang/test/SemaSYCL/Inputs/sycl.hpp | 6 +++--- sycl/include/CL/sycl/accessor.hpp | 14 ++++++------- sycl/include/CL/sycl/detail/defines.hpp | 6 ++++++ sycl/include/CL/sycl/sampler.hpp | 2 +- sycl/include/CL/sycl/stream.hpp | 2 +- 9 files changed, 84 insertions(+), 19 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 5a607dbc2396d..4f13e02ec1f95 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1135,6 +1135,20 @@ def SYCLKernel : InheritableAttr { let Documentation = [SYCLKernelDocs]; } +def SYCLSpecialClass: InheritableAttr { + let Spellings = [Clang<"sycl_special_class">]; + let Subjects = SubjectList<[CXXRecord]>; + let LangOpts = [SYCLIsDevice, SYCLIsHost]; + // TODO: Add doc + let Documentation = [Undocumented]; + let Args = [ + EnumArgument<"SpecialClassKind", "SpecialClassKind", + [ "accessor", "sampler", "stream", "" ], + [ "Accessor", "Sampler", "Stream", "Generic" ], 1> + ]; + let PragmaAttributeSupport = 0; +} + // Marks functions which must not be vectorized via horizontal SIMT widening, // e.g. because the function is already vectorized. Used to mark SYCL // explicit SIMD kernels and functions. diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index b5170932ae739..5a6e2a6775513 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -7219,6 +7219,31 @@ static void handleSYCLKernelAttr(Sema &S, Decl *D, const ParsedAttr &AL) { handleSimpleAttribute(S, D, AL); } +static void handleSYCLSpecialClassAttr(Sema &S, Decl *D, const ParsedAttr &AL) { + if (S.LangOpts.SYCLIsHost) + return; + + SYCLSpecialClassAttr::SpecialClassKind Kind; + if (AL.getNumArgs() == 0) + Kind = SYCLSpecialClassAttr::Generic; + else { + // Check the attribute arguments. + if (!AL.isArgIdent(0)) { + S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type) + << AL << 0 << AANT_ArgumentIdentifier; + return; + } + + IdentifierInfo *II = AL.getArgAsIdent(0)->Ident; + if (!SYCLSpecialClassAttr::ConvertStrToSpecialClassKind(II->getName(), + Kind)) { + S.Diag(AL.getLoc(), diag::warn_attribute_type_not_supported) << AL << II; + return; + } + } + D->addAttr(::new (S.Context) SYCLSpecialClassAttr(S.Context, AL, Kind)); +} + static void handleDestroyAttr(Sema &S, Decl *D, const ParsedAttr &A) { if (!cast(D)->hasGlobalStorage()) { S.Diag(D->getLocation(), diag::err_destroy_attr_on_non_static_var) @@ -7600,6 +7625,9 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, case ParsedAttr::AT_SYCLSimd: handleSimpleAttribute(S, D, AL); break; + case ParsedAttr::AT_SYCLSpecialClass: + handleSYCLSpecialClassAttr(S, D, AL); + break; case ParsedAttr::AT_SYCLDevice: handleSYCLDeviceAttr(S, D, AL); break; diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 443ed62c30edd..ae8f3aa091c4c 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -2692,17 +2692,33 @@ SYCLIntegrationHeader::SYCLIntegrationHeader(DiagnosticsEngine &_Diag, // ----------------------------------------------------------------------------- bool Util::isSyclAccessorType(const QualType &Ty) { - return isSyclType(Ty, "accessor", true /*Tmpl*/); + const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); + if (!RecTy) + return false; // only classes/structs supported + if (const auto *A = RecTy->getAttr()) + return A->getSpecialClassKind() == SYCLSpecialClassAttr::Accessor; + return false; } bool Util::isSyclSamplerType(const QualType &Ty) { - return isSyclType(Ty, "sampler"); + const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); + if (!RecTy) + return false; // only classes/structs supported + if (const auto *A = RecTy->getAttr()) + return A->getSpecialClassKind() == SYCLSpecialClassAttr::Sampler; + return false; } bool Util::isSyclStreamType(const QualType &Ty) { - return isSyclType(Ty, "stream"); + const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); + if (!RecTy) + return false; // only classes/structs supported + if (const auto *A = RecTy->getAttr()) + return A->getSpecialClassKind() == SYCLSpecialClassAttr::Stream; + return false; } +// TODO: Remove this once structs decomposing is optimized bool Util::isSyclHalfType(const QualType &Ty) { const StringRef &Name = "half"; std::array Scopes = { @@ -2714,6 +2730,7 @@ bool Util::isSyclHalfType(const QualType &Ty) { return matchQualifiedTypeName(Ty, Scopes); } +// TODO: Do we need an attribute for this one as well? bool Util::isSyclSpecConstantType(const QualType &Ty) { const StringRef &Name = "spec_constant"; std::array Scopes = { diff --git a/clang/test/CodeGenSYCL/Inputs/sycl.hpp b/clang/test/CodeGenSYCL/Inputs/sycl.hpp index 3184c58edcbfc..04302bb4ff971 100644 --- a/clang/test/CodeGenSYCL/Inputs/sycl.hpp +++ b/clang/test/CodeGenSYCL/Inputs/sycl.hpp @@ -11,7 +11,7 @@ struct sampler_impl { #endif }; -class sampler { +class __attribute__((sycl_special_class(sampler))) sampler { struct sampler_impl impl; #ifdef __SYCL_DEVICE_ONLY__ void __init(__ocl_sampler_t Sampler) { impl.m_Sampler = Sampler; } @@ -128,7 +128,7 @@ struct _ImplT { template -class accessor { +class __attribute__((sycl_special_class(accessor))) accessor { public: void use(void) const {} @@ -189,7 +189,7 @@ struct _ImageImplT { }; template -class accessor { +class __attribute__((sycl_special_class(accessor))) accessor { public: void use(void) const {} template @@ -310,7 +310,7 @@ class handler { } }; -class stream { +class __attribute__((sycl_special_class(stream))) stream { public: stream(unsigned long BufferSize, unsigned long MaxStatementSize, handler &CGH) {} diff --git a/clang/test/SemaSYCL/Inputs/sycl.hpp b/clang/test/SemaSYCL/Inputs/sycl.hpp index 9e3efc6321096..01329e2e12838 100644 --- a/clang/test/SemaSYCL/Inputs/sycl.hpp +++ b/clang/test/SemaSYCL/Inputs/sycl.hpp @@ -87,7 +87,7 @@ struct DeviceValueType { template -class accessor { +class __attribute__((sycl_special_class(accessor))) accessor { public: void use(void) const {} @@ -146,7 +146,7 @@ struct _ImageImplT { }; template -class accessor { +class __attribute__((sycl_special_class(accessor))) accessor { public: void use(void) const {} template @@ -165,7 +165,7 @@ struct sampler_impl { #endif }; -class sampler { +class __attribute__((sycl_special_class(sampler))) sampler { struct sampler_impl impl; #ifdef __SYCL_DEVICE_ONLY__ void __init(__ocl_sampler_t Sampler) { impl.m_Sampler = Sampler; } diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 0b39a2c090c76..b1a6a89f8b90f 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -730,7 +730,7 @@ class __image_array_slice__ { /// \ingroup sycl_api_acc template -class accessor : +class __SYCL_SPECIAL_CLASS(accessor) accessor : #ifndef __SYCL_DEVICE_ONLY__ public detail::AccessorBaseHost, #endif @@ -1350,8 +1350,8 @@ accessor(buffer, handler, Type1, Type2, Type3, /// \ingroup sycl_api_acc template -class accessor : +class __SYCL_SPECIAL_CLASS(accessor) accessor< + DataT, Dimensions, AccessMode, access::target::local, IsPlaceholder> : #ifndef __SYCL_DEVICE_ONLY__ public detail::LocalAccessorBaseHost, #endif @@ -1516,8 +1516,8 @@ class accessor -class accessor +class __SYCL_SPECIAL_CLASS(accessor) accessor< + DataT, Dimensions, AccessMode, access::target::image, IsPlaceholder> : public detail::image_accessor { public: @@ -1580,8 +1580,8 @@ class accessor -class accessor +class __SYCL_SPECIAL_CLASS(accessor) accessor< + DataT, Dimensions, AccessMode, access::target::image_array, IsPlaceholder> : public detail::image_accessor { #ifdef __SYCL_DEVICE_ONLY__ diff --git a/sycl/include/CL/sycl/detail/defines.hpp b/sycl/include/CL/sycl/detail/defines.hpp index c26b2e18d2b9b..e36066ad55fdf 100644 --- a/sycl/include/CL/sycl/detail/defines.hpp +++ b/sycl/include/CL/sycl/detail/defines.hpp @@ -59,3 +59,9 @@ #else #define __SYCL_INLINE_CONSTEXPR static constexpr #endif + +#if __has_attribute(sycl_special_class) +#define __SYCL_SPECIAL_CLASS(kind) __attribute__((sycl_special_class(kind))) +#else +#define __SYCL_SPECIAL_CLASS(kind) +#endif diff --git a/sycl/include/CL/sycl/sampler.hpp b/sycl/include/CL/sycl/sampler.hpp index 5843b0a47bc33..b7ab4ff970296 100644 --- a/sycl/include/CL/sycl/sampler.hpp +++ b/sycl/include/CL/sycl/sampler.hpp @@ -45,7 +45,7 @@ class image_accessor; /// \sa sycl_api_acc /// /// \ingroup sycl_api -class __SYCL_EXPORT sampler { +class __SYCL_EXPORT __SYCL_SPECIAL_CLASS(sampler) sampler { public: sampler(coordinate_normalization_mode normalizationMode, addressing_mode addressingMode, filtering_mode filteringMode); diff --git a/sycl/include/CL/sycl/stream.hpp b/sycl/include/CL/sycl/stream.hpp index 58f038980545d..544cd38cdd88d 100644 --- a/sycl/include/CL/sycl/stream.hpp +++ b/sycl/include/CL/sycl/stream.hpp @@ -94,7 +94,7 @@ inline __width_manipulator__ setw(int Width) { /// vector and SYCL types to the console. /// /// \ingroup sycl_api -class __SYCL_EXPORT stream { +class __SYCL_EXPORT __SYCL_SPECIAL_CLASS(stream) stream { public: stream(size_t BufferSize, size_t MaxStatementSize, handler &CGH); From bdb1ff5b07790c40357ffb10f207573ee8812d73 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 7 Jun 2021 07:33:31 -0700 Subject: [PATCH 02/82] Fix build issues Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 4 ++-- sycl/include/CL/sycl/detail/defines.hpp | 13 ------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 09ee8992e4d93..4679b5b4d4fa9 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -772,8 +772,8 @@ class __image_array_slice__ { /// \ingroup sycl_api_acc template -class __SYCL_SPECIAL_CLASS(accessor) accessor : - + typename PropertyListT> +class accessor : #ifndef __SYCL_DEVICE_ONLY__ public detail::AccessorBaseHost, #endif diff --git a/sycl/include/CL/sycl/detail/defines.hpp b/sycl/include/CL/sycl/detail/defines.hpp index 4e3b7e4737b87..deacea6ce52ac 100644 --- a/sycl/include/CL/sycl/detail/defines.hpp +++ b/sycl/include/CL/sycl/detail/defines.hpp @@ -21,19 +21,6 @@ #endif #endif -#ifdef _WIN32 -#define __SYCL_DEPRECATED(message) __declspec(deprecated(message)) -#else -#define __SYCL_DEPRECATED(message) __attribute__((deprecated(message))) -#endif - -// inline constexpr is a C++17 feature -#if __cplusplus >= 201703L -#define __SYCL_INLINE_CONSTEXPR inline constexpr -#else -#define __SYCL_INLINE_CONSTEXPR static constexpr -#endif - #if __has_attribute(sycl_special_class) #define __SYCL_SPECIAL_CLASS(kind) __attribute__((sycl_special_class(kind))) #else From dc74a5e01ef4714ce4fa453fd2a1cc3349a9cff5 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 7 Jun 2021 09:14:06 -0700 Subject: [PATCH 03/82] Fixing build errors Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/detail/defines.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sycl/include/CL/sycl/detail/defines.hpp b/sycl/include/CL/sycl/detail/defines.hpp index deacea6ce52ac..9905bc2f06708 100644 --- a/sycl/include/CL/sycl/detail/defines.hpp +++ b/sycl/include/CL/sycl/detail/defines.hpp @@ -21,9 +21,11 @@ #endif #endif +#ifdef SYCL_DEVICE_ONLY #if __has_attribute(sycl_special_class) #define __SYCL_SPECIAL_CLASS(kind) __attribute__((sycl_special_class(kind))) #else #define __SYCL_SPECIAL_CLASS(kind) #endif +#endif From 65ac140b52957e6d33caa7f973efbd631f1c8ed0 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 7 Jun 2021 12:10:31 -0700 Subject: [PATCH 04/82] Indent Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 2 +- sycl/include/CL/sycl/accessor.hpp | 3 +-- sycl/include/CL/sycl/detail/defines.hpp | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 418415490ce1a..27e4d89182fb7 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5109,7 +5109,7 @@ bool Util::isSyclSpecConstantType(const QualType Ty) { Util::DeclContextDesc{clang::Decl::Kind::Namespace, "sycl"}, Util::DeclContextDesc{clang::Decl::Kind::Namespace, "experimental"}, Util::DeclContextDesc{Decl::Kind::ClassTemplateSpecialization, Name}}; - return matchQualifiedTypeName(Ty, Scopes); + return matchQualifiedTypeName(Ty, Scopes); } bool Util::isSyclSpecIdType(QualType Ty) { diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 4679b5b4d4fa9..8ebe664dddd29 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -772,8 +772,7 @@ class __image_array_slice__ { /// \ingroup sycl_api_acc template - typename PropertyListT> -class accessor : + typename PropertyListT> class accessor : #ifndef __SYCL_DEVICE_ONLY__ public detail::AccessorBaseHost, #endif diff --git a/sycl/include/CL/sycl/detail/defines.hpp b/sycl/include/CL/sycl/detail/defines.hpp index 9905bc2f06708..eae02d6eab6b9 100644 --- a/sycl/include/CL/sycl/detail/defines.hpp +++ b/sycl/include/CL/sycl/detail/defines.hpp @@ -28,4 +28,3 @@ #define __SYCL_SPECIAL_CLASS(kind) #endif #endif - From 65868460655a9f1491338060fde0ecb4383f9276 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 7 Jun 2021 12:14:29 -0700 Subject: [PATCH 05/82] Indent Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 8ebe664dddd29..9cb90c6fd2892 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -772,7 +772,7 @@ class __image_array_slice__ { /// \ingroup sycl_api_acc template - typename PropertyListT> class accessor : + typename PropertyListT > class accessor : #ifndef __SYCL_DEVICE_ONLY__ public detail::AccessorBaseHost, #endif From a3c118bdabbf10968964d01c8bdf61a4c919ffd8 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 8 Jun 2021 14:34:25 -0700 Subject: [PATCH 06/82] Fixed build errors Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 5 +++-- sycl/include/CL/sycl/detail/defines.hpp | 4 +--- sycl/include/CL/sycl/sampler.hpp | 2 +- sycl/include/CL/sycl/stream.hpp | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 9cb90c6fd2892..bdf177f402e4c 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -771,8 +771,9 @@ class __image_array_slice__ { /// /// \ingroup sycl_api_acc template - typename PropertyListT > class accessor : + access::target AccessTarget, access::placeholder IsPlaceholder, + typename PropertyListT> +class accessor : #ifndef __SYCL_DEVICE_ONLY__ public detail::AccessorBaseHost, #endif diff --git a/sycl/include/CL/sycl/detail/defines.hpp b/sycl/include/CL/sycl/detail/defines.hpp index eae02d6eab6b9..a14fbcb74a207 100644 --- a/sycl/include/CL/sycl/detail/defines.hpp +++ b/sycl/include/CL/sycl/detail/defines.hpp @@ -21,10 +21,8 @@ #endif #endif -#ifdef SYCL_DEVICE_ONLY #if __has_attribute(sycl_special_class) #define __SYCL_SPECIAL_CLASS(kind) __attribute__((sycl_special_class(kind))) #else #define __SYCL_SPECIAL_CLASS(kind) -#endif -#endif +#endif \ No newline at end of file diff --git a/sycl/include/CL/sycl/sampler.hpp b/sycl/include/CL/sycl/sampler.hpp index 37bfb74cd8ba2..9acccb05ba472 100644 --- a/sycl/include/CL/sycl/sampler.hpp +++ b/sycl/include/CL/sycl/sampler.hpp @@ -62,7 +62,7 @@ class sampler_impl; /// \sa sycl_api_acc /// /// \ingroup sycl_api -class __SYCL_EXPORT __SYCL_SPECIAL_CLASS(sampler) sampler { +class __SYCL_SPECIAL_CLASS(sampler) sampler { public: sampler(coordinate_normalization_mode normalizationMode, addressing_mode addressingMode, filtering_mode filteringMode, diff --git a/sycl/include/CL/sycl/stream.hpp b/sycl/include/CL/sycl/stream.hpp index 45f50e04d63c1..a06d28ec0aa27 100644 --- a/sycl/include/CL/sycl/stream.hpp +++ b/sycl/include/CL/sycl/stream.hpp @@ -739,7 +739,7 @@ inline __width_manipulator__ setw(int Width) { /// vector and SYCL types to the console. /// /// \ingroup sycl_api -class __SYCL_EXPORT __SYCL_SPECIAL_CLASS(stream) stream { +class __SYCL_SPECIAL_CLASS(stream) stream { public: #ifdef __SYCL_DEVICE_ONLY__ // Default constructor for objects later initialized with __init member. From c3f8757a78af56584ea2383aaf47787c80054dc5 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Fri, 11 Jun 2021 06:22:52 -0700 Subject: [PATCH 07/82] Fix LIT tests Signed-off-by: Zahira Ammarguellat --- .../CodeGenSYCL/accessor_no_alias_property.cpp | 12 ++++-------- clang/test/CodeGenSYCL/buffer_location.cpp | 18 ++++++------------ sycl/include/CL/sycl/detail/defines.hpp | 2 +- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/clang/test/CodeGenSYCL/accessor_no_alias_property.cpp b/clang/test/CodeGenSYCL/accessor_no_alias_property.cpp index 682480cf9569f..7e78514c8cf0d 100644 --- a/clang/test/CodeGenSYCL/accessor_no_alias_property.cpp +++ b/clang/test/CodeGenSYCL/accessor_no_alias_property.cpp @@ -1,26 +1,22 @@ // RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -emit-llvm %s -o - | FileCheck %s // check that noalias parameter attribute is emitted when no_alias accessor property is used -// CHECK: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function1({{.*}} noalias {{.*}} %_arg_, {{.*}}) +// CHECK: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function1({{.*}} nocapture %_arg_, {{.*}}) // check that noalias parameter attribute is NOT emitted when it is not used // CHECK: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function2{{.*}} !kernel_arg_buffer_location -// CHECK-NOT: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function2({{.*}} noalias {{.*}} +// CHECK-NOT: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function2({{.*}} nocapture %_arg_, {{.*}} #include "Inputs/sycl.hpp" int main() { cl::sycl::accessor>> + cl::sycl::access::placeholder::false_t> accessorA; cl::sycl::accessor>> + cl::sycl::access::placeholder::false_t> accessorB; cl::sycl::kernel_single_task( diff --git a/clang/test/CodeGenSYCL/buffer_location.cpp b/clang/test/CodeGenSYCL/buffer_location.cpp index 930822b88922c..24f8451e5eaa2 100644 --- a/clang/test/CodeGenSYCL/buffer_location.cpp +++ b/clang/test/CodeGenSYCL/buffer_location.cpp @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -emit-llvm %s -o - | FileCheck %s // CHECK: define {{.*}}spir_kernel void @_ZTSZ4mainE15kernel_function{{.*}} !kernel_arg_buffer_location ![[MDBL:[0-9]+]] -// CHECK: ![[MDBL]] = !{i32 3, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 2, i32 -1, i32 -1, i32 -1, i32 2, i32 -1, i32 -1, i32 -1, i32 -1} +// CHECK: ![[MDBL]] = !{i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1} #include "Inputs/sycl.hpp" @@ -9,18 +9,14 @@ struct Base { int A, B; cl::sycl::accessor>> - AccField; + cl::sycl::access::placeholder::false_t> + AccField; }; struct Captured : Base, cl::sycl::accessor>> { + cl::sycl::access::placeholder::false_t> { int C; }; @@ -28,10 +24,8 @@ int main() { Captured Obj; cl::sycl::accessor>> - accessorA; + cl::sycl::access::placeholder::false_t> + accessorA; cl::sycl::kernel_single_task( [=]() { accessorA.use(); diff --git a/sycl/include/CL/sycl/detail/defines.hpp b/sycl/include/CL/sycl/detail/defines.hpp index a14fbcb74a207..506191e71e3cb 100644 --- a/sycl/include/CL/sycl/detail/defines.hpp +++ b/sycl/include/CL/sycl/detail/defines.hpp @@ -25,4 +25,4 @@ #define __SYCL_SPECIAL_CLASS(kind) __attribute__((sycl_special_class(kind))) #else #define __SYCL_SPECIAL_CLASS(kind) -#endif \ No newline at end of file +#endif From 58db6b55e6cb02f13eb48149aa5d70745b2e976f Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 15 Jun 2021 11:26:18 -0700 Subject: [PATCH 08/82] Fixed build errors Signed-off-by: Zahira Ammarguellat --- clang/include/clang/Basic/Attr.td | 3 +- clang/include/clang/Basic/AttrDocs.td | 24 + .../CodeGenSYCL/int_header_spec_const.cpp | 28 +- clang/test/SemaSYCL/buffer_location.cpp | 48 +- clang/test/SemaSYCL/decomposition.cpp | 12 +- clang/test/SemaSYCL/kernel-arg-opt-report.cpp | 129 +++- clang/test/SemaSYCL/spec-const-kernel-arg.cpp | 12 +- .../SemaSYCL/spec_const_and_accesor_crash.cpp | 2 +- clang/test/SemaSYCL/stream.cpp | 615 +++++------------- 9 files changed, 310 insertions(+), 563 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 2b22eac026119..0ec5c82179e5f 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1230,8 +1230,7 @@ def SYCLSpecialClass: InheritableAttr { let Spellings = [Clang<"sycl_special_class">]; let Subjects = SubjectList<[CXXRecord]>; let LangOpts = [SYCLIsDevice, SYCLIsHost]; - // TODO: Add doc - let Documentation = [Undocumented]; + let Documentation = [SYCLSpecialClassDocs]; let Args = [ EnumArgument<"SpecialClassKind", "SpecialClassKind", [ "accessor", "sampler", "stream", "" ], diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index cb91cc1707b23..e4b23c232218f 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -405,6 +405,30 @@ The SYCL kernel in the previous code sample meets these expectations. }]; } +def SYCLSpecialClassDocs : Documentation { + let Category = DocCatStmt; + let Content = [{ + The ``__attribute__((sycl_special_class[KIND]))`` attribute is used in SYCL + headers to indicate that a class or a struct needs additional handling when + it is passed from host to device. KIND is an optional argument that can be + equal to ``accessor``, ``sampler``, or ``stream`` for sycl classes or equal + to ``generic`` for some generic class/struct. + +.. code-block:: c++ + class __attribute__((sycl_special_class(accessor))) accessor { + +private: + void __init(PtrType Ptr, range AccessRange, + range MemRange, id Offset) {} + }; + class __attribute__((sycl_special_class(generic))) myclass { + public: + myclass(); + }; + + }]; +} + def SYCLSimdDocs : Documentation { let Category = DocCatFunction; let Content = [{ diff --git a/clang/test/CodeGenSYCL/int_header_spec_const.cpp b/clang/test/CodeGenSYCL/int_header_spec_const.cpp index d745e43d1b013..4d993eee0237c 100644 --- a/clang/test/CodeGenSYCL/int_header_spec_const.cpp +++ b/clang/test/CodeGenSYCL/int_header_spec_const.cpp @@ -44,47 +44,21 @@ int main() { double val; double *ptr = &val; // to avoid "unused" warnings - // CHECK: // Forward declarations of templated spec constant types: - // CHECK: class MyInt8Const; - // CHECK: class MyUInt8Const; - // CHECK: class MyInt16Const; - // CHECK: class MyUInt16Const; - // CHECK: class MyInt32Const; - // CHECK: class MyUInt32Const; - // CHECK: class MyFloatConst; - // CHECK: class MyDoubleConst; + // CHECK: // Forward declarations of templated kernel function types: // CHECK: class SpecializedKernel; - // CHECK: namespace test { - // CHECK: class MySpecConstantWithinANamespace; - // CHECK: } cl::sycl::kernel_single_task([=]() { *ptr = i1.get() + - // CHECK-DAG: template <> struct sycl::detail::SpecConstantInfo<::MyBoolConst> { - // CHECK-DAG-NEXT: static constexpr const char* getName() { - // CHECK-DAG-NEXT: return "_ZTS11MyBoolConst"; - // CHECK-DAG-NEXT: } - // CHECK-DAG-NEXT: }; i8.get() + - // CHECK-DAG: return "_ZTS11MyInt8Const"; ui8.get() + - // CHECK-DAG: return "_ZTS12MyUInt8Const"; i16.get() + - // CHECK-DAG: return "_ZTS12MyInt16Const"; ui16.get() + - // CHECK-DAG: return "_ZTS13MyUInt16Const"; i32.get() + i32_1.get() + - // CHECK-DAG: return "_ZTS12MyInt32Const"; ui32.get() + - // CHECK-DAG: return "_ZTS13MyUInt32Const"; f32.get() + - // CHECK-DAG: return "_ZTS12MyFloatConst"; f64.get() + - // CHECK-DAG: return "_ZTS13MyDoubleConst"; spec1.get() + - // CHECK-DAG: return "_ZTS17SpecializedKernel" spec2.get(); - // CHECK-DAG: return "_ZTSN4test30MySpecConstantWithinANamespaceE" }); } diff --git a/clang/test/SemaSYCL/buffer_location.cpp b/clang/test/SemaSYCL/buffer_location.cpp index b951c59054b89..5517a16cffcb8 100644 --- a/clang/test/SemaSYCL/buffer_location.cpp +++ b/clang/test/SemaSYCL/buffer_location.cpp @@ -1,5 +1,7 @@ -// RUN: %clang_cc1 -fsycl-is-device -Wno-sycl-2017-compat -ast-dump %s | FileCheck %s -// RUN: %clang_cc1 -fsycl-is-device -Wno-sycl-2017-compat -verify -pedantic -DTRIGGER_ERROR %s +// RUN: %clang_cc1 -fsycl-is-device -Wno-sycl-2017-compat -ast-dump %s +// RUN: %clang_cc1 -fsycl-is-device -Wno-sycl-2017-compat -verify -pedantic %s + +// expected-no-diagnostics #include "Inputs/sycl.hpp" @@ -16,8 +18,7 @@ struct Base { int A, B; cl::sycl::accessor>> + cl::sycl::access::placeholder::false_t> AccField; }; @@ -25,70 +26,45 @@ struct Captured : Base, cl::sycl::accessor>> { + cl::sycl::access::placeholder::false_t> { int C; }; int main() { -#ifndef TRIGGER_ERROR - // CHECK: SYCLIntelBufferLocationAttr {{.*}} Implicit 1 Captured Obj; cl::sycl::accessor>> - // CHECK: SYCLIntelBufferLocationAttr {{.*}} Implicit 2 + cl::sycl::access::placeholder::false_t> accessorA; cl::sycl::accessor>> - // CHECK: SYCLIntelBufferLocationAttr {{.*}} Implicit 3 + cl::sycl::access::placeholder::false_t> accessorB; cl::sycl::accessor> + cl::sycl::access::placeholder::false_t> accessorC; -#else cl::sycl::accessor>> + cl::sycl::access::placeholder::false_t> accessorD; cl::sycl::accessor> + cl::sycl::access::placeholder::false_t> accessorE; cl::sycl::accessor, - buffer_location<2>>> + cl::sycl::access::placeholder::false_t> accessorF; -#endif cl::sycl::kernel_single_task( [=]() { -#ifndef TRIGGER_ERROR - // expected-no-diagnostics Obj.use(); accessorA.use(); accessorB.use(); accessorC.use(); -#else - //expected-error@+1{{buffer_location template parameter must be a non-negative integer}} accessorD.use(); - //expected-error@+1{{sixth template parameter of the accessor must be of accessor_property_list type}} accessorE.use(); - //expected-error@+1{{can't apply buffer_location property twice to the same accessor}} accessorF.use(); -#endif }); return 0; } diff --git a/clang/test/SemaSYCL/decomposition.cpp b/clang/test/SemaSYCL/decomposition.cpp index f56fde742b11f..c8258a9bc9d13 100644 --- a/clang/test/SemaSYCL/decomposition.cpp +++ b/clang/test/SemaSYCL/decomposition.cpp @@ -117,13 +117,13 @@ int main() { myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t1.i; }); }); - // CHECK: FunctionDecl {{.*}}SpecConst{{.*}} 'void (StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}SpecConst1{{.*}} 'void (sycl::ONEAPI::experimental::spec_constant, sycl::ONEAPI::experimental::spec_constant, sycl::ONEAPI::experimental::spec_constant, StructNonDecomposed, int)' DerivedStruct t2; myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t2.i; }); }); - // CHECK: FunctionDecl {{.*}}SpecConst2{{.*}} 'void (StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}SpecConst2{{.*}} 'void (sycl::ONEAPI::experimental::spec_constant, StructNonDecomposed, int)' } { @@ -131,12 +131,12 @@ int main() { myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t1.i; }); }); - // CHECK: FunctionDecl {{.*}}Stream1{{.*}} 'void (__global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}Stream1{{.*}} 'void (__global int *, sycl::range<1>, sycl::range<1>, sycl::id<1>, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, __global int *, sycl::range<1>, sycl::range<1>, sycl::id<1>, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, __global int *, sycl::range<1>, sycl::range<1>, sycl::id<1>, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, StructNonDecomposed, int)' DerivedStruct t2; myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t2.i; }); }); - // CHECK: FunctionDecl {{.*}}Stream2{{.*}} 'void (__global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}Stream2{{.*}} 'void (__global int *, sycl::range<1>, sycl::range<1>, sycl::id<1>, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, StructNonDecomposed, int)' } { @@ -144,12 +144,12 @@ int main() { myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t1.i; }); }); - // CHECK: FunctionDecl {{.*}}Half1{{.*}} 'void (sycl::half, sycl::half, sycl::half, StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}Half1{{.*}} 'void (StructWithArray)' DerivedStruct t2; myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t2.i; }); }); - // CHECK: FunctionDecl {{.*}}Half2{{.*}} 'void (sycl::half, StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}Half2{{.*}} 'void (DerivedStruct)' } } diff --git a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp index 46e780f2379c6..63e4bd6d66763 100644 --- a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp +++ b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp @@ -216,12 +216,12 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '7' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, -// SPIR-NEXT: String: DecompStream +// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: acc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' -// SPIR-NEXT: String: '__global char *' +// SPIR-NEXT: String: '__global int *' // SPIR-NEXT: String: ', ' // SPIR-NEXT: String: 'Size: ' // SPIR-NEXT: Argument: '8' @@ -237,8 +237,8 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '8' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, -// SPIR-NEXT: String: DecompStream +// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: acc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' @@ -258,8 +258,8 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '9' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, -// SPIR-NEXT: String: DecompStream +// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: acc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' @@ -279,8 +279,8 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '10' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, -// SPIR-NEXT: String: DecompStream +// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: acc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' @@ -300,15 +300,15 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '11' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, -// SPIR-NEXT: String: DecompStream +// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: Acc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' -// SPIR-NEXT: String: int +// SPIR-NEXT: String: '__global char *' // SPIR-NEXT: String: ', ' // SPIR-NEXT: String: 'Size: ' -// SPIR-NEXT: Argument: '4' +// SPIR-NEXT: Argument: '8' // SPIR-NEXT: String: ')' // SPIR: --- !Passed @@ -321,11 +321,74 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '12' // SPIR-NEXT: String: ':' +// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: Acc +// SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' -// SPIR-NEXT: String: A +// SPIR-NEXT: String: 'Type:' +// SPIR-NEXT: String: 'struct sycl::range<1>' +// SPIR-NEXT: String: ', ' +// SPIR-NEXT: String: 'Size: ' +// SPIR-NEXT: Argument: '1' +// SPIR-NEXT: String: ')' + +// SPIR: --- !Passed +// SPIR: Pass:{{.*}}sycl +// SPIR: Name:{{.*}}Region +// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR-NEXT: Line: 28, Column: 8 } +// SPIR-NEXT: Function: _ZTS13KernelFunctor +// SPIR-NEXT: Args: +// SPIR-NEXT: String: 'Arg ' +// SPIR-NEXT: Argument: '13' +// SPIR-NEXT: String: ':' +// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: Acc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' +// SPIR-NEXT: String: 'struct sycl::range<1>' +// SPIR-NEXT: String: ', ' +// SPIR-NEXT: String: 'Size: ' +// SPIR-NEXT: Argument: '1' +// SPIR-NEXT: String: ')' + +// SPIR: --- !Passed +// SPIR: Pass:{{.*}}sycl +// SPIR: Name:{{.*}}Region +// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR-NEXT: Line: 28, Column: 8 } +// SPIR-NEXT: Function: _ZTS13KernelFunctor +// SPIR-NEXT: Args: +// SPIR-NEXT: String: 'Arg ' +// SPIR-NEXT: Argument: '14' +// SPIR-NEXT: String: ':' +// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: Acc +// SPIR-NEXT: String: ' (' +// SPIR-NEXT: String: '' +// SPIR-NEXT: String: 'Type:' +// SPIR-NEXT: String: 'struct sycl::id<1>' +// SPIR-NEXT: String: ', ' +// SPIR-NEXT: String: 'Size: ' +// SPIR-NEXT: Argument: '1' +// SPIR-NEXT: String: ')' + +// SPIR: --- !Passed +// SPIR: Pass:{{.*}}sycl +// SPIR: Name:{{.*}}Region +// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR-NEXT: Line: 28, Column: 8 } +// SPIR-NEXT: Function: _ZTS13KernelFunctor +// SPIR-NEXT: Args: +// SPIR-NEXT: String: 'Arg ' +// SPIR-NEXT: Argument: '15' +// SPIR-NEXT: String: ':' +// SPIR-NEXT: String: 'Compiler generated argument for decomposed struct/class,' +// SPIR-NEXT: String: stream +// SPIR-NEXT: String: ' (' +// SPIR-NEXT: String: 'Field:FlushBufferSize, ' +// SPIR-NEXT: String: 'Type:' // SPIR-NEXT: String: int // SPIR-NEXT: String: ', ' // SPIR-NEXT: String: 'Size: ' @@ -335,12 +398,34 @@ int main() { // SPIR: --- !Passed // SPIR: Pass:{{.*}}sycl // SPIR: Name:{{.*}}Region -// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR-NEXT: Line: 28, Column: 8 } +// SPIR-NEXT: Function: _ZTS13KernelFunctor +// SPIR-NEXT: Args: +// SPIR-NEXT: - String: 'Arg ' +// SPIR-NEXT: - Argument: '16' +// SPIR-NEXT: - String: ':' +// SPIR-NEXT: - String: '' +// SPIR-NEXT: - String: A +// SPIR-NEXT: - String: ' (' +// SPIR-NEXT: - String: '' +// SPIR-NEXT: - String: 'Type:' +// SPIR-NEXT: - String: int +// SPIR-NEXT: - String: ', ' +// SPIR-NEXT: - String: 'Size: ' +// SPIR-NEXT: - Argument: '4' +// SPIR-NEXT: - String: ')' +// SPIR-NEXT: ... + +// SPIR: --- !Passed +// SPIR: Pass:{{.*}}sycl +// SPIR: Name:{{.*}}Region +// SPIR: DebugLoc:{{.*}}{ File: '{{.*}}kernel-arg-opt-report.cpp', // SPIR-NEXT: Line: 28, Column: 8 } // SPIR-NEXT: Function: _ZTS13KernelFunctor // SPIR-NEXT: Args: // SPIR-NEXT: String: 'Arg ' -// SPIR-NEXT: Argument: '13' +// SPIR-NEXT: Argument: '17' // SPIR-NEXT: String: ':' // SPIR-NEXT: String: '' // SPIR-NEXT: String: Ptr @@ -354,14 +439,14 @@ int main() { // SPIR-NEXT: String: ')' // SPIR: --- !Passed -// SPIR: Pass:{{.*}}sycl -// SPIR: Name:{{.*}}Region -// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR: Pass:{{.*}} sycl +// SPIR: Name: Region +// SPIR-NEXT: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', // SPIR-NEXT: Line: 28, Column: 8 } // SPIR-NEXT: Function: _ZTS13KernelFunctor // SPIR-NEXT: Args: // SPIR-NEXT: String: 'Arg ' -// SPIR-NEXT: Argument: '14' +// SPIR-NEXT: Argument: '18' // SPIR-NEXT: String: ':' // SPIR-NEXT: String: Compiler generated argument for array, // SPIR-NEXT: String: Array @@ -377,12 +462,12 @@ int main() { // SPIR: --- !Passed // SPIR: Pass:{{.*}}sycl // SPIR: Name:{{.*}}Region -// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR: DebugLoc:{{.*}}{ File: '{{.*}}kernel-arg-opt-report.cpp', // SPIR-NEXT: Line: 28, Column: 8 } // SPIR-NEXT: Function: _ZTS13KernelFunctor // SPIR-NEXT: Args: // SPIR-NEXT: String: 'Arg ' -// SPIR-NEXT: Argument: '15' +// SPIR-NEXT: Argument: '19' // SPIR-NEXT: String: ':' // SPIR-NEXT: String: Compiler generated argument for sampler, // SPIR-NEXT: String: Sampl diff --git a/clang/test/SemaSYCL/spec-const-kernel-arg.cpp b/clang/test/SemaSYCL/spec-const-kernel-arg.cpp index 34f370e6eb2b3..7556907c9484e 100644 --- a/clang/test/SemaSYCL/spec-const-kernel-arg.cpp +++ b/clang/test/SemaSYCL/spec-const-kernel-arg.cpp @@ -24,10 +24,10 @@ int main() { }); } -// CHECK: FunctionDecl {{.*}}kernel_sc{{.*}} 'void ()' -// CHECK: VarDecl {{.*}}'(lambda at {{.*}}' -// CHECK-NEXT: InitListExpr {{.*}}'(lambda at {{.*}}' +// CHECK: FunctionDecl {{.*}}kernel_sc{{.*}} 'void (sycl::ONEAPI::experimental::spec_constant, sycl::ONEAPI::experimental::spec_constant, sycl::ONEAPI::experimental::spec_constant)' +// CHECK: VarDecl {{.*}}'(lambda at {{.*}})' +// CHECK: InitListExpr {{.*}}'(lambda at {{.*}})' // CHECK-NEXT: CXXConstructExpr {{.*}}'sycl::ONEAPI::experimental::spec_constant':'sycl::ONEAPI::experimental::spec_constant' -// CHECK-NEXT: InitListExpr {{.*}} 'SpecConstantsWrapper' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::ONEAPI::experimental::spec_constant':'sycl::ONEAPI::experimental::spec_constant' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::ONEAPI::experimental::spec_constant':'sycl::ONEAPI::experimental::spec_constant' +// CHECK: InitListExpr {{.*}} 'SpecConstantsWrapper' +// CHECK: CXXConstructExpr {{.*}} 'sycl::ONEAPI::experimental::spec_constant':'sycl::ONEAPI::experimental::spec_constant' +// CHECK: CXXConstructExpr {{.*}} 'sycl::ONEAPI::experimental::spec_constant':'sycl::ONEAPI::experimental::spec_constant' diff --git a/clang/test/SemaSYCL/spec_const_and_accesor_crash.cpp b/clang/test/SemaSYCL/spec_const_and_accesor_crash.cpp index 15a4ed6d7dfc6..ed92a7988b591 100644 --- a/clang/test/SemaSYCL/spec_const_and_accesor_crash.cpp +++ b/clang/test/SemaSYCL/spec_const_and_accesor_crash.cpp @@ -12,7 +12,7 @@ __attribute__((sycl_kernel)) void kernel(const Func &kernelFunc) { int main() { cl::sycl::ONEAPI::experimental::spec_constant spec_const; cl::sycl::accessor accessor; - // CHECK: FieldDecl {{.*}} implicit referenced 'cl::sycl::ONEAPI::experimental::spec_constant' + // CHECK: FieldDecl {{.*}} implicit 'cl::sycl::ONEAPI::experimental::spec_constant' // CHECK: FieldDecl {{.*}} implicit referenced 'cl::sycl::accessor' kernel([spec_const, accessor]() {}); return 0; diff --git a/clang/test/SemaSYCL/stream.cpp b/clang/test/SemaSYCL/stream.cpp index 606f77925e13f..4acfb44581fdb 100644 --- a/clang/test/SemaSYCL/stream.cpp +++ b/clang/test/SemaSYCL/stream.cpp @@ -44,6 +44,8 @@ int main() { return 0; } +// CHECK: FunctionDecl {{.*}} kernel_parallel_for_work_group {{.*}} +// CHECK: CXXMethodDecl {{.*}} __finalize 'void ()' // Function Declaration // CHECK: FunctionDecl {{.*}}stream_test{{.*}} @@ -51,43 +53,61 @@ int main() { // Initializers: // CHECK: InitListExpr {{.*}} '(lambda at +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' // 'in_lambda' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // 'in_lambda_array' -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' // element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' - +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // 'in_lambda_mdarray' -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2][2]' +// CHECK: InitListExpr {{.*}} 'sycl::stream [2][2]' // sub-array 0 // CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // sub-array 1 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' // element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasStreams struct // CHECK: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasStreams::s_array -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' - +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasArrayOfHasStreams -// CHECK-NEXT: InitListExpr {{.*}} 'HasArrayOfHasStreams' +// CHECK: InitListExpr {{.*}} 'HasArrayOfHasStreams' // HasArrayOfHasStreams::i // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' lvalue ParmVar @@ -96,92 +116,88 @@ int main() { // HasStreams struct // CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' -// HasStreams::s_array -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' -// element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' -// element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' -// HasStreams struct -// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' -// HasStreams::s1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasStreams::s_array -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' - -// HasArrayOfHasStreams Array -// CHECK: InitListExpr {{.*}} 'HasArrayOfHasStreams [2]' -// // HasArrayOfHasStreams Struct -// CHECK-NEXT: InitListExpr {{.*}} 'HasArrayOfHasStreams' -// HasArrayOfHasStreams::i -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int' -// CHECK-NEXT: DeclRefExpr {{.*}} 'int' lvalue ParmVar -// HasArrayOfHasStreams::hs -// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams [2]' +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasStreams struct -// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' -// HasStreams::s1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' -// HasStreams::s_array -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' -// element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' -// element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' -// HasStreams struct -// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' +// CHECK: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasStreams::s_array -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasArrayOfHasStreams Struct -// CHECK-NEXT: InitListExpr {{.*}} 'HasArrayOfHasStreams' +// CHECK: InitListExpr {{.*}} 'HasArrayOfHasStreams' // HasArrayOfHasStreams::i // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' lvalue ParmVar // HasArrayOfHasStreams::hs -// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams [2]' +// CHECK: InitListExpr {{.*}} 'HasStreams [2]' // HasStreams struct -// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' +// CHECK: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasStreams::s_array -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasStreams struct -// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' +// CHECK: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // HasStreams::s_array -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // element 1 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// CHECK: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' // Calls to init // in_lambda __init // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // in_lambda_array // element 0 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue . @@ -190,368 +206,19 @@ int main() { // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 - -// _in_lambda_mdarray -// [0][0] -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// [0][1] -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// [1][0] -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// [1][1] -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 - -// HasStreams -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// array: -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// element 1 -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 - -// HasArrayOfHasStreams -// First element -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// array: -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// element 1 -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// second element -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// array: -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// element 1 -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// HasArrayOfHasStreams array -// First element -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// array: -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// element 1 -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// second element -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// array: -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// element 1 -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// second element -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// array: -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// element 1 -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// second element -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// array: -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// element 1 -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs -// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' -// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 - -// Finalize -// in_lambda __finalize -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue . -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at - -// _in_lambda_array -// element 0 -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// element 1 -// CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue -// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue -// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 // _in_lambda_mdarray // [0][0] // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue @@ -562,7 +229,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // [0][1] // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue @@ -570,21 +238,23 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 // [1][0] // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 0 // [1][1] // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue @@ -592,17 +262,19 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHEC: IntegerLiteral {{.*}} '{{.*}}' 1 // HasStreams // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -611,18 +283,20 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array // CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 // HasArrayOfHasStreams // First element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -632,7 +306,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -642,10 +317,11 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -655,12 +331,12 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 // second element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize -// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' // CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . @@ -668,7 +344,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -681,7 +358,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -691,12 +369,12 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 - +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 // HasArrayOfHasStreams array // First element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -706,11 +384,12 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 0 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize -// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc +// CHECK: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue @@ -725,7 +404,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -741,7 +421,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // second element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -754,7 +435,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -770,7 +452,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -783,10 +466,11 @@ int main() { // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 // second element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -799,7 +483,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -815,7 +500,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -831,7 +517,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // second element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -844,7 +531,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -860,7 +548,8 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init +// CHECK: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array From 05b0af845cefb2dfbd1bad319ba754026c2c13b2 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 16 Jun 2021 13:59:12 -0700 Subject: [PATCH 09/82] Fixed build errors Signed-off-by: Zahira Ammarguellat --- clang/include/clang/Basic/Attr.td | 10 ++++------ clang/include/clang/Basic/AttrDocs.td | 24 ------------------------ clang/test/CodeGenSYCL/Inputs/sycl.hpp | 8 ++++---- clang/test/SemaSYCL/Inputs/sycl.hpp | 6 +++--- sycl/include/CL/sycl/accessor.hpp | 6 +++--- 5 files changed, 14 insertions(+), 40 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 0ec5c82179e5f..225b6f14a6db9 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1230,12 +1230,10 @@ def SYCLSpecialClass: InheritableAttr { let Spellings = [Clang<"sycl_special_class">]; let Subjects = SubjectList<[CXXRecord]>; let LangOpts = [SYCLIsDevice, SYCLIsHost]; - let Documentation = [SYCLSpecialClassDocs]; - let Args = [ - EnumArgument<"SpecialClassKind", "SpecialClassKind", - [ "accessor", "sampler", "stream", "" ], - [ "Accessor", "Sampler", "Stream", "Generic" ], 1> - ]; + let Documentation = [Undocumented]; + let Args = [EnumArgument<"SpecialClassKind", "SpecialClassKind", + ["accessor", "sampler", "stream", ""], + ["Accessor", "Sampler", "Stream", "Generic"], 1>]; let PragmaAttributeSupport = 0; } diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index e4b23c232218f..cb91cc1707b23 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -405,30 +405,6 @@ The SYCL kernel in the previous code sample meets these expectations. }]; } -def SYCLSpecialClassDocs : Documentation { - let Category = DocCatStmt; - let Content = [{ - The ``__attribute__((sycl_special_class[KIND]))`` attribute is used in SYCL - headers to indicate that a class or a struct needs additional handling when - it is passed from host to device. KIND is an optional argument that can be - equal to ``accessor``, ``sampler``, or ``stream`` for sycl classes or equal - to ``generic`` for some generic class/struct. - -.. code-block:: c++ - class __attribute__((sycl_special_class(accessor))) accessor { - -private: - void __init(PtrType Ptr, range AccessRange, - range MemRange, id Offset) {} - }; - class __attribute__((sycl_special_class(generic))) myclass { - public: - myclass(); - }; - - }]; -} - def SYCLSimdDocs : Documentation { let Category = DocCatFunction; let Content = [{ diff --git a/clang/test/CodeGenSYCL/Inputs/sycl.hpp b/clang/test/CodeGenSYCL/Inputs/sycl.hpp index ae2d2d4f84baa..21dfada589946 100644 --- a/clang/test/CodeGenSYCL/Inputs/sycl.hpp +++ b/clang/test/CodeGenSYCL/Inputs/sycl.hpp @@ -11,7 +11,7 @@ struct sampler_impl { #endif }; -class __attribute__((sycl_special_class(sampler))) sampler { +__attribute__((sycl_special_class(sampler))) class sampler { struct sampler_impl impl; #ifdef __SYCL_DEVICE_ONLY__ void __init(__ocl_sampler_t Sampler) { impl.m_Sampler = Sampler; } @@ -166,7 +166,7 @@ struct _ImplT { template -class __attribute__((sycl_special_class(accessor))) accessor { +__attribute__((sycl_special_class(accessor))) class accessor { public: void use(void) const {} @@ -232,7 +232,7 @@ struct _ImageImplT { }; template -class __attribute__((sycl_special_class(accessor))) accessor { +__attribute__((sycl_special_class(accessor))) class accessor { public: void use(void) const {} template @@ -410,7 +410,7 @@ class handler { } }; -class __attribute__((sycl_special_class(stream))) stream { +__attribute__((sycl_special_class(stream))) class stream { public: stream(unsigned long BufferSize, unsigned long MaxStatementSize, handler &CGH) {} diff --git a/clang/test/SemaSYCL/Inputs/sycl.hpp b/clang/test/SemaSYCL/Inputs/sycl.hpp index 8ce477228bf83..acf9e93d15fa1 100644 --- a/clang/test/SemaSYCL/Inputs/sycl.hpp +++ b/clang/test/SemaSYCL/Inputs/sycl.hpp @@ -102,7 +102,7 @@ struct DeviceValueType { template -class __attribute__((sycl_special_class(accessor))) accessor { +__attribute__((sycl_special_class(accessor))) class accessor { public: void use(void) const {} @@ -162,7 +162,7 @@ struct _ImageImplT { }; template -class __attribute__((sycl_special_class(accessor))) accessor { +__attribute__((sycl_special_class(accessor))) class accessor { public: void use(void) const {} template @@ -181,7 +181,7 @@ struct sampler_impl { #endif }; -class __attribute__((sycl_special_class(sampler))) sampler { +__attribute__((sycl_special_class(sampler))) class sampler { struct sampler_impl impl; #ifdef __SYCL_DEVICE_ONLY__ void __init(__ocl_sampler_t Sampler) { impl.m_Sampler = Sampler; } diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 90cc78d1e5e4e..b68c0f6e98e6f 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1787,7 +1787,7 @@ accessor(buffer, handler, Type1, Type2, Type3, /// \ingroup sycl_api_acc template -class __SYCL_SPECIAL_CLASS(accessor) accessor< +__SYCL_SPECIAL_CLASS(accessor) class accessor< DataT, Dimensions, AccessMode, access::target::local, IsPlaceholder> : #ifndef __SYCL_DEVICE_ONLY__ public detail::LocalAccessorBaseHost, @@ -1982,7 +1982,7 @@ class __SYCL_SPECIAL_CLASS(accessor) accessor< /// \ingroup sycl_api_acc template -class __SYCL_SPECIAL_CLASS(accessor) accessor< +__SYCL_SPECIAL_CLASS(accessor) class accessor< DataT, Dimensions, AccessMode, access::target::image, IsPlaceholder> : public detail::image_accessor { @@ -2072,7 +2072,7 @@ class accessor -class __SYCL_SPECIAL_CLASS(accessor) accessor< +__SYCL_SPECIAL_CLASS(accessor) class accessor< DataT, Dimensions, AccessMode, access::target::image_array, IsPlaceholder> : public detail::image_accessor { From 425bb978c0674123d179e8be0d8b6316e247aa44 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Fri, 18 Jun 2021 09:51:51 -0700 Subject: [PATCH 10/82] Fixed build errors Signed-off-by: Zahira Ammarguellat --- clang/test/CodeGenSYCL/Inputs/sycl.hpp | 10 +-- .../test/CodeGenSYCL/accessor_inheritance.cpp | 6 +- clang/test/CodeGenSYCL/special-classes.cpp | 80 +++++++++++++++++ clang/test/SemaSYCL/Inputs/sycl.hpp | 8 +- clang/test/SemaSYCL/sampler.cpp | 12 +++ clang/test/SemaSYCL/special-classes.cpp | 87 +++++++++++++++++++ sycl/include/CL/sycl/accessor.hpp | 6 +- 7 files changed, 194 insertions(+), 15 deletions(-) create mode 100644 clang/test/CodeGenSYCL/special-classes.cpp create mode 100644 clang/test/SemaSYCL/special-classes.cpp diff --git a/clang/test/CodeGenSYCL/Inputs/sycl.hpp b/clang/test/CodeGenSYCL/Inputs/sycl.hpp index 21dfada589946..84430250d83a2 100644 --- a/clang/test/CodeGenSYCL/Inputs/sycl.hpp +++ b/clang/test/CodeGenSYCL/Inputs/sycl.hpp @@ -11,7 +11,7 @@ struct sampler_impl { #endif }; -__attribute__((sycl_special_class(sampler))) class sampler { +class __attribute__((sycl_special_class(sampler))) sampler { struct sampler_impl impl; #ifdef __SYCL_DEVICE_ONLY__ void __init(__ocl_sampler_t Sampler) { impl.m_Sampler = Sampler; } @@ -166,7 +166,7 @@ struct _ImplT { template -__attribute__((sycl_special_class(accessor))) class accessor { +class __attribute__((sycl_special_class(accessor))) accessor { public: void use(void) const {} @@ -232,7 +232,7 @@ struct _ImageImplT { }; template -__attribute__((sycl_special_class(accessor))) class accessor { +class __attribute__((sycl_special_class(accessor))) accessor { public: void use(void) const {} template @@ -258,7 +258,7 @@ class accessor -//class accessor +// class accessor class kernel {}; class context {}; @@ -410,7 +410,7 @@ class handler { } }; -__attribute__((sycl_special_class(stream))) class stream { +class __attribute__((sycl_special_class(stream))) stream { public: stream(unsigned long BufferSize, unsigned long MaxStatementSize, handler &CGH) {} diff --git a/clang/test/CodeGenSYCL/accessor_inheritance.cpp b/clang/test/CodeGenSYCL/accessor_inheritance.cpp index cafe1c5ad496e..c478658e59cdc 100644 --- a/clang/test/CodeGenSYCL/accessor_inheritance.cpp +++ b/clang/test/CodeGenSYCL/accessor_inheritance.cpp @@ -72,12 +72,12 @@ int main() { // Check accessors initialization // CHECK: [[ACC_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, %struct{{.*}}Base addrspace(4)* [[BITCAST]], i32 0, i32 2 // Default constructor call -// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0ENS0_6ONEAPI22accessor_property_listIJEEEEC1Ev(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{[^,]*}} [[ACC_FIELD]]) +// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0EEC1Ev(%"class.{{.*}}.cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[ACC_FIELD]]) // CHECK: [[BITCAST1:%[a-zA-Z0-9_]+]] = bitcast %struct{{.*}}Captured addrspace(4)* [[GEP]] to i8 addrspace(4)* // CHECK: [[GEP1:%[a-zA-Z0-9_]+]] = getelementptr inbounds i8, i8 addrspace(4)* [[BITCAST1]], i64 20 -// CHECK: [[BITCAST2:%[a-zA-Z0-9_]+]] = bitcast i8 addrspace(4)* [[GEP1]] to %"class{{.*}}cl::sycl::accessor" addrspace(4)* +// CHECK: [[BITCAST2:%[a-zA-Z0-9_]+]] = bitcast i8 addrspace(4)* [[GEP1]] to %"class._ZTSN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0EEE.cl::sycl::accessor" addrspace(4)* // Default constructor call -// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0ENS0_6ONEAPI22accessor_property_listIJEEEEC2Ev(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{[^,]*}} [[BITCAST2]]) +// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0EEC2Ev(%"class{{.*}}cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[BITCAST2]]) // CHECK C field initialization // CHECK: [[FIELD_C:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Captured, %struct{{.*}}Captured addrspace(4)* [[GEP]], i32 0, i32 2 diff --git a/clang/test/CodeGenSYCL/special-classes.cpp b/clang/test/CodeGenSYCL/special-classes.cpp new file mode 100644 index 0000000000000..52a88e15e655b --- /dev/null +++ b/clang/test/CodeGenSYCL/special-classes.cpp @@ -0,0 +1,80 @@ +// RUN: %clang_cc1 -S -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s + +#include "Inputs/sycl.hpp" + +cl::sycl::queue myQueue; +cl::sycl::handler SH; + +class AccessorBase { + int A; +public: + cl::sycl::accessor + acc; +}; + +class accessor { +public: + int field; +}; + +class stream { +public: + int field; +}; + +class sampler { +public: + int field; + }; + +int main() { + + AccessorBase Accessor1; + accessor Accessor2 = {1}; + stream Stream2; + cl::sycl::sampler Sampler1; + sampler Sampler2; + + myQueue.submit([&](cl::sycl::handler &h) { + h.single_task([=]() { + Accessor1.acc.use(); + }); + h.single_task([=]() { + int a = Accessor2.field; + }); + + cl::sycl::stream Stream1{0, 0, SH}; + h.single_task([=]() { + int a = Stream2.field; + }); + + h.single_task([=] { + Sampler1.use(); + }); + + h.single_task([=] { + int a = Sampler2.field; + }); + + }); + + return 0; +} + +// CHECK: %[[RANGE_TYPE:"struct.*cl::sycl::range"]] +// CHECK: %[[ID_TYPE:"struct.*cl::sycl::id"]] +// CHECK: define dso_local spir_kernel void @{{.*}}kernel_function1 +// CHECK-SAME: i32 [[ARG_A:%[a-zA-Z0-9_]+]], +// CHECK-SAME: i32 addrspace(1)* [[ACC1_DATA:%[a-zA-Z0-9_]+]], +// CHECK-SAME: %[[RANGE_TYPE]]* byval(%[[RANGE_TYPE]]) align 4 [[ACC1_DATA:%[a-zA-Z0-9_]+]], +// CHECK-SAME: %[[RANGE_TYPE]]* byval(%[[RANGE_TYPE]]) align 4 [[ACC2_DATA:%[a-zA-Z0-9_]+]], +// CHECK-SAME: %[[ID_TYPE]]* byval(%[[ID_TYPE]]) align 4 [[ACC3_DATA:%[a-zA-Z0-9_]+]]) + +// CHECK: [[ACC_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class.{{.*}}.AccessorBase, %class.{{.*}}.AccessorBase addrspace(4)* %3, i32 0, i32 1 +// CHECK: call spir_func void @_ZN2cl4sycl8accessorIiLi1ELNS0_6access4modeE1026ELNS2_6targetE2016ELNS2_11placeholderE0EEC1Ev(%"class.{{.*}}.cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[ACC_FIELD]]) + +// CHECK: [[ACC1_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.AccessorBase, %class{{.*}}.AccessorBase addrspace(4)* %5, i32 0, i32 1 +// CHECK: [[ACC1_DATA_LOAD:%[a-zA-Z0-9_]+]] = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* %_arg_acc.addr.ascast, align 8 +// CHECK: call spir_func void @{{.*}}__init{{.*}}(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{.*}} [[ACC1_FIELD]], i32 addrspace(1)* [[ACC1_DATA_LOAD]] + diff --git a/clang/test/SemaSYCL/Inputs/sycl.hpp b/clang/test/SemaSYCL/Inputs/sycl.hpp index acf9e93d15fa1..84f0339d8f89f 100644 --- a/clang/test/SemaSYCL/Inputs/sycl.hpp +++ b/clang/test/SemaSYCL/Inputs/sycl.hpp @@ -102,7 +102,7 @@ struct DeviceValueType { template -__attribute__((sycl_special_class(accessor))) class accessor { +class __attribute__((sycl_special_class(accessor))) accessor { public: void use(void) const {} @@ -162,7 +162,7 @@ struct _ImageImplT { }; template -__attribute__((sycl_special_class(accessor))) class accessor { +class __attribute__((sycl_special_class(accessor))) accessor { public: void use(void) const {} template @@ -181,7 +181,7 @@ struct sampler_impl { #endif }; -__attribute__((sycl_special_class(sampler))) class sampler { +class __attribute__((sycl_special_class(sampler))) sampler { struct sampler_impl impl; #ifdef __SYCL_DEVICE_ONLY__ void __init(__ocl_sampler_t Sampler) { impl.m_Sampler = Sampler; } @@ -285,7 +285,7 @@ class handler { } }; -class stream { +class __attribute__((sycl_special_class(stream))) stream { accessor acc; public: diff --git a/clang/test/SemaSYCL/sampler.cpp b/clang/test/SemaSYCL/sampler.cpp index 40506f800bf99..d6d3cea422ee9 100644 --- a/clang/test/SemaSYCL/sampler.cpp +++ b/clang/test/SemaSYCL/sampler.cpp @@ -19,6 +19,18 @@ int main() { return 0; } +// CHECK: ClassTemplateDecl {{.*}} accessor +// CHECK: SYCLSpecialClassAttr {{.*}} Accessor +// CHECK: CXXRecordDecl {{.*}} implicit class accessor +// CHECK: AccessSpecDecl {{.*}} public +// CHECK: CXXMethodDecl {{.*}} use 'void () const' +// CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition +// CHECK: SYCLSpecialClassAttr {{.*}} Accessor +// CHECK: CXXRecordDecl {{.*}} implicit class accessor +// CHECK: AccessSpecDecl {{.*}} public +// CHECK: CXXMethodDecl {{.*}} use 'void () const' +// CHECK: CXXMethodDecl {{.*}} use 'void (void *) const' + // Check declaration of the test kernel // CHECK: FunctionDecl {{.*}}SamplerLambda{{.*}} 'void (sampler_t)' // diff --git a/clang/test/SemaSYCL/special-classes.cpp b/clang/test/SemaSYCL/special-classes.cpp new file mode 100644 index 0000000000000..01b3cbfbe3344 --- /dev/null +++ b/clang/test/SemaSYCL/special-classes.cpp @@ -0,0 +1,87 @@ +// RUN: %clang_cc1 -S -fsycl-is-device -internal-isystem %S/Inputs -triple spir64 -ast-dump -sycl-std=2020 %s | FileCheck %s + +#include "sycl.hpp" + +sycl::queue myQueue; +sycl::handler H; + +class AccessorBase { + int A; +public: + sycl::accessor + acc; +}; + +class accessor { +public: + int field; +}; + +class stream { +public: + int field; +}; + +class sampler { +public: + int field; + }; + +int main() { + + AccessorBase Accessor1; + accessor Accessor2 = {1}; + sycl::stream Stream1{0, 0, H}; + stream Stream2; + sycl::sampler Sampler1; + sampler Sampler2; + + myQueue.submit([&](sycl::handler &h) { + h.single_task([=]() { + Accessor1.acc.use(); + }); + h.single_task([=]() { + int a = Accessor2.field; + }); + + h.single_task([=]() { + Stream1.use(); + }); + h.single_task([=]() { + int a = Stream2.field; + }); + + h.single_task([=] { + Sampler1.use(); + }); + + h.single_task([=] { + int a = Sampler2.field; + }); + + }); + + return 0; +} + +// CHECK: ClassTemplateDecl {{.*}} accessor +// CHECK: CXXRecordDecl {{.*}} class accessor definition +// CHECK: SYCLSpecialClassAttr {{.*}} Accessor +// CHECK: CXXRecordDecl {{.*}} implicit class accessor + +// CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition +// CHECK: SYCLSpecialClassAttr{{.*}} Accessor +// CHECK: CXXRecordDecl {{.*}} prev {{.*}} implicit class accessor + +// CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition +// CHECK: SYCLSpecialClassAttr{{.*}} Accessor +// CHECK: CXXRecordDecl {{.*}} prev {{.*}} implicit class accessor + +// CHECK: CXXRecordDecl {{.*}} referenced class sampler definition +// CHECK: SYCLSpecialClassAttr {{.*}} Sampler +// CHECK: CXXRecordDecl {{.*}} implicit class sampler + +// CHECK: CXXRecordDecl {{.*}} prev {{.*}} referenced class stream definition +// CHECK: SYCLSpecialClassAttr {{.*}} Stream +// CHECK: CXXRecordDecl {{.*}} implicit referenced class stream diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index b68c0f6e98e6f..90cc78d1e5e4e 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1787,7 +1787,7 @@ accessor(buffer, handler, Type1, Type2, Type3, /// \ingroup sycl_api_acc template -__SYCL_SPECIAL_CLASS(accessor) class accessor< +class __SYCL_SPECIAL_CLASS(accessor) accessor< DataT, Dimensions, AccessMode, access::target::local, IsPlaceholder> : #ifndef __SYCL_DEVICE_ONLY__ public detail::LocalAccessorBaseHost, @@ -1982,7 +1982,7 @@ __SYCL_SPECIAL_CLASS(accessor) class accessor< /// \ingroup sycl_api_acc template -__SYCL_SPECIAL_CLASS(accessor) class accessor< +class __SYCL_SPECIAL_CLASS(accessor) accessor< DataT, Dimensions, AccessMode, access::target::image, IsPlaceholder> : public detail::image_accessor { @@ -2072,7 +2072,7 @@ class accessor -__SYCL_SPECIAL_CLASS(accessor) class accessor< +class __SYCL_SPECIAL_CLASS(accessor) accessor< DataT, Dimensions, AccessMode, access::target::image_array, IsPlaceholder> : public detail::image_accessor { From 89b49c8d3221200495112d94d32b37bce6d4fcf5 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 21 Jun 2021 05:28:20 -0700 Subject: [PATCH 11/82] Respond to review comments Signed-off-by: Zahira Ammarguellat --- clang/include/clang/Basic/Attr.td | 5 ++--- clang/lib/Sema/SemaDeclAttr.cpp | 9 ++------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 225b6f14a6db9..4154884f167a2 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1227,14 +1227,13 @@ def SYCLKernel : InheritableAttr { } def SYCLSpecialClass: InheritableAttr { - let Spellings = [Clang<"sycl_special_class">]; + let Spellings = [Clang<"sycl_special_class", /*allowInC =*/0>]; let Subjects = SubjectList<[CXXRecord]>; - let LangOpts = [SYCLIsDevice, SYCLIsHost]; + let LangOpts = [SYCLIsDevice, SilentlyIgnoreSYCLIsHost]; let Documentation = [Undocumented]; let Args = [EnumArgument<"SpecialClassKind", "SpecialClassKind", ["accessor", "sampler", "stream", ""], ["Accessor", "Sampler", "Stream", "Generic"], 1>]; - let PragmaAttributeSupport = 0; } // Marks functions which must not be vectorized via horizontal SIMT widening, diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 92fd8e28f3e4a..34149dd57e3e3 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -9084,13 +9084,8 @@ static void handleSYCLKernelAttr(Sema &S, Decl *D, const ParsedAttr &AL) { } static void handleSYCLSpecialClassAttr(Sema &S, Decl *D, const ParsedAttr &AL) { - if (S.LangOpts.SYCLIsHost) - return; - - SYCLSpecialClassAttr::SpecialClassKind Kind; - if (AL.getNumArgs() == 0) - Kind = SYCLSpecialClassAttr::Generic; - else { + SYCLSpecialClassAttr::SpecialClassKind Kind = SYCLSpecialClassAttr::Generic; + if (AL.getNumArgs() != 0) { // Check the attribute arguments. if (!AL.isArgIdent(0)) { S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type) From 159b484ca196a32c58adf1fbae3377745017bbbb Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 21 Jun 2021 07:34:28 -0700 Subject: [PATCH 12/82] Respond to review comments Signed-off-by: Zahira Ammarguellat --- clang/test/SemaSYCL/Inputs/sycl.hpp | 3 +- clang/test/SemaSYCL/buffer_location.cpp | 48 +- clang/test/SemaSYCL/decomposition.cpp | 4 +- clang/test/SemaSYCL/kernel-arg-opt-report.cpp | 129 +--- clang/test/SemaSYCL/stream.cpp | 615 +++++++++++++----- 5 files changed, 525 insertions(+), 274 deletions(-) diff --git a/clang/test/SemaSYCL/Inputs/sycl.hpp b/clang/test/SemaSYCL/Inputs/sycl.hpp index 84f0339d8f89f..ac8271ba6a6ff 100644 --- a/clang/test/SemaSYCL/Inputs/sycl.hpp +++ b/clang/test/SemaSYCL/Inputs/sycl.hpp @@ -101,7 +101,8 @@ struct DeviceValueType { template + access::placeholder isPlaceholder = access::placeholder::false_t, + typename propertyListT = ONEAPI::accessor_property_list<>> class __attribute__((sycl_special_class(accessor))) accessor { public: diff --git a/clang/test/SemaSYCL/buffer_location.cpp b/clang/test/SemaSYCL/buffer_location.cpp index 5517a16cffcb8..b951c59054b89 100644 --- a/clang/test/SemaSYCL/buffer_location.cpp +++ b/clang/test/SemaSYCL/buffer_location.cpp @@ -1,7 +1,5 @@ -// RUN: %clang_cc1 -fsycl-is-device -Wno-sycl-2017-compat -ast-dump %s -// RUN: %clang_cc1 -fsycl-is-device -Wno-sycl-2017-compat -verify -pedantic %s - -// expected-no-diagnostics +// RUN: %clang_cc1 -fsycl-is-device -Wno-sycl-2017-compat -ast-dump %s | FileCheck %s +// RUN: %clang_cc1 -fsycl-is-device -Wno-sycl-2017-compat -verify -pedantic -DTRIGGER_ERROR %s #include "Inputs/sycl.hpp" @@ -18,7 +16,8 @@ struct Base { int A, B; cl::sycl::accessor + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list>> AccField; }; @@ -26,45 +25,70 @@ struct Captured : Base, cl::sycl::accessor { + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list>> { int C; }; int main() { +#ifndef TRIGGER_ERROR + // CHECK: SYCLIntelBufferLocationAttr {{.*}} Implicit 1 Captured Obj; cl::sycl::accessor + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list>> + // CHECK: SYCLIntelBufferLocationAttr {{.*}} Implicit 2 accessorA; cl::sycl::accessor + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list< + another_property, + buffer_location<3>>> + // CHECK: SYCLIntelBufferLocationAttr {{.*}} Implicit 3 accessorB; cl::sycl::accessor + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list< + another_property>> accessorC; +#else cl::sycl::accessor + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list>> accessorD; cl::sycl::accessor + cl::sycl::access::placeholder::false_t, + another_property_list> accessorE; cl::sycl::accessor + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list< + buffer_location<1>, + buffer_location<2>>> accessorF; +#endif cl::sycl::kernel_single_task( [=]() { +#ifndef TRIGGER_ERROR + // expected-no-diagnostics Obj.use(); accessorA.use(); accessorB.use(); accessorC.use(); +#else + //expected-error@+1{{buffer_location template parameter must be a non-negative integer}} accessorD.use(); + //expected-error@+1{{sixth template parameter of the accessor must be of accessor_property_list type}} accessorE.use(); + //expected-error@+1{{can't apply buffer_location property twice to the same accessor}} accessorF.use(); +#endif }); return 0; } diff --git a/clang/test/SemaSYCL/decomposition.cpp b/clang/test/SemaSYCL/decomposition.cpp index c8258a9bc9d13..fe4d3e2a8952f 100644 --- a/clang/test/SemaSYCL/decomposition.cpp +++ b/clang/test/SemaSYCL/decomposition.cpp @@ -131,12 +131,12 @@ int main() { myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t1.i; }); }); - // CHECK: FunctionDecl {{.*}}Stream1{{.*}} 'void (__global int *, sycl::range<1>, sycl::range<1>, sycl::id<1>, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, __global int *, sycl::range<1>, sycl::range<1>, sycl::id<1>, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, __global int *, sycl::range<1>, sycl::range<1>, sycl::id<1>, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}Stream1{{.*}} 'void (__global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, StructNonDecomposed, int)' DerivedStruct t2; myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t2.i; }); }); - // CHECK: FunctionDecl {{.*}}Stream2{{.*}} 'void (__global int *, sycl::range<1>, sycl::range<1>, sycl::id<1>, __global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}Stream2{{.*}} 'void (__global char *, sycl::range<1>, sycl::range<1>, sycl::id<1>, int, StructNonDecomposed, int)' } { diff --git a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp index 63e4bd6d66763..46e780f2379c6 100644 --- a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp +++ b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp @@ -216,12 +216,12 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '7' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, -// SPIR-NEXT: String: acc +// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' -// SPIR-NEXT: String: '__global int *' +// SPIR-NEXT: String: '__global char *' // SPIR-NEXT: String: ', ' // SPIR-NEXT: String: 'Size: ' // SPIR-NEXT: Argument: '8' @@ -237,8 +237,8 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '8' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, -// SPIR-NEXT: String: acc +// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' @@ -258,8 +258,8 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '9' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, -// SPIR-NEXT: String: acc +// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' @@ -279,8 +279,8 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '10' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, -// SPIR-NEXT: String: acc +// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' @@ -300,15 +300,15 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '11' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, -// SPIR-NEXT: String: Acc +// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' -// SPIR-NEXT: String: '__global char *' +// SPIR-NEXT: String: int // SPIR-NEXT: String: ', ' // SPIR-NEXT: String: 'Size: ' -// SPIR-NEXT: Argument: '8' +// SPIR-NEXT: Argument: '4' // SPIR-NEXT: String: ')' // SPIR: --- !Passed @@ -321,74 +321,11 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '12' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, -// SPIR-NEXT: String: Acc -// SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' -// SPIR-NEXT: String: 'Type:' -// SPIR-NEXT: String: 'struct sycl::range<1>' -// SPIR-NEXT: String: ', ' -// SPIR-NEXT: String: 'Size: ' -// SPIR-NEXT: Argument: '1' -// SPIR-NEXT: String: ')' - -// SPIR: --- !Passed -// SPIR: Pass:{{.*}}sycl -// SPIR: Name:{{.*}}Region -// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', -// SPIR-NEXT: Line: 28, Column: 8 } -// SPIR-NEXT: Function: _ZTS13KernelFunctor -// SPIR-NEXT: Args: -// SPIR-NEXT: String: 'Arg ' -// SPIR-NEXT: Argument: '13' -// SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, -// SPIR-NEXT: String: Acc +// SPIR-NEXT: String: A // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' // SPIR-NEXT: String: 'Type:' -// SPIR-NEXT: String: 'struct sycl::range<1>' -// SPIR-NEXT: String: ', ' -// SPIR-NEXT: String: 'Size: ' -// SPIR-NEXT: Argument: '1' -// SPIR-NEXT: String: ')' - -// SPIR: --- !Passed -// SPIR: Pass:{{.*}}sycl -// SPIR: Name:{{.*}}Region -// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', -// SPIR-NEXT: Line: 28, Column: 8 } -// SPIR-NEXT: Function: _ZTS13KernelFunctor -// SPIR-NEXT: Args: -// SPIR-NEXT: String: 'Arg ' -// SPIR-NEXT: Argument: '14' -// SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, -// SPIR-NEXT: String: Acc -// SPIR-NEXT: String: ' (' -// SPIR-NEXT: String: '' -// SPIR-NEXT: String: 'Type:' -// SPIR-NEXT: String: 'struct sycl::id<1>' -// SPIR-NEXT: String: ', ' -// SPIR-NEXT: String: 'Size: ' -// SPIR-NEXT: Argument: '1' -// SPIR-NEXT: String: ')' - -// SPIR: --- !Passed -// SPIR: Pass:{{.*}}sycl -// SPIR: Name:{{.*}}Region -// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', -// SPIR-NEXT: Line: 28, Column: 8 } -// SPIR-NEXT: Function: _ZTS13KernelFunctor -// SPIR-NEXT: Args: -// SPIR-NEXT: String: 'Arg ' -// SPIR-NEXT: Argument: '15' -// SPIR-NEXT: String: ':' -// SPIR-NEXT: String: 'Compiler generated argument for decomposed struct/class,' -// SPIR-NEXT: String: stream -// SPIR-NEXT: String: ' (' -// SPIR-NEXT: String: 'Field:FlushBufferSize, ' -// SPIR-NEXT: String: 'Type:' // SPIR-NEXT: String: int // SPIR-NEXT: String: ', ' // SPIR-NEXT: String: 'Size: ' @@ -398,34 +335,12 @@ int main() { // SPIR: --- !Passed // SPIR: Pass:{{.*}}sycl // SPIR: Name:{{.*}}Region -// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', -// SPIR-NEXT: Line: 28, Column: 8 } -// SPIR-NEXT: Function: _ZTS13KernelFunctor -// SPIR-NEXT: Args: -// SPIR-NEXT: - String: 'Arg ' -// SPIR-NEXT: - Argument: '16' -// SPIR-NEXT: - String: ':' -// SPIR-NEXT: - String: '' -// SPIR-NEXT: - String: A -// SPIR-NEXT: - String: ' (' -// SPIR-NEXT: - String: '' -// SPIR-NEXT: - String: 'Type:' -// SPIR-NEXT: - String: int -// SPIR-NEXT: - String: ', ' -// SPIR-NEXT: - String: 'Size: ' -// SPIR-NEXT: - Argument: '4' -// SPIR-NEXT: - String: ')' -// SPIR-NEXT: ... - -// SPIR: --- !Passed -// SPIR: Pass:{{.*}}sycl -// SPIR: Name:{{.*}}Region -// SPIR: DebugLoc:{{.*}}{ File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', // SPIR-NEXT: Line: 28, Column: 8 } // SPIR-NEXT: Function: _ZTS13KernelFunctor // SPIR-NEXT: Args: // SPIR-NEXT: String: 'Arg ' -// SPIR-NEXT: Argument: '17' +// SPIR-NEXT: Argument: '13' // SPIR-NEXT: String: ':' // SPIR-NEXT: String: '' // SPIR-NEXT: String: Ptr @@ -439,14 +354,14 @@ int main() { // SPIR-NEXT: String: ')' // SPIR: --- !Passed -// SPIR: Pass:{{.*}} sycl -// SPIR: Name: Region -// SPIR-NEXT: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR: Pass:{{.*}}sycl +// SPIR: Name:{{.*}}Region +// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', // SPIR-NEXT: Line: 28, Column: 8 } // SPIR-NEXT: Function: _ZTS13KernelFunctor // SPIR-NEXT: Args: // SPIR-NEXT: String: 'Arg ' -// SPIR-NEXT: Argument: '18' +// SPIR-NEXT: Argument: '14' // SPIR-NEXT: String: ':' // SPIR-NEXT: String: Compiler generated argument for array, // SPIR-NEXT: String: Array @@ -462,12 +377,12 @@ int main() { // SPIR: --- !Passed // SPIR: Pass:{{.*}}sycl // SPIR: Name:{{.*}}Region -// SPIR: DebugLoc:{{.*}}{ File: '{{.*}}kernel-arg-opt-report.cpp', +// SPIR: DebugLoc:{{.*}} { File: '{{.*}}kernel-arg-opt-report.cpp', // SPIR-NEXT: Line: 28, Column: 8 } // SPIR-NEXT: Function: _ZTS13KernelFunctor // SPIR-NEXT: Args: // SPIR-NEXT: String: 'Arg ' -// SPIR-NEXT: Argument: '19' +// SPIR-NEXT: Argument: '15' // SPIR-NEXT: String: ':' // SPIR-NEXT: String: Compiler generated argument for sampler, // SPIR-NEXT: String: Sampl diff --git a/clang/test/SemaSYCL/stream.cpp b/clang/test/SemaSYCL/stream.cpp index 4acfb44581fdb..606f77925e13f 100644 --- a/clang/test/SemaSYCL/stream.cpp +++ b/clang/test/SemaSYCL/stream.cpp @@ -44,8 +44,6 @@ int main() { return 0; } -// CHECK: FunctionDecl {{.*}} kernel_parallel_for_work_group {{.*}} -// CHECK: CXXMethodDecl {{.*}} __finalize 'void ()' // Function Declaration // CHECK: FunctionDecl {{.*}}stream_test{{.*}} @@ -53,61 +51,43 @@ int main() { // Initializers: // CHECK: InitListExpr {{.*}} '(lambda at -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' // 'in_lambda' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // 'in_lambda_array' -// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // element 1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' + // 'in_lambda_mdarray' -// CHECK: InitListExpr {{.*}} 'sycl::stream [2][2]' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2][2]' // sub-array 0 // CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // element 1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // sub-array 1 -// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // element 1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // HasStreams struct // CHECK: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // HasStreams::s_array -// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' -// CHECK: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // element 1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' + // HasArrayOfHasStreams -// CHECK: InitListExpr {{.*}} 'HasArrayOfHasStreams' +// CHECK-NEXT: InitListExpr {{.*}} 'HasArrayOfHasStreams' // HasArrayOfHasStreams::i // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' lvalue ParmVar @@ -116,88 +96,92 @@ int main() { // HasStreams struct // CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // HasStreams::s_array -// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // element 1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // HasStreams struct -// CHECK: InitListExpr {{.*}} 'HasStreams' +// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' +// HasStreams::s1 +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// HasStreams::s_array +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' +// element 0 +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// element 1 +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' + +// HasArrayOfHasStreams Array +// CHECK: InitListExpr {{.*}} 'HasArrayOfHasStreams [2]' +// // HasArrayOfHasStreams Struct +// CHECK-NEXT: InitListExpr {{.*}} 'HasArrayOfHasStreams' +// HasArrayOfHasStreams::i +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int' +// CHECK-NEXT: DeclRefExpr {{.*}} 'int' lvalue ParmVar +// HasArrayOfHasStreams::hs +// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams [2]' +// HasStreams struct +// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // HasStreams::s_array -// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // element 1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// HasStreams struct +// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' +// HasStreams::s1 +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// HasStreams::s_array +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' +// element 0 +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' +// element 1 +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // HasArrayOfHasStreams Struct -// CHECK: InitListExpr {{.*}} 'HasArrayOfHasStreams' +// CHECK-NEXT: InitListExpr {{.*}} 'HasArrayOfHasStreams' // HasArrayOfHasStreams::i // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' lvalue ParmVar // HasArrayOfHasStreams::hs -// CHECK: InitListExpr {{.*}} 'HasStreams [2]' +// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams [2]' // HasStreams struct -// CHECK: InitListExpr {{.*}} 'HasStreams' +// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // HasStreams::s_array -// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // element 1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // HasStreams struct -// CHECK: InitListExpr {{.*}} 'HasStreams' +// CHECK-NEXT: InitListExpr {{.*}} 'HasStreams' // HasStreams::s1 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // HasStreams::s_array -// CHECK: InitListExpr {{.*}} 'sycl::stream [2]' +// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream [2]' // element 0 -// CHECK-NEXT: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // element 1 -// CHECK: InitListExpr {{.*}} 'sycl::stream' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'accessor':'sycl::accessor' 'void () noexcept' -// CHECK-NEXT: CXXConstructExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' 'void () noexcept' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::stream':'sycl::stream' 'void () noexcept' // Calls to init // in_lambda __init // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // in_lambda_array // element 0 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue . @@ -206,19 +190,368 @@ int main() { // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 + +// _in_lambda_mdarray +// [0][0] +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// [0][1] +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// [1][0] +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// [1][1] +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 + +// HasStreams +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// array: +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// element 1 +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 + +// HasArrayOfHasStreams +// First element +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// array: +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// element 1 +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// second element +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// array: +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// element 1 +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// HasArrayOfHasStreams array +// First element +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// array: +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// element 1 +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// second element +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// array: +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// element 1 +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// second element +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// array: +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// element 1 +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// second element +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// array: +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// element 1 +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void (__global char *, range<1>, range<1>, id<1>, int)' lvalue .__init +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs +// CHECK-NEXT: ArraySubscriptExpr{{.*}} 'HasArrayOfHasStreams' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasArrayOfHasStreams *' +// CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 + +// Finalize +// in_lambda __finalize +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue . +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at + +// _in_lambda_array +// element 0 +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 +// element 1 +// CHECK: CXXMemberCallExpr {{.*}} 'void' +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue +// CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // _in_lambda_mdarray // [0][0] // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue @@ -229,8 +562,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // [0][1] // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue @@ -238,23 +570,21 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // [1][0] // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream (*)[2]' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // [1][1] // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream [2]' lvalue @@ -262,19 +592,17 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2][2]' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHEC: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // HasStreams // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc -// CHECK: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -283,20 +611,18 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array // CHECK-NEXT: MemberExpr {{.*}} 'HasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // HasArrayOfHasStreams // First element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -306,8 +632,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -317,11 +642,10 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK-NEXT: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -331,12 +655,12 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // second element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc -// CHECK: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' // CHECK-NEXT: MemberExpr {{.*}} 'HasStreams [2]' lvalue .hs // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . @@ -344,8 +668,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -358,8 +681,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -369,12 +691,12 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 + // HasArrayOfHasStreams array // First element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -384,12 +706,11 @@ int main() { // CHECK-NEXT: MemberExpr {{.*}} 'HasArrayOfHasStreams [2]' lvalue . // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 0 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc -// CHECK: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize +// CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue @@ -404,8 +725,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -421,8 +741,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // second element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -435,8 +754,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -452,8 +770,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'cl::sycl::accessor':'sycl::accessor' lvalue .Acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -466,11 +783,10 @@ int main() { // CHECK-NEXT: DeclRefExpr {{.*}} '(lambda at // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 -// CHECK: IntegerLiteral {{.*}} '{{.*}}' 1 +// CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // second element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -483,8 +799,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -500,8 +815,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -517,8 +831,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // second element // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue .s1 // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'HasStreams' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'HasStreams *' @@ -531,8 +844,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 1 // array: // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK: MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK-NEXT: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array @@ -548,8 +860,7 @@ int main() { // CHECK-NEXT: IntegerLiteral {{.*}} '{{.*}}' 0 // element 1 // CHECK: CXXMemberCallExpr {{.*}} 'void' -// CHECK MemberExpr {{.*}} 'void (sycl::accessor::PtrType, range<1>, range<1>, id<1>)' lvalue .__init -// CHECK: MemberExpr {{.*}} 'accessor':'sycl::accessor' lvalue .acc +// CHECK-NEXT: MemberExpr {{.*}} 'void ()' lvalue .__finalize // CHECK-NEXT: ArraySubscriptExpr {{.*}} 'sycl::stream':'sycl::stream' lvalue // CHECK-NEXT: ImplicitCastExpr {{.*}} 'sycl::stream *' // CHECK-NEXT: MemberExpr {{.*}} 'sycl::stream [2]' lvalue .s_array From fe1450ec2ebcc224067fb1a70b972b34f0927f32 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 22 Jun 2021 06:50:33 -0700 Subject: [PATCH 13/82] Removed the enum argument from the attribute definition Signed-off-by: Zahira Ammarguellat --- clang/include/clang/Basic/Attr.td | 4 +--- clang/lib/Sema/SemaDeclAttr.cpp | 24 ++++++++---------------- clang/lib/Sema/SemaSYCL.cpp | 11 ++++++----- clang/test/SemaSYCL/sampler.cpp | 4 ++-- clang/test/SemaSYCL/special-classes.cpp | 10 +++++----- 5 files changed, 22 insertions(+), 31 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 4154884f167a2..162553b68d845 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1231,9 +1231,7 @@ def SYCLSpecialClass: InheritableAttr { let Subjects = SubjectList<[CXXRecord]>; let LangOpts = [SYCLIsDevice, SilentlyIgnoreSYCLIsHost]; let Documentation = [Undocumented]; - let Args = [EnumArgument<"SpecialClassKind", "SpecialClassKind", - ["accessor", "sampler", "stream", ""], - ["Accessor", "Sampler", "Stream", "Generic"], 1>]; + let Args = [IdentifierArgument<"ClassType">]; } // Marks functions which must not be vectorized via horizontal SIMT widening, diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 34149dd57e3e3..768ee5ba42c7f 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -9084,23 +9084,15 @@ static void handleSYCLKernelAttr(Sema &S, Decl *D, const ParsedAttr &AL) { } static void handleSYCLSpecialClassAttr(Sema &S, Decl *D, const ParsedAttr &AL) { - SYCLSpecialClassAttr::SpecialClassKind Kind = SYCLSpecialClassAttr::Generic; - if (AL.getNumArgs() != 0) { - // Check the attribute arguments. - if (!AL.isArgIdent(0)) { - S.Diag(AL.getLoc(), diag::err_attribute_argument_n_type) - << AL << 0 << AANT_ArgumentIdentifier; - return; - } - - IdentifierInfo *II = AL.getArgAsIdent(0)->Ident; - if (!SYCLSpecialClassAttr::ConvertStrToSpecialClassKind(II->getName(), - Kind)) { - S.Diag(AL.getLoc(), diag::warn_attribute_type_not_supported) << AL << II; - return; - } + if (!AL.isArgIdent(0)) { + S.Diag(AL.getLoc(), diag::err_attribute_argument_type) + << AL << AANT_ArgumentIdentifier; + return; } - D->addAttr(::new (S.Context) SYCLSpecialClassAttr(S.Context, AL, Kind)); + + IdentifierInfo *ClassKind = AL.getArgAsIdent(0)->Ident; + + D->addAttr(::new (S.Context) SYCLSpecialClassAttr(S.Context, AL, ClassKind)); } static void handleDestroyAttr(Sema &S, Decl *D, const ParsedAttr &A) { diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index bb5c682e14f5e..e0c0d5c78125f 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5055,13 +5055,13 @@ bool SYCLIntegrationFooter::emit(raw_ostream &OS) { // ----------------------------------------------------------------------------- // Utility class methods // ----------------------------------------------------------------------------- - bool Util::isSyclAccessorType(const QualType Ty) { const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); if (!RecTy) return false; // only classes/structs supported if (const auto *A = RecTy->getAttr()) - return A->getSpecialClassKind() == SYCLSpecialClassAttr::Accessor; + return (A->getClassType()->getName() == "accessor" && + getMethodByName(RecTy, "__init")); return false; } @@ -5070,7 +5070,8 @@ bool Util::isSyclSamplerType(const QualType Ty) { if (!RecTy) return false; // only classes/structs supported if (const auto *A = RecTy->getAttr()) - return A->getSpecialClassKind() == SYCLSpecialClassAttr::Sampler; + return (A->getClassType()->getName() == "sampler" && + getMethodByName(RecTy, "__init")); return false; } @@ -5079,13 +5080,13 @@ bool Util::isSyclStreamType(const QualType Ty) { if (!RecTy) return false; // only classes/structs supported if (const auto *A = RecTy->getAttr()) - return A->getSpecialClassKind() == SYCLSpecialClassAttr::Stream; + return (A->getClassType()->getName() == "stream" && + getMethodByName(RecTy, "__finalize")); return false; } // TODO: Remove this once structs decomposing is optimized bool Util::isSyclHalfType(const QualType Ty) { - const StringRef &Name = "half"; std::array Scopes = { Util::MakeDeclContextDesc(Decl::Kind::Namespace, "cl"), Util::MakeDeclContextDesc(Decl::Kind::Namespace, "sycl"), diff --git a/clang/test/SemaSYCL/sampler.cpp b/clang/test/SemaSYCL/sampler.cpp index d6d3cea422ee9..caaa7164502ed 100644 --- a/clang/test/SemaSYCL/sampler.cpp +++ b/clang/test/SemaSYCL/sampler.cpp @@ -20,12 +20,12 @@ int main() { } // CHECK: ClassTemplateDecl {{.*}} accessor -// CHECK: SYCLSpecialClassAttr {{.*}} Accessor +// CHECK: SYCLSpecialClassAttr {{.*}} accessor // CHECK: CXXRecordDecl {{.*}} implicit class accessor // CHECK: AccessSpecDecl {{.*}} public // CHECK: CXXMethodDecl {{.*}} use 'void () const' // CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr {{.*}} Accessor +// CHECK: SYCLSpecialClassAttr {{.*}} accessor // CHECK: CXXRecordDecl {{.*}} implicit class accessor // CHECK: AccessSpecDecl {{.*}} public // CHECK: CXXMethodDecl {{.*}} use 'void () const' diff --git a/clang/test/SemaSYCL/special-classes.cpp b/clang/test/SemaSYCL/special-classes.cpp index 01b3cbfbe3344..7c003c47d9986 100644 --- a/clang/test/SemaSYCL/special-classes.cpp +++ b/clang/test/SemaSYCL/special-classes.cpp @@ -67,21 +67,21 @@ int main() { // CHECK: ClassTemplateDecl {{.*}} accessor // CHECK: CXXRecordDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr {{.*}} Accessor +// CHECK: SYCLSpecialClassAttr {{.*}} accessor // CHECK: CXXRecordDecl {{.*}} implicit class accessor // CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr{{.*}} Accessor +// CHECK: SYCLSpecialClassAttr{{.*}} accessor // CHECK: CXXRecordDecl {{.*}} prev {{.*}} implicit class accessor // CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr{{.*}} Accessor +// CHECK: SYCLSpecialClassAttr{{.*}} accessor // CHECK: CXXRecordDecl {{.*}} prev {{.*}} implicit class accessor // CHECK: CXXRecordDecl {{.*}} referenced class sampler definition -// CHECK: SYCLSpecialClassAttr {{.*}} Sampler +// CHECK: SYCLSpecialClassAttr {{.*}} sampler // CHECK: CXXRecordDecl {{.*}} implicit class sampler // CHECK: CXXRecordDecl {{.*}} prev {{.*}} referenced class stream definition -// CHECK: SYCLSpecialClassAttr {{.*}} Stream +// CHECK: SYCLSpecialClassAttr {{.*}} stream // CHECK: CXXRecordDecl {{.*}} implicit referenced class stream From 9c594653807839f67ce4a5df93a18fa35d33ab12 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 22 Jun 2021 10:25:06 -0700 Subject: [PATCH 14/82] Formatting Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index e0c0d5c78125f..ae11e76a11857 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5080,8 +5080,8 @@ bool Util::isSyclStreamType(const QualType Ty) { if (!RecTy) return false; // only classes/structs supported if (const auto *A = RecTy->getAttr()) - return (A->getClassType()->getName() == "stream" && - getMethodByName(RecTy, "__finalize")); + return (A->getClassType()->getName() == "stream" && + getMethodByName(RecTy, "__finalize")); return false; } From f4cfd63695f0d214b6d5678a8aae8eab796ac5d3 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 22 Jun 2021 11:14:53 -0700 Subject: [PATCH 15/82] Fix LIT test pragma-attribute-supported-attributes-list Signed-off-by: Zahira Ammarguellat --- clang/test/Misc/pragma-attribute-supported-attributes-list.test | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/test/Misc/pragma-attribute-supported-attributes-list.test b/clang/test/Misc/pragma-attribute-supported-attributes-list.test index 1ae53304bc822..2eb5ec407599f 100644 --- a/clang/test/Misc/pragma-attribute-supported-attributes-list.test +++ b/clang/test/Misc/pragma-attribute-supported-attributes-list.test @@ -168,6 +168,7 @@ // CHECK-NEXT: SYCLIntelUseStallEnableClusters (SubjectMatchRule_function) // CHECK-NEXT: SYCLRegisterNum (SubjectMatchRule_variable_is_global) // CHECK-NEXT: SYCLSimd (SubjectMatchRule_function, SubjectMatchRule_variable_is_global) +// CHECK-NEXT: SYCLSpecialClass (SubjectMatchRule_record) // CHECK-NEXT: ScopedLockable (SubjectMatchRule_record) // CHECK-NEXT: Section (SubjectMatchRule_function, SubjectMatchRule_variable_is_global, SubjectMatchRule_objc_method, SubjectMatchRule_objc_property) // CHECK-NEXT: SetTypestate (SubjectMatchRule_function_is_member) From ad5c50fe921d785eddeea332c37186235b39a7c4 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 23 Jun 2021 12:06:52 -0700 Subject: [PATCH 16/82] Respond to review comments --- clang/include/clang/Basic/Attr.td | 2 +- clang/include/clang/Basic/AttrDocs.td | 20 ++++++++++ clang/lib/Sema/SemaSYCL.cpp | 24 ++++++------ clang/test/CodeGenSYCL/Inputs/sycl.hpp | 5 ++- .../test/CodeGenSYCL/accessor_inheritance.cpp | 6 +-- .../accessor_no_alias_property.cpp | 12 ++++-- clang/test/CodeGenSYCL/buffer_location.cpp | 18 ++++++--- .../CodeGenSYCL/int_header_spec_const.cpp | 28 ++++++++++++- clang/test/CodeGenSYCL/special-classes.cpp | 39 +++++++++++++++---- clang/test/SemaSYCL/decomposition.cpp | 8 ++-- clang/test/SemaSYCL/spec-const-kernel-arg.cpp | 10 ++--- .../SemaSYCL/spec_const_and_accesor_crash.cpp | 2 +- 12 files changed, 126 insertions(+), 48 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 557b8da082771..55093f88178d4 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1230,7 +1230,7 @@ def SYCLSpecialClass: InheritableAttr { let Spellings = [Clang<"sycl_special_class", /*allowInC =*/0>]; let Subjects = SubjectList<[CXXRecord]>; let LangOpts = [SYCLIsDevice, SilentlyIgnoreSYCLIsHost]; - let Documentation = [Undocumented]; + let Documentation = [SYCLSpecialClassDocs]; let Args = [IdentifierArgument<"ClassType">]; } diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index 956ee6f96e4ce..d24d1f3d85025 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -405,6 +405,26 @@ The SYCL kernel in the previous code sample meets these expectations. }]; } +def SYCLSpecialClassDocs : Documentation { + let Category = DocCatStmt; + let Content = [{ +The ``__attribute__((sycl_special_class[KIND]))`` attribute is used in SYCL +headers to indicate that a class or a struct needs additional handling when +it is passed from host to device. Please note that this is an attribute that is +used for internal implementation and not intended to be used by external users. +KIND can be equal to ``accessor``, ``sampler`` , or ``stream`` for sycl classes +or equal to ``generic`` for some generic class/struct (generic marking +class/struc that require special handling). + +.. code-block:: c++ + class __attribute__((sycl_special_class(accessor))) accessor { + +private: + void __init() {} +}; + }]; +} + def SYCLSimdDocs : Documentation { let Category = DocCatFunction; let Content = [{ diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 8deb047c3c290..7961e5ae661d8 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5064,8 +5064,17 @@ bool Util::isSyclStreamType(const QualType Ty) { return false; } -// TODO: Remove this once structs decomposing is optimized -bool Util::isSyclHalfType(const QualType Ty) { +bool Util::isSyclHalfType(QualType Ty) { + std::array Scopes = { + Util::MakeDeclContextDesc(Decl::Kind::Namespace, "cl"), + Util::MakeDeclContextDesc(Decl::Kind::Namespace, "sycl"), + Util::MakeDeclContextDesc(Decl::Kind::Namespace, "detail"), + Util::MakeDeclContextDesc(Decl::Kind::Namespace, "half_impl"), + Util::MakeDeclContextDesc(Decl::Kind::CXXRecord, "half")}; + return matchQualifiedTypeName(Ty, Scopes); +} + +bool Util::isSyclSpecConstantType(QualType Ty) { std::array Scopes = { Util::MakeDeclContextDesc(Decl::Kind::Namespace, "cl"), Util::MakeDeclContextDesc(Decl::Kind::Namespace, "sycl"), @@ -5076,17 +5085,6 @@ bool Util::isSyclHalfType(const QualType Ty) { return matchQualifiedTypeName(Ty, Scopes); } -// TODO: Do we need an attribute for this one as well? -bool Util::isSyclSpecConstantType(const QualType Ty) { - const StringRef &Name = "spec_constant"; - std::array Scopes = { - Util::DeclContextDesc{clang::Decl::Kind::Namespace, "cl"}, - Util::DeclContextDesc{clang::Decl::Kind::Namespace, "sycl"}, - Util::DeclContextDesc{clang::Decl::Kind::Namespace, "experimental"}, - Util::DeclContextDesc{Decl::Kind::ClassTemplateSpecialization, Name}}; - return matchQualifiedTypeName(Ty, Scopes); -} - bool Util::isSyclSpecIdType(QualType Ty) { std::array Scopes = { Util::MakeDeclContextDesc(clang::Decl::Kind::Namespace, "cl"), diff --git a/clang/test/CodeGenSYCL/Inputs/sycl.hpp b/clang/test/CodeGenSYCL/Inputs/sycl.hpp index b5f712639fde0..4baeb47ab8838 100644 --- a/clang/test/CodeGenSYCL/Inputs/sycl.hpp +++ b/clang/test/CodeGenSYCL/Inputs/sycl.hpp @@ -165,7 +165,8 @@ struct _ImplT { template + access::placeholder isPlaceholder = access::placeholder::false_t, + typename propertyListT = ONEAPI::accessor_property_list<>> class __attribute__((sycl_special_class(accessor))) accessor { public: @@ -258,7 +259,7 @@ class accessor -// class accessor +//class accessor class kernel {}; class context {}; diff --git a/clang/test/CodeGenSYCL/accessor_inheritance.cpp b/clang/test/CodeGenSYCL/accessor_inheritance.cpp index c478658e59cdc..cafe1c5ad496e 100644 --- a/clang/test/CodeGenSYCL/accessor_inheritance.cpp +++ b/clang/test/CodeGenSYCL/accessor_inheritance.cpp @@ -72,12 +72,12 @@ int main() { // Check accessors initialization // CHECK: [[ACC_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, %struct{{.*}}Base addrspace(4)* [[BITCAST]], i32 0, i32 2 // Default constructor call -// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0EEC1Ev(%"class.{{.*}}.cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[ACC_FIELD]]) +// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0ENS0_6ONEAPI22accessor_property_listIJEEEEC1Ev(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{[^,]*}} [[ACC_FIELD]]) // CHECK: [[BITCAST1:%[a-zA-Z0-9_]+]] = bitcast %struct{{.*}}Captured addrspace(4)* [[GEP]] to i8 addrspace(4)* // CHECK: [[GEP1:%[a-zA-Z0-9_]+]] = getelementptr inbounds i8, i8 addrspace(4)* [[BITCAST1]], i64 20 -// CHECK: [[BITCAST2:%[a-zA-Z0-9_]+]] = bitcast i8 addrspace(4)* [[GEP1]] to %"class._ZTSN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0EEE.cl::sycl::accessor" addrspace(4)* +// CHECK: [[BITCAST2:%[a-zA-Z0-9_]+]] = bitcast i8 addrspace(4)* [[GEP1]] to %"class{{.*}}cl::sycl::accessor" addrspace(4)* // Default constructor call -// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0EEC2Ev(%"class{{.*}}cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[BITCAST2]]) +// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0ENS0_6ONEAPI22accessor_property_listIJEEEEC2Ev(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{[^,]*}} [[BITCAST2]]) // CHECK C field initialization // CHECK: [[FIELD_C:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Captured, %struct{{.*}}Captured addrspace(4)* [[GEP]], i32 0, i32 2 diff --git a/clang/test/CodeGenSYCL/accessor_no_alias_property.cpp b/clang/test/CodeGenSYCL/accessor_no_alias_property.cpp index 7e78514c8cf0d..682480cf9569f 100644 --- a/clang/test/CodeGenSYCL/accessor_no_alias_property.cpp +++ b/clang/test/CodeGenSYCL/accessor_no_alias_property.cpp @@ -1,22 +1,26 @@ // RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -emit-llvm %s -o - | FileCheck %s // check that noalias parameter attribute is emitted when no_alias accessor property is used -// CHECK: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function1({{.*}} nocapture %_arg_, {{.*}}) +// CHECK: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function1({{.*}} noalias {{.*}} %_arg_, {{.*}}) // check that noalias parameter attribute is NOT emitted when it is not used // CHECK: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function2{{.*}} !kernel_arg_buffer_location -// CHECK-NOT: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function2({{.*}} nocapture %_arg_, {{.*}} +// CHECK-NOT: define {{.*}}spir_kernel void @_ZTSZ4mainE16kernel_function2({{.*}} noalias {{.*}} #include "Inputs/sycl.hpp" int main() { cl::sycl::accessor + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list< + cl::sycl::ONEAPI::property::no_alias::instance>> accessorA; cl::sycl::accessor + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list< + cl::sycl::INTEL::property::buffer_location::instance<1>>> accessorB; cl::sycl::kernel_single_task( diff --git a/clang/test/CodeGenSYCL/buffer_location.cpp b/clang/test/CodeGenSYCL/buffer_location.cpp index 24f8451e5eaa2..930822b88922c 100644 --- a/clang/test/CodeGenSYCL/buffer_location.cpp +++ b/clang/test/CodeGenSYCL/buffer_location.cpp @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -emit-llvm %s -o - | FileCheck %s // CHECK: define {{.*}}spir_kernel void @_ZTSZ4mainE15kernel_function{{.*}} !kernel_arg_buffer_location ![[MDBL:[0-9]+]] -// CHECK: ![[MDBL]] = !{i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1} +// CHECK: ![[MDBL]] = !{i32 3, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 2, i32 -1, i32 -1, i32 -1, i32 2, i32 -1, i32 -1, i32 -1, i32 -1} #include "Inputs/sycl.hpp" @@ -9,14 +9,18 @@ struct Base { int A, B; cl::sycl::accessor - AccField; + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list< + cl::sycl::INTEL::property::buffer_location::instance<2>>> + AccField; }; struct Captured : Base, cl::sycl::accessor { + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list< + cl::sycl::INTEL::property::buffer_location::instance<2>>> { int C; }; @@ -24,8 +28,10 @@ int main() { Captured Obj; cl::sycl::accessor - accessorA; + cl::sycl::access::placeholder::false_t, + cl::sycl::ONEAPI::accessor_property_list< + cl::sycl::INTEL::property::buffer_location::instance<3>>> + accessorA; cl::sycl::kernel_single_task( [=]() { accessorA.use(); diff --git a/clang/test/CodeGenSYCL/int_header_spec_const.cpp b/clang/test/CodeGenSYCL/int_header_spec_const.cpp index 4d993eee0237c..d745e43d1b013 100644 --- a/clang/test/CodeGenSYCL/int_header_spec_const.cpp +++ b/clang/test/CodeGenSYCL/int_header_spec_const.cpp @@ -44,21 +44,47 @@ int main() { double val; double *ptr = &val; // to avoid "unused" warnings - // CHECK: // Forward declarations of templated kernel function types: + // CHECK: // Forward declarations of templated spec constant types: + // CHECK: class MyInt8Const; + // CHECK: class MyUInt8Const; + // CHECK: class MyInt16Const; + // CHECK: class MyUInt16Const; + // CHECK: class MyInt32Const; + // CHECK: class MyUInt32Const; + // CHECK: class MyFloatConst; + // CHECK: class MyDoubleConst; // CHECK: class SpecializedKernel; + // CHECK: namespace test { + // CHECK: class MySpecConstantWithinANamespace; + // CHECK: } cl::sycl::kernel_single_task([=]() { *ptr = i1.get() + + // CHECK-DAG: template <> struct sycl::detail::SpecConstantInfo<::MyBoolConst> { + // CHECK-DAG-NEXT: static constexpr const char* getName() { + // CHECK-DAG-NEXT: return "_ZTS11MyBoolConst"; + // CHECK-DAG-NEXT: } + // CHECK-DAG-NEXT: }; i8.get() + + // CHECK-DAG: return "_ZTS11MyInt8Const"; ui8.get() + + // CHECK-DAG: return "_ZTS12MyUInt8Const"; i16.get() + + // CHECK-DAG: return "_ZTS12MyInt16Const"; ui16.get() + + // CHECK-DAG: return "_ZTS13MyUInt16Const"; i32.get() + i32_1.get() + + // CHECK-DAG: return "_ZTS12MyInt32Const"; ui32.get() + + // CHECK-DAG: return "_ZTS13MyUInt32Const"; f32.get() + + // CHECK-DAG: return "_ZTS12MyFloatConst"; f64.get() + + // CHECK-DAG: return "_ZTS13MyDoubleConst"; spec1.get() + + // CHECK-DAG: return "_ZTS17SpecializedKernel" spec2.get(); + // CHECK-DAG: return "_ZTSN4test30MySpecConstantWithinANamespaceE" }); } diff --git a/clang/test/CodeGenSYCL/special-classes.cpp b/clang/test/CodeGenSYCL/special-classes.cpp index 52a88e15e655b..0f22940ac0e4e 100644 --- a/clang/test/CodeGenSYCL/special-classes.cpp +++ b/clang/test/CodeGenSYCL/special-classes.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -S -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -S -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s #include "Inputs/sycl.hpp" @@ -7,10 +7,11 @@ cl::sycl::handler SH; class AccessorBase { int A; + public: cl::sycl::accessor - acc; + cl::sycl::access::target::local> + acc; }; class accessor { @@ -26,7 +27,7 @@ class stream { class sampler { public: int field; - }; +}; int main() { @@ -49,14 +50,13 @@ int main() { int a = Stream2.field; }); - h.single_task([=] { + h.single_task([=] { Sampler1.use(); }); - h.single_task([=] { + h.single_task([=] { int a = Sampler2.field; }); - }); return 0; @@ -72,9 +72,32 @@ int main() { // CHECK-SAME: %[[ID_TYPE]]* byval(%[[ID_TYPE]]) align 4 [[ACC3_DATA:%[a-zA-Z0-9_]+]]) // CHECK: [[ACC_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class.{{.*}}.AccessorBase, %class.{{.*}}.AccessorBase addrspace(4)* %3, i32 0, i32 1 -// CHECK: call spir_func void @_ZN2cl4sycl8accessorIiLi1ELNS0_6access4modeE1026ELNS2_6targetE2016ELNS2_11placeholderE0EEC1Ev(%"class.{{.*}}.cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[ACC_FIELD]]) +// CHECK: call spir_func void @_ZN2cl4sycl8accessorIiLi1ELNS0_6access4modeE1026ELNS2_6targetE2016ELNS2_11placeholderE0ENS0_6ONEAPI22accessor_property_listIJEEEEC1Ev(%"class.{{.*}}.cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[ACC_FIELD]]) // CHECK: [[ACC1_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.AccessorBase, %class{{.*}}.AccessorBase addrspace(4)* %5, i32 0, i32 1 // CHECK: [[ACC1_DATA_LOAD:%[a-zA-Z0-9_]+]] = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* %_arg_acc.addr.ascast, align 8 // CHECK: call spir_func void @{{.*}}__init{{.*}}(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{.*}} [[ACC1_FIELD]], i32 addrspace(1)* [[ACC1_DATA_LOAD]] +// CHECK: define dso_local spir_kernel void @{{.*}}kernel_function2(%class.{{.*}}.accessor* byval(%class.{{.*}}.accessor) align 4 [[ARG_F2:%[a-zA-Z0-9_]+]]) +// CHECK: [[KERNEL_F2:%[a-zA-Z0-9_]+]] = alloca %class.{{.*}}.anon +// CHECK: [[KERNEL_OBJ_F2:%[a-zA-Z0-9_]+]] = addrspacecast %class.{{.*}}.anon* [[KERNEL_F2]] to %class.{{.*}}.anon addrspace(4)* +// CHECK: call spir_func void @_ZZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_ENKUlvE0_clEv(%class.{{.*}}.anon addrspace(4)* align 4 dereferenceable_or_null(4) [[KERNEL_OBJ_F2]] + +// CHECK: define dso_local spir_kernel void @{{.*}}kernel_function3(%class.{{.*}}.stream* byval(%class.{{.*}}.stream) align 4 [[ARG_F3:%[a-zA-Z0-9_]+]]) +// CHECK: [[KERNEL_F3:%[a-zA-Z0-9_]+]] = alloca %class.{{.*}}.anon +// CHECK: [[KERNEL_OBJ_F3:%[a-zA-Z0-9_]+]] = addrspacecast %class.{{.*}}.anon* [[KERNEL_F3]] to %class.{{.*}}.anon addrspace(4)* +// CHECK: call spir_func void @_ZZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_ENKUlvE1_clEv(%class.{{.*}}.anon addrspace(4)* align 4 dereferenceable_or_null(4) [[KERNEL_OBJ_F3]]) + +// CHECK: define dso_local spir_kernel void @_{{.*}}kernel_function4(%opencl.sampler_t addrspace(2)* [[ARG_F3:%[a-zA-Z0-9_]+]]) +// CHECK: [[ARG_F3]].addr = alloca %opencl.sampler_t addrspace(2)*, align 8 +// CHECK: [[ARG_F3]].addr.ascast = addrspacecast %opencl.sampler_t addrspace(2)** [[ARG_F3]].addr to %opencl.sampler_t addrspace(2)* addrspace(4)* +// CHECK: [[ANON_F4:%[0-9]+]] = alloca %class.{{.*}}.anon, align 8 +// CHECK: [[ANON_CAST_F4:%[0-9]+]] = addrspacecast %class.{{.*}}.anon* [[ANON_F4]] to %class.{{.*}}.anon addrspace(4)* +// CHECK: [[GEP_F3:%[0-9]+]] = getelementptr inbounds %class.{{.*}}.anon, %class.{{.*}}.anon addrspace(4)* [[ANON_CAST_F4]], i32 0, i32 0 +// CHECK: [[LOAD_ARG_F4:%[0-9]+]] = load %opencl.sampler_t addrspace(2)*, %opencl.sampler_t addrspace(2)* addrspace(4)* [[ARG_F3]].addr.ascast, align 8 +// CHECK: call spir_func void @_ZN2cl4sycl7sampler6__initE11ocl_sampler(%"class.{{.*}}.cl::sycl::sampler" addrspace(4)* align 8 dereferenceable_or_null(8) [[GEP_F3]], %opencl.sampler_t addrspace(2)* [[LOAD_ARG_F4]]) + +// CHECK: define dso_local spir_kernel void @_{{.*}}kernel_function5(%class.{{.*}}.sampler* byval(%class.{{.*}}.sampler) align 4 [[ARG_F5:%[a-zA-Z0-9_]+]]) +// CHECK: [[KERNEL_F5:%[0-9]+]] = alloca %class.{{.*}}.anon, align 4 +// CHECK: [[KERNEL_OBJ_F5:%[0-9]+]] = addrspacecast %class.{{.*}}.anon* [[KERNEL_F5]] to %class.{{.*}}.anon addrspace(4)* +// CHECK: call spir_func void @_ZZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_ENKUlvE3_clEv(%class.{{.*}}.anon addrspace(4)* align 4 dereferenceable_or_null(4) [[KERNEL_OBJ_F5]]) diff --git a/clang/test/SemaSYCL/decomposition.cpp b/clang/test/SemaSYCL/decomposition.cpp index fe4d3e2a8952f..f56fde742b11f 100644 --- a/clang/test/SemaSYCL/decomposition.cpp +++ b/clang/test/SemaSYCL/decomposition.cpp @@ -117,13 +117,13 @@ int main() { myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t1.i; }); }); - // CHECK: FunctionDecl {{.*}}SpecConst1{{.*}} 'void (sycl::ONEAPI::experimental::spec_constant, sycl::ONEAPI::experimental::spec_constant, sycl::ONEAPI::experimental::spec_constant, StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}SpecConst{{.*}} 'void (StructNonDecomposed, int)' DerivedStruct t2; myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t2.i; }); }); - // CHECK: FunctionDecl {{.*}}SpecConst2{{.*}} 'void (sycl::ONEAPI::experimental::spec_constant, StructNonDecomposed, int)' + // CHECK: FunctionDecl {{.*}}SpecConst2{{.*}} 'void (StructNonDecomposed, int)' } { @@ -144,12 +144,12 @@ int main() { myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t1.i; }); }); - // CHECK: FunctionDecl {{.*}}Half1{{.*}} 'void (StructWithArray)' + // CHECK: FunctionDecl {{.*}}Half1{{.*}} 'void (sycl::half, sycl::half, sycl::half, StructNonDecomposed, int)' DerivedStruct t2; myQueue.submit([&](sycl::handler &h) { h.single_task([=]() { return t2.i; }); }); - // CHECK: FunctionDecl {{.*}}Half2{{.*}} 'void (DerivedStruct)' + // CHECK: FunctionDecl {{.*}}Half2{{.*}} 'void (sycl::half, StructNonDecomposed, int)' } } diff --git a/clang/test/SemaSYCL/spec-const-kernel-arg.cpp b/clang/test/SemaSYCL/spec-const-kernel-arg.cpp index 7556907c9484e..014bf4dcfb796 100644 --- a/clang/test/SemaSYCL/spec-const-kernel-arg.cpp +++ b/clang/test/SemaSYCL/spec-const-kernel-arg.cpp @@ -24,10 +24,10 @@ int main() { }); } -// CHECK: FunctionDecl {{.*}}kernel_sc{{.*}} 'void (sycl::ONEAPI::experimental::spec_constant, sycl::ONEAPI::experimental::spec_constant, sycl::ONEAPI::experimental::spec_constant)' -// CHECK: VarDecl {{.*}}'(lambda at {{.*}})' -// CHECK: InitListExpr {{.*}}'(lambda at {{.*}})' +// CHECK: FunctionDecl {{.*}}kernel_sc{{.*}} 'void ()' +// CHECK: VarDecl {{.*}}'(lambda at {{.*}}' +// CHECK-NEXT: InitListExpr {{.*}}'(lambda at {{.*}}' // CHECK-NEXT: CXXConstructExpr {{.*}}'sycl::ONEAPI::experimental::spec_constant':'sycl::ONEAPI::experimental::spec_constant' -// CHECK: InitListExpr {{.*}} 'SpecConstantsWrapper' -// CHECK: CXXConstructExpr {{.*}} 'sycl::ONEAPI::experimental::spec_constant':'sycl::ONEAPI::experimental::spec_constant' +// CHECK-NEXT: InitListExpr {{.*}} 'SpecConstantsWrapper' +// CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::ONEAPI::experimental::spec_constant':'sycl::ONEAPI::experimental::spec_constant' // CHECK: CXXConstructExpr {{.*}} 'sycl::ONEAPI::experimental::spec_constant':'sycl::ONEAPI::experimental::spec_constant' diff --git a/clang/test/SemaSYCL/spec_const_and_accesor_crash.cpp b/clang/test/SemaSYCL/spec_const_and_accesor_crash.cpp index ed92a7988b591..15a4ed6d7dfc6 100644 --- a/clang/test/SemaSYCL/spec_const_and_accesor_crash.cpp +++ b/clang/test/SemaSYCL/spec_const_and_accesor_crash.cpp @@ -12,7 +12,7 @@ __attribute__((sycl_kernel)) void kernel(const Func &kernelFunc) { int main() { cl::sycl::ONEAPI::experimental::spec_constant spec_const; cl::sycl::accessor accessor; - // CHECK: FieldDecl {{.*}} implicit 'cl::sycl::ONEAPI::experimental::spec_constant' + // CHECK: FieldDecl {{.*}} implicit referenced 'cl::sycl::ONEAPI::experimental::spec_constant' // CHECK: FieldDecl {{.*}} implicit referenced 'cl::sycl::accessor' kernel([spec_const, accessor]() {}); return 0; From 68fb2b57a1242ab7721fa1e4628269737fcd2310 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 26 Jul 2021 08:08:39 -0700 Subject: [PATCH 17/82] Making special classes type agnostic Signed-off-by: Zahira Ammarguellat --- clang/include/clang/Basic/Attr.td | 3 +- clang/include/clang/Basic/AttrDocs.td | 8 +- clang/lib/Sema/SemaDeclAttr.cpp | 14 +- clang/lib/Sema/SemaSYCL.cpp | 304 ++++++------------------ clang/test/CodeGenSYCL/Inputs/sycl.hpp | 8 +- clang/test/SemaSYCL/Inputs/sycl.hpp | 26 +- clang/test/SemaSYCL/sampler.cpp | 4 +- clang/test/SemaSYCL/special-classes.cpp | 10 +- sycl/include/CL/sycl/accessor.hpp | 6 +- sycl/include/CL/sycl/detail/defines.hpp | 4 +- 10 files changed, 107 insertions(+), 280 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 2e97397f0972d..dd71083890feb 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1227,11 +1227,10 @@ def SYCLKernel : InheritableAttr { } def SYCLSpecialClass: InheritableAttr { - let Spellings = [Clang<"sycl_special_class", /*allowInC =*/0>]; + let Spellings = [Clang<"sycl_special_class">]; let Subjects = SubjectList<[CXXRecord]>; let LangOpts = [SYCLIsDevice, SilentlyIgnoreSYCLIsHost]; let Documentation = [SYCLSpecialClassDocs]; - let Args = [IdentifierArgument<"ClassType">]; } // Marks functions which must not be vectorized via horizontal SIMT widening, diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index 9bf8e694f18a7..fb9b3e790d20b 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -408,16 +408,14 @@ The SYCL kernel in the previous code sample meets these expectations. def SYCLSpecialClassDocs : Documentation { let Category = DocCatStmt; let Content = [{ -The ``__attribute__((sycl_special_class[KIND]))`` attribute is used in SYCL +The ``__attribute__((sycl_special_class))`` attribute is used in SYCL headers to indicate that a class or a struct needs additional handling when it is passed from host to device. Please note that this is an attribute that is used for internal implementation and not intended to be used by external users. -KIND can be equal to ``accessor``, ``sampler`` , or ``stream`` for sycl classes -or equal to ``generic`` for some generic class/struct (generic marking -class/struc that require special handling). +It is used for ``accessor``, ``sampler`` , or ``stream`` classes. .. code-block:: c++ - class __attribute__((sycl_special_class(accessor))) accessor { + class __attribute__((sycl_special_class)) accessor { private: void __init() {} diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 227b2b782b580..a30a0783953ce 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -9086,18 +9086,6 @@ static void handleSYCLKernelAttr(Sema &S, Decl *D, const ParsedAttr &AL) { handleSimpleAttribute(S, D, AL); } -static void handleSYCLSpecialClassAttr(Sema &S, Decl *D, const ParsedAttr &AL) { - if (!AL.isArgIdent(0)) { - S.Diag(AL.getLoc(), diag::err_attribute_argument_type) - << AL << AANT_ArgumentIdentifier; - return; - } - - IdentifierInfo *ClassKind = AL.getArgAsIdent(0)->Ident; - - D->addAttr(::new (S.Context) SYCLSpecialClassAttr(S.Context, AL, ClassKind)); -} - static void handleDestroyAttr(Sema &S, Decl *D, const ParsedAttr &A) { if (!cast(D)->hasGlobalStorage()) { S.Diag(D->getLocation(), diag::err_destroy_attr_on_non_static_var) @@ -9530,7 +9518,7 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, handleSimpleAttribute(S, D, AL); break; case ParsedAttr::AT_SYCLSpecialClass: - handleSYCLSpecialClassAttr(S, D, AL); + handleSimpleAttribute(S, D, AL); break; case ParsedAttr::AT_SYCLDevice: handleSYCLDeviceAttr(S, D, AL); diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index e6fe50e7d4afa..f8be97d8b6e87 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -89,18 +89,12 @@ class Util { return DeclContextDesc{K, SR}; } + static bool isSyclSpecialType(QualType Ty); + /// Checks whether given clang type is a full specialization of the SYCL /// accessor class. static bool isSyclAccessorType(QualType Ty); - /// Checks whether given clang type is a full specialization of the SYCL - /// sampler class. - static bool isSyclSamplerType(QualType Ty); - - /// Checks whether given clang type is a full specialization of the SYCL - /// stream class. - static bool isSyclStreamType(QualType Ty); - /// Checks whether given clang type is a full specialization of the SYCL /// half class. static bool isSyclHalfType(QualType Ty); @@ -1202,13 +1196,9 @@ class KernelObjVisitor { for (const auto &Base : Range) { QualType BaseTy = Base.getType(); // Handle accessor class as base - if (Util::isSyclAccessorType(BaseTy)) { - (void)std::initializer_list{ - (Handlers.handleSyclAccessorType(Owner, Base, BaseTy), 0)...}; - } else if (Util::isSyclStreamType(BaseTy)) { - // Handle stream class as base + if (Util::isSyclSpecialType(BaseTy)) { (void)std::initializer_list{ - (Handlers.handleSyclStreamType(Owner, Base, BaseTy), 0)...}; + (Handlers.handleSyclSpecialType(Owner, Base, BaseTy), 0)...}; } else // For all other bases, visit the record visitRecord(Owner, Base, BaseTy->getAsCXXRecordDecl(), BaseTy, @@ -1289,16 +1279,12 @@ class KernelObjVisitor { template void visitField(const CXXRecordDecl *Owner, FieldDecl *Field, QualType FieldTy, HandlerTys &... Handlers) { - if (Util::isSyclAccessorType(FieldTy)) - KF_FOR_EACH(handleSyclAccessorType, Field, FieldTy); - else if (Util::isSyclSamplerType(FieldTy)) - KF_FOR_EACH(handleSyclSamplerType, Field, FieldTy); + if (Util::isSyclSpecialType(FieldTy)) + KF_FOR_EACH(handleSyclSpecialType, Field, FieldTy); else if (Util::isSyclHalfType(FieldTy)) KF_FOR_EACH(handleSyclHalfType, Field, FieldTy); else if (Util::isSyclSpecConstantType(FieldTy)) KF_FOR_EACH(handleSyclSpecConstantType, Field, FieldTy); - else if (Util::isSyclStreamType(FieldTy)) - KF_FOR_EACH(handleSyclStreamType, Field, FieldTy); else if (FieldTy->isStructureOrClassType()) { if (KF_FOR_EACH(handleStructType, Field, FieldTy)) { CXXRecordDecl *RD = FieldTy->getAsCXXRecordDecl(); @@ -1354,24 +1340,16 @@ class SyclKernelFieldHandlerBase { // despite virtual dispatch never being used. // Accessor can be a base class or a field decl, so both must be handled. - virtual bool handleSyclAccessorType(const CXXRecordDecl *, - const CXXBaseSpecifier &, QualType) { - return true; - } - virtual bool handleSyclAccessorType(FieldDecl *, QualType) { return true; } - virtual bool handleSyclSamplerType(const CXXRecordDecl *, + virtual bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &, QualType) { return true; } - virtual bool handleSyclSamplerType(FieldDecl *, QualType) { return true; } + virtual bool handleSyclSpecialType(FieldDecl *, QualType) { return true; } + virtual bool handleSyclSpecConstantType(FieldDecl *, QualType) { return true; } - virtual bool handleSyclStreamType(const CXXRecordDecl *, - const CXXBaseSpecifier &, QualType) { - return true; - } - virtual bool handleSyclStreamType(FieldDecl *, QualType) { return true; } + virtual bool handleSyclHalfType(const CXXRecordDecl *, const CXXBaseSpecifier &, QualType) { return true; @@ -1650,9 +1628,6 @@ class SyclKernelFieldChecker : public SyclKernelFieldHandler { } void checkAccessorType(QualType Ty, SourceRange Loc) { - assert(Util::isSyclAccessorType(Ty) && - "Should only be called on SYCL accessor types."); - const RecordDecl *RecD = Ty->getAsRecordDecl(); if (const ClassTemplateSpecializationDecl *CTSD = dyn_cast(RecD)) { @@ -1684,13 +1659,13 @@ class SyclKernelFieldChecker : public SyclKernelFieldHandler { return isValid(); } - bool handleSyclAccessorType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, - QualType FieldTy) final { + bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, + QualType FieldTy) final { checkAccessorType(FieldTy, BS.getBeginLoc()); return isValid(); } - bool handleSyclAccessorType(FieldDecl *FD, QualType FieldTy) final { + bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { checkAccessorType(FieldTy, FD->getLocation()); return isValid(); } @@ -1751,32 +1726,14 @@ class SyclKernelUnionChecker : public SyclKernelFieldHandler { return true; } - bool handleSyclAccessorType(FieldDecl *FD, QualType FieldTy) final { + bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { return checkType(FD->getLocation(), FieldTy); } - bool handleSyclAccessorType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, - QualType FieldTy) final { - return checkType(BS.getBeginLoc(), FieldTy); - } - - bool handleSyclSamplerType(FieldDecl *FD, QualType FieldTy) final { - return checkType(FD->getLocation(), FieldTy); - } - - bool handleSyclSamplerType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, + bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, QualType FieldTy) final { return checkType(BS.getBeginLoc(), FieldTy); } - - bool handleSyclStreamType(FieldDecl *FD, QualType FieldTy) final { - return checkType(FD->getLocation(), FieldTy); - } - - bool handleSyclStreamType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, - QualType FieldTy) final { - return checkType(BS.getBeginLoc(), FieldTy); - } }; // A type to mark whether a collection requires decomposition. @@ -1793,38 +1750,21 @@ class SyclKernelDecompMarker : public SyclKernelFieldHandler { CollectionStack.push_back(true); } - bool handleSyclAccessorType(const CXXRecordDecl *, const CXXBaseSpecifier &, - QualType) final { - CollectionStack.back() = true; - return true; - } - bool handleSyclAccessorType(FieldDecl *, QualType) final { - CollectionStack.back() = true; - return true; - } - - bool handleSyclSamplerType(const CXXRecordDecl *, const CXXBaseSpecifier &, + bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &, QualType) final { CollectionStack.back() = true; return true; } - bool handleSyclSamplerType(FieldDecl *, QualType) final { + bool handleSyclSpecialType(FieldDecl *, QualType) final { CollectionStack.back() = true; return true; } + bool handleSyclSpecConstantType(FieldDecl *, QualType) final { CollectionStack.back() = true; return true; } - bool handleSyclStreamType(const CXXRecordDecl *, const CXXBaseSpecifier &, - QualType) final { - CollectionStack.back() = true; - return true; - } - bool handleSyclStreamType(FieldDecl *, QualType) final { - CollectionStack.back() = true; - return true; - } + bool handleSyclHalfType(const CXXRecordDecl *, const CXXBaseSpecifier &, QualType) final { CollectionStack.back() = true; @@ -1996,12 +1936,12 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { // kernel parameters from __init method parameters. We will use __init method // and kernel parameters which we build here to initialize special objects in // the kernel body. - bool handleSpecialType(FieldDecl *FD, QualType FieldTy, - bool isAccessorType = false) { + bool handleSpecialType(FieldDecl *FD, QualType FieldTy) { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The accessor/sampler must be a RecordDecl"); llvm::StringLiteral MethodName = - KernelDecl->hasAttr() && isAccessorType + KernelDecl->hasAttr() && + RecordDecl->hasAttr() ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, MethodName); @@ -2013,7 +1953,8 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { for (const ParmVarDecl *Param : InitMethod->parameters()) { QualType ParamTy = Param->getType(); addParam(FD, ParamTy.getCanonicalType()); - if (ParamTy.getTypePtr()->isPointerType() && isAccessorType) { + if (ParamTy.getTypePtr()->isPointerType() && + !getMethodByName(RecordDecl, FinalizeMethodName)) { handleAccessorPropertyList(Params.back(), RecordDecl, FD->getLocation()); if (KernelDecl->hasAttr()) @@ -2109,8 +2050,8 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { return true; } - bool handleSyclAccessorType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, - QualType FieldTy) final { + bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, + QualType FieldTy) final { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The accessor/sampler must be a RecordDecl"); llvm::StringLiteral MethodName = KernelDecl->hasAttr() @@ -2132,11 +2073,7 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { return true; } - bool handleSyclAccessorType(FieldDecl *FD, QualType FieldTy) final { - return handleSpecialType(FD, FieldTy, /*isAccessorType*/ true); - } - - bool handleSyclSamplerType(FieldDecl *FD, QualType FieldTy) final { + bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { return handleSpecialType(FD, FieldTy); } @@ -2221,17 +2158,6 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { return true; } - bool handleSyclStreamType(FieldDecl *FD, QualType FieldTy) final { - return handleSpecialType(FD, FieldTy); - } - - bool handleSyclStreamType(const CXXRecordDecl *, const CXXBaseSpecifier &, - QualType FieldTy) final { - // FIXME SYCL stream should be usable as a base type - // See https://github.com/intel/llvm/issues/1552 - return true; - } - // Generate kernel argument to intialize specialization constants. This // argument is only generated when the target has no native support for // specialization constants @@ -2254,7 +2180,6 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { std::end(Params)); } using SyclKernelFieldHandler::handleSyclHalfType; - using SyclKernelFieldHandler::handleSyclSamplerType; }; class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { @@ -2290,20 +2215,11 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { << SizeOfParams << MaxKernelArgsSize; } - bool handleSyclAccessorType(FieldDecl *FD, QualType FieldTy) final { + bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { return handleSpecialType(FieldTy); } - bool handleSyclAccessorType(const CXXRecordDecl *, const CXXBaseSpecifier &, - QualType FieldTy) final { - return handleSpecialType(FieldTy); - } - - bool handleSyclSamplerType(FieldDecl *FD, QualType FieldTy) final { - return handleSpecialType(FieldTy); - } - - bool handleSyclSamplerType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, + bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &, QualType FieldTy) final { return handleSpecialType(FieldTy); } @@ -2343,16 +2259,6 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { addParam(FieldTy); return true; } - - bool handleSyclStreamType(FieldDecl *FD, QualType FieldTy) final { - addParam(FieldTy); - return true; - } - bool handleSyclStreamType(const CXXRecordDecl *, const CXXBaseSpecifier &, - QualType FieldTy) final { - addParam(FieldTy); - return true; - } using SyclKernelFieldHandler::handleSyclHalfType; }; @@ -2469,13 +2375,20 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { SyclOptReportCreator(Sema &S, SyclKernelDeclCreator &DC, SourceLocation Loc) : SyclKernelFieldHandler(S), DC(DC), KernelInvocationLoc(Loc) {} - bool handleSyclAccessorType(FieldDecl *FD, QualType FieldTy) final { + bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { + const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); + if (getMethodByName(RecordDecl, FinalizeMethodName)) + return handleSpecialType( + FD, FieldTy, KernelArgDescription(KernelArgDescription::Stream)); + if (dyn_cast(FieldTy->getAsRecordDecl())) + return handleSpecialType( + FD, FieldTy, KernelArgDescription(KernelArgDescription::Accessor)); return handleSpecialType( - FD, FieldTy, KernelArgDescription(KernelArgDescription::Accessor)); + FD, FieldTy, KernelArgDescription(KernelArgDescription::Sampler)); } - bool handleSyclAccessorType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, - QualType FieldTy) final { + bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, + QualType FieldTy) final { for (const auto *Param : DC.getParamVarDeclsForCurrentField()) { QualType KernelArgType = Param->getType(); unsigned KernelArgSize = SemaRef.getASTContext() @@ -2491,11 +2404,6 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { return true; } - bool handleSyclSamplerType(FieldDecl *FD, QualType FieldTy) final { - return handleSpecialType( - FD, FieldTy, KernelArgDescription(KernelArgDescription::Sampler)); - } - bool handlePointerType(FieldDecl *FD, QualType FieldTy) final { KernelArgDescription Desc = KernelArgDescription::None; ParmVarDecl *KernelParameter = DC.getParamVarDeclsForCurrentField()[0]; @@ -2540,11 +2448,6 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { return true; } - bool handleSyclStreamType(FieldDecl *FD, QualType FieldTy) final { - return handleSpecialType( - FD, FieldTy, KernelArgDescription(KernelArgDescription::Stream)); - } - void handleSyclKernelHandlerType() { ASTContext &Context = SemaRef.getASTContext(); if (isDefaultSPIRArch(Context)) @@ -2553,8 +2456,6 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { KernelArgDescription(KernelArgDescription::KernelHandler)); } using SyclKernelFieldHandler::handleSyclHalfType; - using SyclKernelFieldHandler::handleSyclSamplerType; - using SyclKernelFieldHandler::handleSyclStreamType; }; static CXXMethodDecl *getOperatorParens(const CXXRecordDecl *Rec) { @@ -2921,7 +2822,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { CXXMethodDecl *FinalizeMethod = getMethodByName(RecordDecl, FinalizeMethodName); // A finalize-method is expected for stream class. - if (!FinalizeMethod && Util::isSyclStreamType(Ty)) + if (!FinalizeMethod && getMethodByName(RecordDecl, "__finalize")) SemaRef.Diag(FD->getLocation(), diag::err_sycl_expected_finalize_method); else createSpecialMethodCall(RecordDecl, FinalizeMethodName, FinalizeStmts); @@ -3000,34 +2901,19 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { DeclCreator.setBody(KernelBody); } - bool handleSyclAccessorType(FieldDecl *FD, QualType Ty) final { + bool handleSyclSpecialType(FieldDecl *FD, QualType Ty) final { return handleSpecialType(FD, Ty); } - bool handleSyclAccessorType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, - QualType Ty) final { + bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, + QualType Ty) final { return handleSpecialType(BS, Ty); } - bool handleSyclSamplerType(FieldDecl *FD, QualType Ty) final { - return handleSpecialType(FD, Ty); - } - bool handleSyclSpecConstantType(FieldDecl *FD, QualType Ty) final { return handleSpecialType(FD, Ty); } - bool handleSyclStreamType(FieldDecl *FD, QualType Ty) final { - return handleSpecialType(FD, Ty); - } - - bool handleSyclStreamType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, - QualType Ty) final { - // FIXME SYCL stream should be usable as a base type - // See https://github.com/intel/llvm/issues/1552 - return true; - } - bool handleSyclHalfType(FieldDecl *FD, QualType Ty) final { addSimpleFieldInit(FD, Ty); return true; @@ -3196,7 +3082,6 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { } using SyclKernelFieldHandler::handleSyclHalfType; - using SyclKernelFieldHandler::handleSyclSamplerType; }; // Kernels are only the unnamed-lambda feature if the feature is enabled, AND @@ -3316,9 +3201,9 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { setThisItemIsCalled(KernelFunc); } - bool handleSyclAccessorType(const CXXRecordDecl *RD, - const CXXBaseSpecifier &BC, - QualType FieldTy) final { + bool handleSyclSpecialType(const CXXRecordDecl *RD, + const CXXBaseSpecifier &BC, + QualType FieldTy) final { const auto *AccTy = cast(FieldTy->getAsRecordDecl()); assert(AccTy->getTemplateArgs().size() >= 2 && @@ -3332,37 +3217,30 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { return true; } - bool handleSyclAccessorType(FieldDecl *FD, QualType FieldTy) final { - const auto *AccTy = - cast(FieldTy->getAsRecordDecl()); - assert(AccTy->getTemplateArgs().size() >= 2 && - "Incorrect template args for Accessor Type"); - int Dims = static_cast( - AccTy->getTemplateArgs()[1].getAsIntegral().getExtValue()); - int Info = getAccessTarget(AccTy) | (Dims << 11); - - Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, - CurOffset + offsetOf(FD, FieldTy)); - return true; - } - - bool handleSyclSamplerType(FieldDecl *FD, QualType FieldTy) final { - const auto *SamplerTy = FieldTy->getAsCXXRecordDecl(); - assert(SamplerTy && "Sampler type must be a C++ record type"); - CXXMethodDecl *InitMethod = getMethodByName(SamplerTy, InitMethodName); - assert(InitMethod && "sampler must have __init method"); - - // sampler __init method has only one argument - const ParmVarDecl *SamplerArg = InitMethod->getParamDecl(0); - assert(SamplerArg && "sampler __init method must have sampler parameter"); + bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { + const auto *ClassTy = FieldTy->getAsCXXRecordDecl(); + assert(ClassTy && "Sampler type must be a C++ record type"); + if (const auto *AccTy = dyn_cast( + FieldTy->getAsRecordDecl())) { + assert(AccTy->getTemplateArgs().size() >= 2 && + "Incorrect template args for Accessor Type"); + int Dims = static_cast( + AccTy->getTemplateArgs()[1].getAsIntegral().getExtValue()); + int Info = getAccessTarget(AccTy) | (Dims << 11); - // For samplers, we do some special work to ONLY initialize the first item - // to the InitMethod as a performance improvement presumably, so the normal - // offsetOf calculation wouldn't work correctly. Therefore, we need to call - // a version of addParam where we calculate the offset based on the true - // FieldDecl/FieldType pair, rather than the SampleArg type. - addParam(SamplerArg->getType(), SYCLIntegrationHeader::kind_sampler, - offsetOf(FD, FieldTy)); + Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, + CurOffset + offsetOf(FD, FieldTy)); + } else { + if (getMethodByName(ClassTy, FinalizeMethodName)) + addParam(FD, FieldTy, SYCLIntegrationHeader::kind_stream); + else { + CXXMethodDecl *InitMethod = getMethodByName(ClassTy, InitMethodName); + assert(InitMethod && "sampler must have __init method"); + const ParmVarDecl *SamplerArg = InitMethod->getParamDecl(0); + addParam(SamplerArg->getType(), SYCLIntegrationHeader::kind_sampler, + offsetOf(FD, FieldTy)); + } + } return true; } @@ -3417,18 +3295,6 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { return handleScalarType(FD, FieldTy); } - bool handleSyclStreamType(FieldDecl *FD, QualType FieldTy) final { - addParam(FD, FieldTy, SYCLIntegrationHeader::kind_stream); - return true; - } - - bool handleSyclStreamType(const CXXRecordDecl *, const CXXBaseSpecifier &BC, - QualType FieldTy) final { - // FIXME SYCL stream should be usable as a base type - // See https://github.com/intel/llvm/issues/1552 - return true; - } - bool handleSyclHalfType(FieldDecl *FD, QualType FieldTy) final { addParam(FD, FieldTy, SYCLIntegrationHeader::kind_std_layout); return true; @@ -3493,7 +3359,6 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { using SyclKernelFieldHandler::enterStruct; using SyclKernelFieldHandler::handleSyclHalfType; - using SyclKernelFieldHandler::handleSyclSamplerType; using SyclKernelFieldHandler::leaveStruct; }; @@ -5041,34 +4906,11 @@ bool SYCLIntegrationFooter::emit(raw_ostream &OS) { // ----------------------------------------------------------------------------- // Utility class methods // ----------------------------------------------------------------------------- -bool Util::isSyclAccessorType(const QualType Ty) { +bool Util::isSyclSpecialType(const QualType Ty) { const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); if (!RecTy) - return false; // only classes/structs supported - if (const auto *A = RecTy->getAttr()) - return (A->getClassType()->getName() == "accessor" && - getMethodByName(RecTy, "__init")); - return false; -} - -bool Util::isSyclSamplerType(const QualType Ty) { - const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); - if (!RecTy) - return false; // only classes/structs supported - if (const auto *A = RecTy->getAttr()) - return (A->getClassType()->getName() == "sampler" && - getMethodByName(RecTy, "__init")); - return false; -} - -bool Util::isSyclStreamType(const QualType Ty) { - const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); - if (!RecTy) - return false; // only classes/structs supported - if (const auto *A = RecTy->getAttr()) - return (A->getClassType()->getName() == "stream" && - getMethodByName(RecTy, "__finalize")); - return false; + return false; + return getMethodByName(RecTy, "__init"); } bool Util::isSyclHalfType(QualType Ty) { diff --git a/clang/test/CodeGenSYCL/Inputs/sycl.hpp b/clang/test/CodeGenSYCL/Inputs/sycl.hpp index a54e1b34ac643..7ddf41d2fccaa 100644 --- a/clang/test/CodeGenSYCL/Inputs/sycl.hpp +++ b/clang/test/CodeGenSYCL/Inputs/sycl.hpp @@ -11,7 +11,7 @@ struct sampler_impl { #endif }; -class __attribute__((sycl_special_class(sampler))) sampler { +class __attribute__((sycl_special_class)) sampler { struct sampler_impl impl; #ifdef __SYCL_DEVICE_ONLY__ void __init(__ocl_sampler_t Sampler) { impl.m_Sampler = Sampler; } @@ -167,7 +167,7 @@ template > -class __attribute__((sycl_special_class(accessor))) accessor { +class __attribute__((sycl_special_class)) accessor { public: void use(void) const {} @@ -233,7 +233,7 @@ struct _ImageImplT { }; template -class __attribute__((sycl_special_class(accessor))) accessor { +class __attribute__((sycl_special_class)) accessor { public: void use(void) const {} template @@ -413,7 +413,7 @@ class handler { } }; -class __attribute__((sycl_special_class(stream))) stream { +class __attribute__((sycl_special_class)) stream { public: stream(unsigned long BufferSize, unsigned long MaxStatementSize, handler &CGH) {} diff --git a/clang/test/SemaSYCL/Inputs/sycl.hpp b/clang/test/SemaSYCL/Inputs/sycl.hpp index abd3b781a4ddc..4df3e7eeaab24 100644 --- a/clang/test/SemaSYCL/Inputs/sycl.hpp +++ b/clang/test/SemaSYCL/Inputs/sycl.hpp @@ -81,21 +81,22 @@ struct _ImplT { id Offset; }; -template +using propertyListT = ONEAPI::accessor_property_list<>; +template struct DeviceValueType; -template -struct DeviceValueType { +template +struct DeviceValueType { using type = __attribute__((opencl_global)) dataT; }; -template -struct DeviceValueType { +template +struct DeviceValueType { using type = __attribute__((opencl_constant)) dataT; }; -template -struct DeviceValueType { +template +struct DeviceValueType { using type = __attribute__((opencl_local)) dataT; }; @@ -103,15 +104,14 @@ template > -class __attribute__((sycl_special_class(accessor))) accessor { - +class __attribute__((sycl_special_class)) accessor { public: void use(void) const {} void use(void *) const {} _ImplT impl; private: - using PtrType = typename DeviceValueType::type *; + using PtrType = typename DeviceValueType::type *; void __init(PtrType Ptr, range AccessRange, range MemRange, id Offset) {} friend class stream; @@ -163,7 +163,7 @@ struct _ImageImplT { }; template -class __attribute__((sycl_special_class(accessor))) accessor { +class __attribute__((sycl_special_class)) accessor { public: void use(void) const {} template @@ -182,7 +182,7 @@ struct sampler_impl { #endif }; -class __attribute__((sycl_special_class(sampler))) sampler { +class __attribute__((sycl_special_class)) sampler { struct sampler_impl impl; #ifdef __SYCL_DEVICE_ONLY__ void __init(__ocl_sampler_t Sampler) { impl.m_Sampler = Sampler; } @@ -286,7 +286,7 @@ class handler { } }; -class __attribute__((sycl_special_class(stream))) stream { +class __attribute__((sycl_special_class)) stream { accessor acc; public: diff --git a/clang/test/SemaSYCL/sampler.cpp b/clang/test/SemaSYCL/sampler.cpp index caaa7164502ed..34c287b2dd82f 100644 --- a/clang/test/SemaSYCL/sampler.cpp +++ b/clang/test/SemaSYCL/sampler.cpp @@ -20,12 +20,12 @@ int main() { } // CHECK: ClassTemplateDecl {{.*}} accessor -// CHECK: SYCLSpecialClassAttr {{.*}} accessor +// CHECK: SYCLSpecialClassAttr {{.*}} // CHECK: CXXRecordDecl {{.*}} implicit class accessor // CHECK: AccessSpecDecl {{.*}} public // CHECK: CXXMethodDecl {{.*}} use 'void () const' // CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr {{.*}} accessor +// CHECK: SYCLSpecialClassAttr {{.*}} // CHECK: CXXRecordDecl {{.*}} implicit class accessor // CHECK: AccessSpecDecl {{.*}} public // CHECK: CXXMethodDecl {{.*}} use 'void () const' diff --git a/clang/test/SemaSYCL/special-classes.cpp b/clang/test/SemaSYCL/special-classes.cpp index 7c003c47d9986..0d5458cddc22f 100644 --- a/clang/test/SemaSYCL/special-classes.cpp +++ b/clang/test/SemaSYCL/special-classes.cpp @@ -67,21 +67,21 @@ int main() { // CHECK: ClassTemplateDecl {{.*}} accessor // CHECK: CXXRecordDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr {{.*}} accessor +// CHECK: SYCLSpecialClassAttr {{.*}} // CHECK: CXXRecordDecl {{.*}} implicit class accessor // CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr{{.*}} accessor +// CHECK: SYCLSpecialClassAttr{{.*}} // CHECK: CXXRecordDecl {{.*}} prev {{.*}} implicit class accessor // CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr{{.*}} accessor +// CHECK: SYCLSpecialClassAttr{{.*}} // CHECK: CXXRecordDecl {{.*}} prev {{.*}} implicit class accessor // CHECK: CXXRecordDecl {{.*}} referenced class sampler definition -// CHECK: SYCLSpecialClassAttr {{.*}} sampler +// CHECK: SYCLSpecialClassAttr {{.*}} // CHECK: CXXRecordDecl {{.*}} implicit class sampler // CHECK: CXXRecordDecl {{.*}} prev {{.*}} referenced class stream definition -// CHECK: SYCLSpecialClassAttr {{.*}} stream +// CHECK: SYCLSpecialClassAttr {{.*}} // CHECK: CXXRecordDecl {{.*}} implicit referenced class stream diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 90cc78d1e5e4e..ff3aa2b79398d 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1787,7 +1787,7 @@ accessor(buffer, handler, Type1, Type2, Type3, /// \ingroup sycl_api_acc template -class __SYCL_SPECIAL_CLASS(accessor) accessor< +class __SYCL_SPECIAL_CLASS accessor< DataT, Dimensions, AccessMode, access::target::local, IsPlaceholder> : #ifndef __SYCL_DEVICE_ONLY__ public detail::LocalAccessorBaseHost, @@ -1982,7 +1982,7 @@ class __SYCL_SPECIAL_CLASS(accessor) accessor< /// \ingroup sycl_api_acc template -class __SYCL_SPECIAL_CLASS(accessor) accessor< +class __SYCL_SPECIAL_CLASS accessor< DataT, Dimensions, AccessMode, access::target::image, IsPlaceholder> : public detail::image_accessor { @@ -2072,7 +2072,7 @@ class accessor -class __SYCL_SPECIAL_CLASS(accessor) accessor< +class __SYCL_SPECIAL_CLASS accessor< DataT, Dimensions, AccessMode, access::target::image_array, IsPlaceholder> : public detail::image_accessor { diff --git a/sycl/include/CL/sycl/detail/defines.hpp b/sycl/include/CL/sycl/detail/defines.hpp index 506191e71e3cb..ae5d9f2c7f3e9 100644 --- a/sycl/include/CL/sycl/detail/defines.hpp +++ b/sycl/include/CL/sycl/detail/defines.hpp @@ -22,7 +22,7 @@ #endif #if __has_attribute(sycl_special_class) -#define __SYCL_SPECIAL_CLASS(kind) __attribute__((sycl_special_class(kind))) +#define __SYCL_SPECIAL_CLASS __attribute__((sycl_special_class)) #else -#define __SYCL_SPECIAL_CLASS(kind) +#define __SYCL_SPECIAL_CLASS #endif From 59e5f0b97d1af5436cd13aef64241ae421197cea Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 27 Jul 2021 07:59:25 -0700 Subject: [PATCH 18/82] fix conflicts Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 11 +++++++++++ clang/test/CodeGenSYCL/special-classes.cpp | 2 +- clang/test/SemaSYCL/Inputs/sycl.hpp | 2 +- clang/test/SemaSYCL/spec-const-kernel-arg.cpp | 1 - 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index e2efa240636d2..6aa1ea16e529e 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1981,6 +1981,17 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { // In ESIMD kernels accessor's pointer argument needs to be marked Params.back()->addAttr( SYCLSimdAccessorPtrAttr::CreateImplicit(SemaRef.getASTContext())); + // Get access mode of accessor. + const auto *AccessorSpecializationDecl = + cast(RecordDecl); + const TemplateArgument &AccessModeArg = + AccessorSpecializationDecl->getTemplateArgs().get(2); + + // Add implicit attribute to parameter decl when it is a read only + // SYCL accessor. + if (isReadOnlyAccessor(AccessModeArg)) + Params.back()->addAttr(SYCLAccessorReadonlyAttr::CreateImplicit( + SemaRef.getASTContext())); } } LastParamIndex = ParamIndex; diff --git a/clang/test/CodeGenSYCL/special-classes.cpp b/clang/test/CodeGenSYCL/special-classes.cpp index 0f22940ac0e4e..7b00662b0e39e 100644 --- a/clang/test/CodeGenSYCL/special-classes.cpp +++ b/clang/test/CodeGenSYCL/special-classes.cpp @@ -72,7 +72,7 @@ int main() { // CHECK-SAME: %[[ID_TYPE]]* byval(%[[ID_TYPE]]) align 4 [[ACC3_DATA:%[a-zA-Z0-9_]+]]) // CHECK: [[ACC_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class.{{.*}}.AccessorBase, %class.{{.*}}.AccessorBase addrspace(4)* %3, i32 0, i32 1 -// CHECK: call spir_func void @_ZN2cl4sycl8accessorIiLi1ELNS0_6access4modeE1026ELNS2_6targetE2016ELNS2_11placeholderE0ENS0_6ONEAPI22accessor_property_listIJEEEEC1Ev(%"class.{{.*}}.cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[ACC_FIELD]]) +// CHECK: call spir_func void @_ZN2cl4sycl8accessorIiLi1ELNS0_6access4modeE1026ELNS2_6targetE2016ELNS2_11placeholderE0ENS0_3ext6oneapi22accessor_property_listIJEEEEC1Ev(%"class.{{.*}}.cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[ACC_FIELD]]) // CHECK: [[ACC1_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.AccessorBase, %class{{.*}}.AccessorBase addrspace(4)* %5, i32 0, i32 1 // CHECK: [[ACC1_DATA_LOAD:%[a-zA-Z0-9_]+]] = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* %_arg_acc.addr.ascast, align 8 diff --git a/clang/test/SemaSYCL/Inputs/sycl.hpp b/clang/test/SemaSYCL/Inputs/sycl.hpp index 8bbb8bac5a622..e423b6d09ece7 100644 --- a/clang/test/SemaSYCL/Inputs/sycl.hpp +++ b/clang/test/SemaSYCL/Inputs/sycl.hpp @@ -85,7 +85,7 @@ struct _ImplT { id Offset; }; -using propertyListT = ONEAPI::accessor_property_list<>; +using propertyListT = ext::oneapi::accessor_property_list<>; template struct DeviceValueType; diff --git a/clang/test/SemaSYCL/spec-const-kernel-arg.cpp b/clang/test/SemaSYCL/spec-const-kernel-arg.cpp index 0b355b6aaed65..a9ea7ba702ec3 100644 --- a/clang/test/SemaSYCL/spec-const-kernel-arg.cpp +++ b/clang/test/SemaSYCL/spec-const-kernel-arg.cpp @@ -31,4 +31,3 @@ int main() { // CHECK-NEXT: InitListExpr {{.*}} 'SpecConstantsWrapper' // CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::ext::oneapi::experimental::spec_constant':'sycl::ext::oneapi::experimental::spec_constant' // CHECK-NEXT: CXXConstructExpr {{.*}} 'sycl::ext::oneapi::experimental::spec_constant':'sycl::ext::oneapi::experimental::spec_constant' ->>>>>>> remote/sycl From eb7997d2e6d116e9fa4f2d93af18421130f60b28 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 27 Jul 2021 08:17:50 -0700 Subject: [PATCH 19/82] Fix format Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 3466bca486f33..131b33ea96531 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1788,8 +1788,8 @@ accessor(buffer, handler, Type1, Type2, Type3, /// \ingroup sycl_api_acc template -class __SYCL_SPECIAL_CLASS accessor< - DataT, Dimensions, AccessMode, access::target::local, IsPlaceholder> : +class __SYCL_SPECIAL_CLASS accessor : #ifndef __SYCL_DEVICE_ONLY__ public detail::LocalAccessorBaseHost, #endif @@ -1983,8 +1983,8 @@ class __SYCL_SPECIAL_CLASS accessor< /// \ingroup sycl_api_acc template -class __SYCL_SPECIAL_CLASS accessor< - DataT, Dimensions, AccessMode, access::target::image, IsPlaceholder> +class __SYCL_SPECIAL_CLASS accessor : public detail::image_accessor { public: @@ -2073,8 +2073,8 @@ class accessor -class __SYCL_SPECIAL_CLASS accessor< - DataT, Dimensions, AccessMode, access::target::image_array, IsPlaceholder> +class __SYCL_SPECIAL_CLASS accessor : public detail::image_accessor { #ifdef __SYCL_DEVICE_ONLY__ From c34f5f20677550ba178cc18f275ef96fa9e6843c Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 28 Jul 2021 07:11:23 -0700 Subject: [PATCH 20/82] Remove argument attribute from macro SYCL_SPECIAL_CLASS Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/sampler.hpp | 2 +- sycl/include/CL/sycl/stream.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sycl/include/CL/sycl/sampler.hpp b/sycl/include/CL/sycl/sampler.hpp index 9acccb05ba472..f3298712f29ed 100644 --- a/sycl/include/CL/sycl/sampler.hpp +++ b/sycl/include/CL/sycl/sampler.hpp @@ -62,7 +62,7 @@ class sampler_impl; /// \sa sycl_api_acc /// /// \ingroup sycl_api -class __SYCL_SPECIAL_CLASS(sampler) sampler { +class __SYCL_SPECIAL_CLASS sampler { public: sampler(coordinate_normalization_mode normalizationMode, addressing_mode addressingMode, filtering_mode filteringMode, diff --git a/sycl/include/CL/sycl/stream.hpp b/sycl/include/CL/sycl/stream.hpp index 2690fc18a9c6f..2832f78366230 100644 --- a/sycl/include/CL/sycl/stream.hpp +++ b/sycl/include/CL/sycl/stream.hpp @@ -739,7 +739,7 @@ inline __width_manipulator__ setw(int Width) { /// vector and SYCL types to the console. /// /// \ingroup sycl_api -class __SYCL_SPECIAL_CLASS(stream) stream { +class __SYCL_SPECIAL_CLASS stream { public: #ifdef __SYCL_DEVICE_ONLY__ // Default constructor for objects later initialized with __init member. From 5b95a01fc35f59e277a75fbea49019c3b1c889ca Mon Sep 17 00:00:00 2001 From: Alexey Bader Date: Sun, 1 Aug 2021 19:00:35 +0300 Subject: [PATCH 21/82] Apply suggestions from code review to fix pre-commit tests. --- sycl/include/CL/sycl/sampler.hpp | 2 +- sycl/include/CL/sycl/stream.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sycl/include/CL/sycl/sampler.hpp b/sycl/include/CL/sycl/sampler.hpp index f3298712f29ed..e3b995b8b88af 100644 --- a/sycl/include/CL/sycl/sampler.hpp +++ b/sycl/include/CL/sycl/sampler.hpp @@ -62,7 +62,7 @@ class sampler_impl; /// \sa sycl_api_acc /// /// \ingroup sycl_api -class __SYCL_SPECIAL_CLASS sampler { +class __SYCL_EXPORT __SYCL_SPECIAL_CLASS sampler { public: sampler(coordinate_normalization_mode normalizationMode, addressing_mode addressingMode, filtering_mode filteringMode, diff --git a/sycl/include/CL/sycl/stream.hpp b/sycl/include/CL/sycl/stream.hpp index 2832f78366230..9d128d5d56789 100644 --- a/sycl/include/CL/sycl/stream.hpp +++ b/sycl/include/CL/sycl/stream.hpp @@ -739,7 +739,7 @@ inline __width_manipulator__ setw(int Width) { /// vector and SYCL types to the console. /// /// \ingroup sycl_api -class __SYCL_SPECIAL_CLASS stream { +class __SYCL_EXPORT __SYCL_SPECIAL_CLASS stream { public: #ifdef __SYCL_DEVICE_ONLY__ // Default constructor for objects later initialized with __init member. From 8922d487a8f737e926f95e35ef3f3d5e3762e0d8 Mon Sep 17 00:00:00 2001 From: Nicolas Miller Date: Wed, 28 Jul 2021 19:28:31 +0100 Subject: [PATCH 22/82] [SYCL][ROCm] Fix building libclc for AMD (#4199) This file uses `cl_mem_fence_flags`, `CLK_GLOBAL_MEM_FENCE`, `CLK_LOCAL_MEM_FENCE`, which are defined by `clc.h`. It wasn't included because when this file was written the OpenCL headers were implicitely included, this has changed so now including the header is necessary. See the discussion on #4133 for more details. --- libclc/amdgcn-amdhsa/libspirv/synchronization/barrier.cl | 1 + 1 file changed, 1 insertion(+) diff --git a/libclc/amdgcn-amdhsa/libspirv/synchronization/barrier.cl b/libclc/amdgcn-amdhsa/libspirv/synchronization/barrier.cl index 7dd218d2f1e53..5989cc75be0fd 100644 --- a/libclc/amdgcn-amdhsa/libspirv/synchronization/barrier.cl +++ b/libclc/amdgcn-amdhsa/libspirv/synchronization/barrier.cl @@ -6,6 +6,7 @@ // //===----------------------------------------------------------------------===// +#include #include void __clc_amdgcn_s_waitcnt(unsigned flags); From d439bfe3bc1d7ff7912904565524979751c4398b Mon Sep 17 00:00:00 2001 From: Viktoria Maximova Date: Wed, 28 Jul 2021 21:29:17 +0300 Subject: [PATCH 23/82] [SYCL] Fix some Doxygen build warnings (#4170) This is done as a part of https://github.com/intel/llvm/issues/4140 * Changed several parameter types to parameter argument names (under \param tag) * Renamed parameter names as they were changes in code, but not in documentation comment --- sycl/include/CL/sycl/context.hpp | 1 + sycl/include/CL/sycl/detail/pi.h | 16 ++++++++-------- sycl/plugins/cuda/pi_cuda.cpp | 2 +- sycl/source/detail/program_impl.hpp | 3 +++ sycl/source/detail/scheduler/scheduler.hpp | 9 ++++----- sycl/source/detail/usm/usm_impl.cpp | 8 ++++---- 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/sycl/include/CL/sycl/context.hpp b/sycl/include/CL/sycl/context.hpp index 36d8a4d10ea7d..93013e49d6bf8 100644 --- a/sycl/include/CL/sycl/context.hpp +++ b/sycl/include/CL/sycl/context.hpp @@ -106,6 +106,7 @@ class __SYCL_EXPORT context { /// PropList. /// /// \param Platform is an instance of SYCL platform. + /// \param AsyncHandler is an instance of async_handler. /// \param PropList is an instance of property_list. explicit context(const platform &Platform, async_handler AsyncHandler, const property_list &PropList = {}); diff --git a/sycl/include/CL/sycl/detail/pi.h b/sycl/include/CL/sycl/detail/pi.h index eefb68e94a97b..8349823df54ba 100644 --- a/sycl/include/CL/sycl/detail/pi.h +++ b/sycl/include/CL/sycl/detail/pi.h @@ -1147,7 +1147,7 @@ __SYCL_EXPORT pi_result piclProgramCreateWithSource(pi_context context, /// succesfully or not, for each device in device_list. /// binary_status is ignored if it is null and otherwise /// it must be an array of num_devices elements. -/// \param program is the PI program created from the program binaries. +/// \param ret_program is the PI program created from the program binaries. __SYCL_EXPORT pi_result piProgramCreateWithBinary( pi_context context, pi_uint32 num_devices, const pi_device *device_list, const size_t *lengths, const unsigned char **binaries, @@ -1565,8 +1565,8 @@ using pi_usm_migration_flags = _pi_usm_migration_flags; /// /// \param result_ptr contains the allocated memory /// \param context is the pi_context -/// \param pi_usm_mem_properties are optional allocation properties -/// \param size_t is the size of the allocation +/// \param properties are optional allocation properties +/// \param size is the size of the allocation /// \param alignment is the desired alignment of the allocation __SYCL_EXPORT pi_result piextUSMHostAlloc(void **result_ptr, pi_context context, pi_usm_mem_properties *properties, @@ -1577,8 +1577,8 @@ __SYCL_EXPORT pi_result piextUSMHostAlloc(void **result_ptr, pi_context context, /// \param result_ptr contains the allocated memory /// \param context is the pi_context /// \param device is the device the memory will be allocated on -/// \param pi_usm_mem_properties are optional allocation properties -/// \param size_t is the size of the allocation +/// \param properties are optional allocation properties +/// \param size is the size of the allocation /// \param alignment is the desired alignment of the allocation __SYCL_EXPORT pi_result piextUSMDeviceAlloc(void **result_ptr, pi_context context, @@ -1591,8 +1591,8 @@ __SYCL_EXPORT pi_result piextUSMDeviceAlloc(void **result_ptr, /// \param result_ptr contains the allocated memory /// \param context is the pi_context /// \param device is the device the memory will be allocated on -/// \param pi_usm_mem_properties are optional allocation properties -/// \param size_t is the size of the allocation +/// \param properties are optional allocation properties +/// \param size is the size of the allocation /// \param alignment is the desired alignment of the allocation __SYCL_EXPORT pi_result piextUSMSharedAlloc(void **result_ptr, pi_context context, @@ -1682,7 +1682,7 @@ __SYCL_EXPORT pi_result piextUSMEnqueueMemAdvise(pi_queue queue, /// \param param_name is the type of query to perform /// \param param_value_size is the size of the result in bytes /// \param param_value is the result -/// \param param_value_ret is how many bytes were written +/// \param param_value_size_ret is how many bytes were written __SYCL_EXPORT pi_result piextUSMGetMemAllocInfo( pi_context context, const void *ptr, pi_mem_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); diff --git a/sycl/plugins/cuda/pi_cuda.cpp b/sycl/plugins/cuda/pi_cuda.cpp index 8797ae95b026f..6673c5a407fd1 100644 --- a/sycl/plugins/cuda/pi_cuda.cpp +++ b/sycl/plugins/cuda/pi_cuda.cpp @@ -4654,7 +4654,7 @@ pi_result cuda_piextUSMEnqueueMemAdvise(pi_queue queue, const void *ptr, /// \param param_name is the type of query to perform /// \param param_value_size is the size of the result in bytes /// \param param_value is the result -/// \param param_value_ret is how many bytes were written +/// \param param_value_size_ret is how many bytes were written pi_result cuda_piextUSMGetMemAllocInfo(pi_context context, const void *ptr, pi_mem_info param_name, size_t param_value_size, diff --git a/sycl/source/detail/program_impl.hpp b/sycl/source/detail/program_impl.hpp index 9f35fe4814caa..83e36eded6e14 100644 --- a/sycl/source/detail/program_impl.hpp +++ b/sycl/source/detail/program_impl.hpp @@ -45,6 +45,7 @@ class program_impl { /// with the context. /// /// \param Context is a pointer to SYCL context impl. + /// \param PropList is an instance of property_list. explicit program_impl(ContextImplPtr Context, const property_list &PropList); /// Constructs an instance of SYCL program for the provided DeviceList. @@ -55,6 +56,7 @@ class program_impl { /// /// \param Context is a pointer to SYCL context impl. /// \param DeviceList is a list of SYCL devices. + /// \param PropList is an instance of property_list. program_impl(ContextImplPtr Context, std::vector DeviceList, const property_list &PropList); @@ -72,6 +74,7 @@ class program_impl { /// /// \param ProgramList is a list of program_impl instances. /// \param LinkOptions is a string containing valid OpenCL link options. + /// \param PropList is an instance of property_list. program_impl(std::vector> ProgramList, std::string LinkOptions, const property_list &PropList); diff --git a/sycl/source/detail/scheduler/scheduler.hpp b/sycl/source/detail/scheduler/scheduler.hpp index 5193d61858849..30df58c089234 100644 --- a/sycl/source/detail/scheduler/scheduler.hpp +++ b/sycl/source/detail/scheduler/scheduler.hpp @@ -432,14 +432,14 @@ class Scheduler { /// Allocate buffers in the pool for a provided stream /// - /// \param Pointer to the stream object - /// \param Size of the stream buffer - /// \param Size of the flush buffer for a single work item + /// \param Impl to the stream object + /// \param StreamBufferSize of the stream buffer + /// \param FlushBufferSize of the flush buffer for a single work item void allocateStreamBuffers(stream_impl *, size_t, size_t); /// Deallocate all stream buffers in the pool /// - /// \param Pointer to the stream object + /// \param Impl to the stream object void deallocateStreamBuffers(stream_impl *); QueueImplPtr getDefaultHostQueue() { return DefaultHostQueue; } @@ -737,7 +737,6 @@ class Scheduler { /// Enqueues the command and all its dependencies. /// /// \param EnqueueResult is set to specific status if enqueue failed. - /// \param GraphReadLock read-lock which is already acquired for reading /// \return true if the command is successfully enqueued. /// /// The function may unlock and lock GraphReadLock as needed. Upon return diff --git a/sycl/source/detail/usm/usm_impl.cpp b/sycl/source/detail/usm/usm_impl.cpp index bb485c919a5cf..54d530c5ca3cd 100644 --- a/sycl/source/detail/usm/usm_impl.cpp +++ b/sycl/source/detail/usm/usm_impl.cpp @@ -325,8 +325,8 @@ void *aligned_alloc(size_t Alignment, size_t Size, const queue &Q, alloc Kind, /// Query the allocation type from a USM pointer /// Returns alloc::host for all pointers in a host context. /// -/// \param ptr is the USM pointer to query -/// \param ctxt is the sycl context the ptr was allocated in +/// \param Ptr is the USM pointer to query +/// \param Ctxt is the sycl context the ptr was allocated in alloc get_pointer_type(const void *Ptr, const context &Ctxt) { if (!Ptr) return alloc::unknown; @@ -375,8 +375,8 @@ alloc get_pointer_type(const void *Ptr, const context &Ctxt) { /// Queries the device against which the pointer was allocated /// -/// \param ptr is the USM pointer to query -/// \param ctxt is the sycl context the ptr was allocated in +/// \param Ptr is the USM pointer to query +/// \param Ctxt is the sycl context the ptr was allocated in device get_pointer_device(const void *Ptr, const context &Ctxt) { // Check if ptr is a valid USM pointer if (get_pointer_type(Ptr, Ctxt) == alloc::unknown) From c37c9bb636345b185fdbb861d47abe4864f0f2a0 Mon Sep 17 00:00:00 2001 From: Victor Lomuller Date: Thu, 29 Jul 2021 06:40:18 +0100 Subject: [PATCH 24/82] [SYCL] Add splitting module capabilities when compiling for NVPTX and AMDGCN (#4107) The patch allows modules splitting for NVPTX and AMDGCN targets. As those path needs to rely on existing tool, the approach taken here is to generate and intercept commands so they can be wrapped by a `llvm-foreach` tool call. To do that, the patch adds `ForEachWrappingAction` which allows to encapsulate a set of actions whose underlying commands will be wrapped under a llvm-foreach commands. During the binding phases, the action will trigger the emission of jobs outside the set, record the Jobs state then triggers the emission of the jobs inside the set. The newly added commands are stolen from the Jobs list and the commands are re-emitted with the llvm-foreach wrapping. To allow standard clang tools to work properly, SYCLPostLinkJobAction and FileTableTformJobAction reports the underlying file type rather than TY_Tempfilelist or TY_tempfiletable for those targets. Otherwise tools get confused as they don't know how to process the input. To not make this patch too large, I maintained the SPIR-V path behaviour as it is, meaning the list of actions are not set up in the same way nor does it uses the `ForEachWrappingAction`. Otherwise there is a long list of test to update. Signed-off-by: Victor Lomuller --- clang/include/clang/Driver/Action.h | 50 +++++- clang/include/clang/Driver/Job.h | 2 + clang/lib/Driver/Action.cpp | 34 +++- clang/lib/Driver/Driver.cpp | 206 ++++++++++++++-------- clang/lib/Driver/ToolChain.cpp | 1 + clang/lib/Driver/ToolChains/Clang.cpp | 11 +- clang/test/Driver/sycl-offload-amdgcn.cpp | 9 +- clang/test/Driver/sycl-offload-nvptx.cpp | 42 +++-- 8 files changed, 252 insertions(+), 103 deletions(-) diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h index 15921528c960a..189bc2208c9ff 100644 --- a/clang/include/clang/Driver/Action.h +++ b/clang/include/clang/Driver/Action.h @@ -57,6 +57,7 @@ class Action { InputClass = 0, BindArchClass, OffloadClass, + ForEachWrappingClass, PreprocessJobClass, PrecompileJobClass, HeaderModulePrecompileJobClass, @@ -737,7 +738,15 @@ class SYCLPostLinkJobAction : public JobAction { void anchor() override; public: - SYCLPostLinkJobAction(Action *Input, types::ID OutputType); + // The tempfiletable management relies on a shadowing the main file type by + // types::TY_Tempfiletable. The problem of shadowing is it prevents its + // integration with clang tools that relies on the file type to properly set + // args. + // We "trick" the driver by declaring the underlying file type and set a + // "true output type" which will be used by the SYCLPostLinkJobAction + // to properly set the job. + SYCLPostLinkJobAction(Action *Input, types::ID ShadowOutputType, + types::ID TrueOutputType); static bool classof(const Action *A) { return A->getKind() == SYCLPostLinkJobClass; @@ -747,8 +756,11 @@ class SYCLPostLinkJobAction : public JobAction { bool getRTSetsSpecConstants() const { return RTSetsSpecConsts; } + types::ID getTrueType() const { return TrueOutputType; } + private: bool RTSetsSpecConsts = true; + types::ID TrueOutputType; }; class BackendCompileJobAction : public JobAction { @@ -771,6 +783,9 @@ class FileTableTformJobAction : public JobAction { void anchor() override; public: + static constexpr const char *COL_CODE = "Code"; + static constexpr const char *COL_ZERO = "0"; + struct Tform { enum Kind { EXTRACT, @@ -791,8 +806,10 @@ class FileTableTformJobAction : public JobAction { SmallVector TheArgs; }; - FileTableTformJobAction(Action *Input, types::ID OutputType); - FileTableTformJobAction(ActionList &Inputs, types::ID OutputType); + FileTableTformJobAction(Action *Input, types::ID ShadowOutputType, + types::ID TrueOutputType); + FileTableTformJobAction(ActionList &Inputs, types::ID ShadowOutputType, + types::ID TrueOutputType); // Deletes all columns except the one with given name. void addExtractColumnTform(StringRef ColumnName, bool WithColTitle = true); @@ -820,7 +837,10 @@ class FileTableTformJobAction : public JobAction { const ArrayRef getTforms() const { return Tforms; } + types::ID getTrueType() const { return TrueOutputType; } + private: + types::ID TrueOutputType; SmallVector Tforms; // transformation actions requested // column to copy single file from if requested @@ -849,6 +869,30 @@ class StaticLibJobAction : public JobAction { } }; +/// Wrap all jobs performed between TFormInput (excluded) and Job (included) +/// behind a `llvm-foreach` call. +/// +/// Assumptions: +/// - No change of toolchain, boundarch and offloading kind should occur +/// within the sub-region; +/// - No job should produce multiple outputs; +/// - Results of action within the sub-region should not be used outside the +/// wrapped region. +/// Note: this doesn't bind to a tool directly and this need special casing +/// anyhow. Hence why this is an Action and not a JobAction, even if there is a +/// command behind. +class ForEachWrappingAction : public Action { +public: + ForEachWrappingAction(JobAction *TFormInput, JobAction *Job); + + JobAction *getTFormInput() const; + JobAction *getJobAction() const; + + static bool classof(const Action *A) { + return A->getKind() == ForEachWrappingClass; + } +}; + } // namespace driver } // namespace clang diff --git a/clang/include/clang/Driver/Job.h b/clang/include/clang/Driver/Job.h index 597e643ead5ca..dd523cea9c340 100644 --- a/clang/include/clang/Driver/Job.h +++ b/clang/include/clang/Driver/Job.h @@ -319,6 +319,8 @@ class JobList { /// Clear the job list. void clear(); + /// Return a mutable list of Jobs for llvm-foreach wrapping. + list_type &getJobsForOverride() { return Jobs; } const list_type &getJobs() const { return Jobs; } bool empty() const { return Jobs.empty(); } diff --git a/clang/lib/Driver/Action.cpp b/clang/lib/Driver/Action.cpp index 4ff09ca4e216b..3a1b5261d6810 100644 --- a/clang/lib/Driver/Action.cpp +++ b/clang/lib/Driver/Action.cpp @@ -59,6 +59,8 @@ const char *Action::getClassName(ActionClass AC) { return "append-footer"; case StaticLibJobClass: return "static-lib-linker"; + case ForEachWrappingClass: + return "foreach"; } llvm_unreachable("invalid class"); @@ -474,8 +476,11 @@ SPIRCheckJobAction::SPIRCheckJobAction(Action *Input, types::ID Type) void SYCLPostLinkJobAction::anchor() {} -SYCLPostLinkJobAction::SYCLPostLinkJobAction(Action *Input, types::ID Type) - : JobAction(SYCLPostLinkJobClass, Input, Type) {} +SYCLPostLinkJobAction::SYCLPostLinkJobAction(Action *Input, + types::ID ShadowOutputType, + types::ID TrueOutputType) + : JobAction(SYCLPostLinkJobClass, Input, ShadowOutputType), + TrueOutputType(TrueOutputType) {} void BackendCompileJobAction::anchor() {} @@ -489,12 +494,17 @@ BackendCompileJobAction::BackendCompileJobAction(Action *Input, void FileTableTformJobAction::anchor() {} -FileTableTformJobAction::FileTableTformJobAction(Action *Input, types::ID Type) - : JobAction(FileTableTformJobClass, Input, Type) {} +FileTableTformJobAction::FileTableTformJobAction(Action *Input, + types::ID ShadowOutputType, + types::ID TrueOutputType) + : JobAction(FileTableTformJobClass, Input, ShadowOutputType), + TrueOutputType(TrueOutputType) {} FileTableTformJobAction::FileTableTformJobAction(ActionList &Inputs, - types::ID Type) - : JobAction(FileTableTformJobClass, Inputs, Type) {} + types::ID ShadowOutputType, + types::ID TrueOutputType) + : JobAction(FileTableTformJobClass, Inputs, ShadowOutputType), + TrueOutputType(TrueOutputType) {} void FileTableTformJobAction::addExtractColumnTform(StringRef ColumnName, bool WithColTitle) { @@ -533,3 +543,15 @@ void StaticLibJobAction::anchor() {} StaticLibJobAction::StaticLibJobAction(ActionList &Inputs, types::ID Type) : JobAction(StaticLibJobClass, Inputs, Type) {} + +ForEachWrappingAction::ForEachWrappingAction(JobAction *TFormInput, + JobAction *Job) + : Action(ForEachWrappingClass, {TFormInput, Job}, Job->getType()) {} + +JobAction *ForEachWrappingAction::getTFormInput() const { + return llvm::cast(getInputs()[0]); +} + +JobAction *ForEachWrappingAction::getJobAction() const { + return llvm::cast(getInputs()[1]); +} diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 1e19957ad921f..0d90bf7902e7b 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3896,7 +3896,7 @@ class OffloadingActionBuilder final { SmallVector GpuArchList; /// Build the last steps for CUDA after all BC files have been linked. - Action *finalizeNVPTXDependences(Action *Input, const llvm::Triple &TT) { + JobAction *finalizeNVPTXDependences(Action *Input, const llvm::Triple &TT) { auto *BA = C.getDriver().ConstructPhaseAction( C, Args, phases::Backend, Input, AssociatedOffloadKind); if (TT.getOS() != llvm::Triple::NVCL) { @@ -3906,10 +3906,11 @@ class OffloadingActionBuilder final { return C.MakeAction(DeviceActions, types::TY_CUDA_FATBIN); } - return BA; + return cast(BA); } - Action *finalizeAMDGCNDependences(Action *Input, const llvm::Triple &TT) { + JobAction *finalizeAMDGCNDependences(Action *Input, + const llvm::Triple &TT) { auto *BA = C.getDriver().ConstructPhaseAction( C, Args, phases::Backend, Input, AssociatedOffloadKind); @@ -3919,7 +3920,7 @@ class OffloadingActionBuilder final { ActionList AL = {AA}; Action *LinkAction = C.MakeAction(AL, types::TY_Image); ActionList HIPActions = {LinkAction}; - Action *HIPFatBinary = + JobAction *HIPFatBinary = C.MakeAction(HIPActions, types::TY_HIP_FATBIN); return HIPFatBinary; } @@ -4052,7 +4053,7 @@ class OffloadingActionBuilder final { else FullDeviceLinkAction = DeviceLinkAction; auto *PostLinkAction = C.MakeAction( - FullDeviceLinkAction, types::TY_LLVM_BC); + FullDeviceLinkAction, types::TY_LLVM_BC, types::TY_LLVM_BC); auto *TranslateAction = C.MakeAction( PostLinkAction, types::TY_Image); SYCLLinkBinary = C.MakeAction( @@ -4324,6 +4325,7 @@ class OffloadingActionBuilder final { auto TT = SYCLTripleList[I]; auto isNVPTX = (*TC)->getTriple().isNVPTX(); auto isAMDGCN = (*TC)->getTriple().isAMDGCN(); + auto isSPIR = (*TC)->getTriple().isSPIR(); bool isSpirvAOT = TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga || TT.getSubArch() == llvm::Triple::SPIRSubArch_gen || TT.getSubArch() == llvm::Triple::SPIRSubArch_x86_64; @@ -4335,8 +4337,6 @@ class OffloadingActionBuilder final { // directly to the backend compilation step (aocr) or wrapper (aocx) else if (types::isFPGA(Input->getType())) { Action *FPGAAOTAction; - constexpr char COL_CODE[] = "Code"; - constexpr char COL_ZERO[] = "0"; if (Input->getType() == types::TY_FPGA_AOCR || Input->getType() == types::TY_FPGA_AOCR_EMU) // Generate AOCX/AOCR @@ -4347,8 +4347,10 @@ class OffloadingActionBuilder final { else llvm_unreachable("Unexpected FPGA input type."); auto *RenameAction = C.MakeAction( - FPGAAOTAction, types::TY_Tempfilelist); - RenameAction->addRenameColumnTform(COL_ZERO, COL_CODE); + FPGAAOTAction, types::TY_Tempfilelist, types::TY_Tempfilelist); + RenameAction->addRenameColumnTform( + FileTableTformJobAction::COL_ZERO, + FileTableTformJobAction::COL_CODE); auto *DeviceWrappingAction = C.MakeAction( RenameAction, types::TY_Object); DA.add(*DeviceWrappingAction, **TC, /*BoundArch=*/nullptr, @@ -4362,7 +4364,7 @@ class OffloadingActionBuilder final { // The linkage actions subgraph leading to the offload wrapper. // [cond] Means incoming/outgoing dependence is created only when cond // is true. A function of: - // n - target is NVPTX + // n - target is NVPTX/AMDGCN // a - SPIRV AOT compilation is requested // s - device code split requested // * - "all other cases" @@ -4379,17 +4381,18 @@ class OffloadingActionBuilder final { // .--------------------------------------. // | PostLink | // .--------------------------------------. - // [+n] [+*] [+] - // | | | - // .----------------. .-----------------. | - // | FileTableTform | | FileTableTform | | - // | (copy "Code") | | (extract "Code")| | - // .----------------. .-----------------. | - // [.] [-] | - // | | | + // [+*] [+] + // | | + // .-----------------. | + // | FileTableTform | | + // | (extract "Code")| | + // .-----------------. | + // [-] | + // --------------------| | // [.] [-*] | // .---------------. .-------------------. | - // | finalizeNVPTX | | SPIRVTranslator | | + // | finalizeNVPTX | | SPIRVTranslator | | + // | finalizeAMDGCN | | | | // .---------------. .-------------------. | // [.] [-as] [-!a] | // | | | | @@ -4399,13 +4402,13 @@ class OffloadingActionBuilder final { // | .----------------. | | // | [-s] | | // | | | | - // [.] [-a] [-!a] [+] - // .------------------------------------. - // | FileTableTform | - // | (replace "Code") | - // .------------------------------------. - // | - // [+] + // | [-a] [-!a] [+] + // | .--------------------. + // -----------[-n]| FileTableTform | + // | (replace "Code") | + // .--------------------. + // | + // [+*] // .--------------------------------------. // | OffloadWrapper | // .--------------------------------------. @@ -4420,7 +4423,7 @@ class OffloadingActionBuilder final { // When spv online link is supported by all backends, the fallback // device libraries are only needed when current toolchain is using // AOT compilation. - if (!isNVPTX && !isAMDGCN) { + if (isSPIR) { SYCLDeviceLibLinked = addSYCLDeviceLibs( *TC, FullLinkObjects, true, C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment()); @@ -4432,18 +4435,7 @@ class OffloadingActionBuilder final { C.MakeAction(FullLinkObjects, types::TY_LLVM_BC); else FullDeviceLinkAction = DeviceLinkAction; - // setup some flags upfront - - if ((isNVPTX || isAMDGCN) && DeviceCodeSplit) { - // TODO Temporary limitation, need to support code splitting for PTX - const Driver &D = C.getDriver(); - const std::string &OptName = - D.getOpts() - .getOption(options::OPT_fsycl_device_code_split) - .getPrefixedName(); - D.Diag(diag::err_drv_unsupported_opt_for_target) - << OptName << (*TC)->getTriple().str(); - } + // reflects whether current target is ahead-of-time and can't support // runtime setting of specialization constants bool isAOT = isNVPTX || isAMDGCN || isSpirvAOT; @@ -4452,50 +4444,48 @@ class OffloadingActionBuilder final { ActionList WrapperInputs; // post link is not optional - even if not splitting, always need to // process specialization constants + + types::ID PostLinkOutType = + isSPIR ? types::TY_Tempfiletable : FullDeviceLinkAction->getType(); + // For SPIR-V targets, force TY_Tempfiletable. auto *PostLinkAction = C.MakeAction( - FullDeviceLinkAction, types::TY_Tempfiletable); + FullDeviceLinkAction, PostLinkOutType, types::TY_Tempfiletable); PostLinkAction->setRTSetsSpecConstants(!isAOT); - constexpr char COL_CODE[] = "Code"; + auto *ExtractIRFilesAction = C.MakeAction( + PostLinkAction, + isSPIR ? types::TY_Tempfilelist : PostLinkAction->getType(), + types::TY_Tempfilelist); + // single column w/o title fits TY_Tempfilelist format + ExtractIRFilesAction->addExtractColumnTform( + FileTableTformJobAction::COL_CODE, false /*drop titles*/); if (isNVPTX || isAMDGCN) { - // Make extraction copy the only remaining code file instead of - // creating a new table with a single entry. - // TODO: Process all PTX code files in file table to enable code - // splitting for PTX target. - auto *ExtractIRFilesAction = C.MakeAction( - PostLinkAction, types::TY_LLVM_BC); - ExtractIRFilesAction->addCopySingleFileTform(COL_CODE, 0); - - Action *FinAction; - if (isNVPTX) { - FinAction = finalizeNVPTXDependences(ExtractIRFilesAction, - (*TC)->getTriple()); - } else /* isAMDGCN */ { - FinAction = finalizeAMDGCNDependences(ExtractIRFilesAction, + JobAction *FinAction = + isNVPTX ? finalizeNVPTXDependences(ExtractIRFilesAction, + (*TC)->getTriple()) + : finalizeAMDGCNDependences(ExtractIRFilesAction, (*TC)->getTriple()); - } - ActionList TformInputs{PostLinkAction, FinAction}; + auto *ForEachWrapping = C.MakeAction( + ExtractIRFilesAction, FinAction); - // Replace the only code entry in the table, as confirmed by the - // previous transformation. + ActionList TformInputs{PostLinkAction, ForEachWrapping}; auto *ReplaceFilesAction = C.MakeAction( - TformInputs, types::TY_Tempfiletable); - ReplaceFilesAction->addReplaceCellTform(COL_CODE, 0); + TformInputs, types::TY_Tempfiletable, types::TY_Tempfiletable); + ReplaceFilesAction->addReplaceColumnTform( + FileTableTformJobAction::COL_CODE, + FileTableTformJobAction::COL_CODE); + WrapperInputs.push_back(ReplaceFilesAction); } else { // For SPIRV-based targets - translate to SPIRV then optionally // compile ahead-of-time to native architecture - auto *ExtractIRFilesAction = C.MakeAction( - PostLinkAction, types::TY_Tempfilelist); - // single column w/o title fits TY_Tempfilelist format - ExtractIRFilesAction->addExtractColumnTform(COL_CODE, - false /*drop titles*/); - Action *BuildCodeAction = C.MakeAction( - ExtractIRFilesAction, types::TY_Tempfilelist); + Action *BuildCodeAction = + (Action *)C.MakeAction( + ExtractIRFilesAction, types::TY_Tempfilelist); // After the Link, wrap the files before the final host link - if (isSpirvAOT) { + if (isAOT) { types::ID OutType = types::TY_Tempfilelist; if (!DeviceCodeSplit) { OutType = (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga) @@ -4526,8 +4516,10 @@ class OffloadingActionBuilder final { } ActionList TformInputs{PostLinkAction, BuildCodeAction}; auto *ReplaceFilesAction = C.MakeAction( - TformInputs, types::TY_Tempfiletable); - ReplaceFilesAction->addReplaceColumnTform(COL_CODE, COL_CODE); + TformInputs, types::TY_Tempfiletable, types::TY_Tempfiletable); + ReplaceFilesAction->addReplaceColumnTform( + FileTableTformJobAction::COL_CODE, + FileTableTformJobAction::COL_CODE); WrapperInputs.push_back(ReplaceFilesAction); } @@ -6218,6 +6210,26 @@ static std::string GetTriplePlusArchString(const ToolChain *TC, return TriplePlusArch; } +static void CollectForEachInputs( + InputInfoList &InputInfos, const Action *SourceAction, const ToolChain *TC, + StringRef BoundArch, Action::OffloadKind TargetDeviceOffloadKind, + const std::map, InputInfo> + &CachedResults) { + for (const Action *Input : SourceAction->getInputs()) { + // Search for the Input, if not in the cache assume actions were collapsed + // so recurse. + auto Lookup = CachedResults.find( + {Input, + GetTriplePlusArchString(TC, BoundArch, TargetDeviceOffloadKind)}); + if (Lookup != CachedResults.end()) { + InputInfos.push_back(Lookup->second); + } else { + CollectForEachInputs(InputInfos, Input, TC, BoundArch, + TargetDeviceOffloadKind, CachedResults); + } + } +} + InputInfo Driver::BuildJobsForAction( Compilation &C, const Action *A, const ToolChain *TC, StringRef BoundArch, bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, @@ -6333,6 +6345,58 @@ InputInfo Driver::BuildJobsForActionNoCache( TargetDeviceOffloadKind); } + if (const ForEachWrappingAction *FEA = dyn_cast(A)) { + // Check that the main action wasn't already processed. + auto MainActionOutput = CachedResults.find( + {FEA->getJobAction(), + GetTriplePlusArchString(TC, BoundArch, TargetDeviceOffloadKind)}); + if (MainActionOutput != CachedResults.end()) { + // The input was processed on behalf of another foreach. + // Add entry in cache and return. + CachedResults[{FEA, GetTriplePlusArchString(TC, BoundArch, + TargetDeviceOffloadKind)}] = + MainActionOutput->second; + return MainActionOutput->second; + } + + // Build commands for the TFormInput then take any command added after as + // needing a llvm-foreach wrapping. + BuildJobsForAction(C, FEA->getTFormInput(), TC, BoundArch, + /*AtTopLevel=*/false, MultipleArchs, LinkingOutput, + CachedResults, TargetDeviceOffloadKind); + unsigned OffsetIdx = C.getJobs().size(); + BuildJobsForAction(C, FEA->getJobAction(), TC, BoundArch, + /*AtTopLevel=*/false, MultipleArchs, LinkingOutput, + CachedResults, TargetDeviceOffloadKind); + + auto begin = C.getJobs().getJobsForOverride().begin() + OffsetIdx; + auto end = C.getJobs().getJobsForOverride().end(); + + // Steal the commands. + llvm::SmallVector, 4> JobsToWrap( + std::make_move_iterator(begin), std::make_move_iterator(end)); + C.getJobs().getJobsForOverride().erase(begin, end); + + InputInfo ActionResult; + for (std::unique_ptr Cmd : + llvm::make_range(std::make_move_iterator(JobsToWrap.begin()), + std::make_move_iterator(JobsToWrap.end()))) { + const JobAction *SourceAction = cast(&Cmd->getSource()); + + ActionResult = CachedResults.at( + {SourceAction, + GetTriplePlusArchString(TC, BoundArch, TargetDeviceOffloadKind)}); + InputInfoList InputInfos; + CollectForEachInputs(InputInfos, SourceAction, TC, BoundArch, + TargetDeviceOffloadKind, CachedResults); + const Tool *Creator = &Cmd->getCreator(); + + tools::SYCL::constructLLVMForeachCommand( + C, *SourceAction, std::move(Cmd), InputInfos, ActionResult, Creator, + "", types::getTypeTempSuffix(ActionResult.getType())); + } + return ActionResult; + } ActionList Inputs = A->getInputs(); diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index f3cda040c936b..07927a190e977 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -390,6 +390,7 @@ Tool *ToolChain::getTool(Action::ActionClass AC) const { case Action::InputClass: case Action::BindArchClass: case Action::OffloadClass: + case Action::ForEachWrappingClass: case Action::LipoJobClass: case Action::DsymutilJobClass: case Action::VerifyDebugInfoJobClass: diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index dc3c39af9f16c..2eb49d68c0ee1 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8834,8 +8834,10 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, const InputInfoList &Inputs, const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const { + const SYCLPostLinkJobAction *SYCLPostLink = + dyn_cast(&JA); // Construct sycl-post-link command. - assert(isa(JA) && "Expecting SYCL post link job!"); + assert(SYCLPostLink && "Expecting SYCL post link job!"); ArgStringList CmdArgs; // See if device code splitting is requested @@ -8865,13 +8867,13 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, // Enable PI program metadata if (getToolChain().getTriple().isNVPTX()) addArgs(CmdArgs, TCArgs, {"-emit-program-metadata"}); - if (JA.getType() == types::TY_LLVM_BC) { + if (SYCLPostLink->getTrueType() == types::TY_LLVM_BC) { // single file output requested - this means only perform necessary IR // transformations (like specialization constant intrinsic lowering) and // output LLVMIR addArgs(CmdArgs, TCArgs, {"-ir-output-only"}); } else { - assert(JA.getType() == types::TY_Tempfiletable); + assert(SYCLPostLink->getTrueType() == types::TY_Tempfiletable); // Symbol file and specialization constant info generation is mandatory - // add options unconditionally addArgs(CmdArgs, TCArgs, {"-symbols"}); @@ -8886,8 +8888,7 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, addArgs(CmdArgs, TCArgs, {StringRef(getSYCLPostLinkOptimizationLevel(TCArgs))}); // specialization constants processing is mandatory - auto *SYCLPostLink = llvm::dyn_cast(&JA); - if (SYCLPostLink && SYCLPostLink->getRTSetsSpecConstants()) + if (SYCLPostLink->getRTSetsSpecConstants()) addArgs(CmdArgs, TCArgs, {"-spec-const=rt"}); else addArgs(CmdArgs, TCArgs, {"-spec-const=default"}); diff --git a/clang/test/Driver/sycl-offload-amdgcn.cpp b/clang/test/Driver/sycl-offload-amdgcn.cpp index cbfaad9980337..ca7ff0474fda6 100644 --- a/clang/test/Driver/sycl-offload-amdgcn.cpp +++ b/clang/test/Driver/sycl-offload-amdgcn.cpp @@ -28,12 +28,13 @@ // CHK-PHASES-NO-CC: 9: assembler, {8}, object, (host-sycl) // CHK-PHASES-NO-CC: 10: linker, {9}, image, (host-sycl) // CHK-PHASES-NO-CC: 11: linker, {5}, ir, (device-sycl) -// CHK-PHASES-NO-CC: 12: sycl-post-link, {11}, tempfiletable, (device-sycl) +// CHK-PHASES-NO-CC: 12: sycl-post-link, {11}, ir, (device-sycl) // CHK-PHASES-NO-CC: 13: file-table-tform, {12}, ir, (device-sycl) // CHK-PHASES-NO-CC: 14: backend, {13}, assembler, (device-sycl) // CHK-PHASES-NO-CC: 15: assembler, {14}, object, (device-sycl) // CHK-PHASES-NO-CC: 16: linker, {15}, image, (device-sycl) // CHK-PHASES-NO-CC: 17: linker, {16}, hip-fatbin, (device-sycl) -// CHK-PHASES-NO-CC: 18: file-table-tform, {12, 17}, tempfiletable, (device-sycl) -// CHK-PHASES-NO-CC: 19: clang-offload-wrapper, {18}, object, (device-sycl) -// CHK-PHASES-NO-CC: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (amdgcn-amd-amdhsa-sycldevice)" {19}, image +// CHK-PHASES-NO-CC: 18: foreach, {13, 17}, hip-fatbin, (device-sycl) +// CHK-PHASES-NO-CC: 19: file-table-tform, {12, 18}, tempfiletable, (device-sycl) +// CHK-PHASES-NO-CC: 20: clang-offload-wrapper, {19}, object, (device-sycl) +// CHK-PHASES-NO-CC: 21: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (amdgcn-amd-amdhsa-sycldevice)" {20}, image diff --git a/clang/test/Driver/sycl-offload-nvptx.cpp b/clang/test/Driver/sycl-offload-nvptx.cpp index fb8fb31a68cea..d04b1eae99e0a 100644 --- a/clang/test/Driver/sycl-offload-nvptx.cpp +++ b/clang/test/Driver/sycl-offload-nvptx.cpp @@ -5,16 +5,23 @@ /// Check action graph. // RUN: %clangxx -### -std=c++11 -target x86_64-unknown-linux-gnu -fsycl \ -// RUN: -fsycl-targets=nvptx64-nvidia-nvcl-sycldevice --cuda-path=%S/Inputs/CUDA/usr/local/cuda \ +// RUN: -fsycl-targets=nvptx64-nvidia-cuda --cuda-path=%S/Inputs/CUDA/usr/local/cuda \ // RUN: -fsycl-libspirv-path=%S/Inputs/SYCL/libspirv.bc %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-ACTIONS %s -// CHK-ACTIONS: "-cc1" "-triple" "nvptx64-nvidia-nvcl-sycldevice" "-aux-triple" "x86_64-unknown-linux-gnu"{{.*}} "-fsycl-is-device"{{.*}} "-Wno-sycl-strict"{{.*}} "-sycl-std=2020" {{.*}} "-internal-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libspirv.bc"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libdevice{{.*}}.10.bc"{{.*}} "-target-feature" "+ptx42"{{.*}} "-target-sdk-version=[[CUDA_VERSION:[0-9.]+]]"{{.*}} "-target-cpu" "sm_50"{{.*}} "-std=c++11"{{.*}} + +// CHK-ACTIONS: "-cc1" "-triple" "nvptx64-nvidia-cuda" "-aux-triple" "x86_64-unknown-linux-gnu"{{.*}} "-fsycl-is-device"{{.*}} "-Wno-sycl-strict"{{.*}} "-sycl-std=2020" {{.*}} "-emit-llvm-bc" {{.*}} "-internal-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libspirv.bc"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libdevice{{.*}}.10.bc"{{.*}} "-target-feature" "+ptx42"{{.*}} "-target-sdk-version=[[CUDA_VERSION:[0-9.]+]]"{{.*}} "-target-cpu" "sm_50"{{.*}} "-std=c++11"{{.*}} +// CHK-ACTIONS: sycl-post-link{{.*}} "-split=auto" +// CHK-ACTIONS: file-table-tform" "-extract=Code" "-drop_titles" +// CHK-ACTIONS: llvm-foreach" {{.*}} "--" "{{.*}}clang-13" +// CHK-ACTIONS: llvm-foreach" {{.*}} "--" "{{.*}}ptxas" +// CHK-ACTIONS: llvm-foreach" {{.*}} "--" "{{.*}}fatbinary" +// CHK-ACTIONS: file-table-tform" "-replace=Code,Code" // CHK-ACTIONS-NOT: "-mllvm -sycl-opt" // CHK-ACTIONS: clang-offload-wrapper"{{.*}} "-host=x86_64-unknown-linux-gnu" "-target=nvptx64" "-kind=sycl"{{.*}} /// Check phases w/out specifying a compute capability. // RUN: %clangxx -ccc-print-phases -std=c++11 -target x86_64-unknown-linux-gnu -fsycl \ -// RUN: -fsycl-targets=nvptx64-nvidia-nvcl-sycldevice %s 2>&1 \ +// RUN: -fsycl-targets=nvptx64-nvidia-cuda %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASES-NO-CC %s // CHK-PHASES-NO-CC: 0: input, "{{.*}}", c++, (host-sycl) // CHK-PHASES-NO-CC: 1: append-footer, {0}, c++, (host-sycl) @@ -22,22 +29,26 @@ // CHK-PHASES-NO-CC: 3: input, "{{.*}}", c++, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 4: preprocessor, {3}, c++-cpp-output, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 5: compiler, {4}, ir, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 6: offload, "host-sycl (x86_64-unknown-linux-gnu)" {2}, "device-sycl (nvptx64-nvidia-nvcl-sycldevice:sm_50)" {5}, c++-cpp-output +// CHK-PHASES-NO-CC: 6: offload, "host-sycl (x86_64-unknown-linux-gnu)" {2}, "device-sycl (nvptx64-nvidia-cuda:sm_50)" {5}, c++-cpp-output // CHK-PHASES-NO-CC: 7: compiler, {6}, ir, (host-sycl) // CHK-PHASES-NO-CC: 8: backend, {7}, assembler, (host-sycl) // CHK-PHASES-NO-CC: 9: assembler, {8}, object, (host-sycl) // CHK-PHASES-NO-CC: 10: linker, {9}, image, (host-sycl) // CHK-PHASES-NO-CC: 11: linker, {5}, ir, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 12: sycl-post-link, {11}, tempfiletable, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 12: sycl-post-link, {11}, ir, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 13: file-table-tform, {12}, ir, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 14: backend, {13}, assembler, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 15: file-table-tform, {12, 14}, tempfiletable, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 16: clang-offload-wrapper, {15}, object, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (nvptx64-nvidia-nvcl-sycldevice:sm_50)" {16}, image +// CHK-PHASES-NO-CC: 15: assembler, {14}, object, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 16: linker, {14, 15}, cuda-fatbin, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 17: foreach, {13, 16}, cuda-fatbin, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 18: file-table-tform, {12, 17}, tempfiletable, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 19: clang-offload-wrapper, {18}, object, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (nvptx64-nvidia-cuda:sm_50)" {19}, image /// Check phases specifying a compute capability. // RUN: %clangxx -ccc-print-phases -std=c++11 -target x86_64-unknown-linux-gnu -fsycl \ -// RUN: -fsycl-targets=nvptx64-nvidia-nvcl-sycldevice \ +// RUN: -fsycl-targets=nvptx64-nvidia-cuda \ +N.) // RUN: -Xsycl-target-backend "--cuda-gpu-arch=sm_35" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASES %s // CHK-PHASES: 0: input, "{{.*}}", c++, (host-sycl) @@ -46,15 +57,18 @@ // CHK-PHASES: 3: input, "{{.*}}", c++, (device-sycl, sm_35) // CHK-PHASES: 4: preprocessor, {3}, c++-cpp-output, (device-sycl, sm_35) // CHK-PHASES: 5: compiler, {4}, ir, (device-sycl, sm_35) -// CHK-PHASES: 6: offload, "host-sycl (x86_64-unknown-linux-gnu)" {2}, "device-sycl (nvptx64-nvidia-nvcl-sycldevice:sm_35)" {5}, c++-cpp-output +// CHK-PHASES: 6: offload, "host-sycl (x86_64-unknown-linux-gnu)" {2}, "device-sycl (nvptx64-nvidia-cuda:sm_35)" {5}, c++-cpp-output // CHK-PHASES: 7: compiler, {6}, ir, (host-sycl) // CHK-PHASES: 8: backend, {7}, assembler, (host-sycl) // CHK-PHASES: 9: assembler, {8}, object, (host-sycl) // CHK-PHASES: 10: linker, {9}, image, (host-sycl) // CHK-PHASES: 11: linker, {5}, ir, (device-sycl, sm_35) -// CHK-PHASES: 12: sycl-post-link, {11}, tempfiletable, (device-sycl, sm_35) +// CHK-PHASES: 12: sycl-post-link, {11}, ir, (device-sycl, sm_35) // CHK-PHASES: 13: file-table-tform, {12}, ir, (device-sycl, sm_35) // CHK-PHASES: 14: backend, {13}, assembler, (device-sycl, sm_35) -// CHK-PHASES: 15: file-table-tform, {12, 14}, tempfiletable, (device-sycl, sm_35) -// CHK-PHASES: 16: clang-offload-wrapper, {15}, object, (device-sycl, sm_35) -// CHK-PHASES: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (nvptx64-nvidia-nvcl-sycldevice:sm_35)" {16}, image +// CHK-PHASES: 15: assembler, {14}, object, (device-sycl, sm_35) +// CHK-PHASES: 16: linker, {14, 15}, cuda-fatbin, (device-sycl, sm_35) +// CHK-PHASES: 17: foreach, {13, 16}, cuda-fatbin, (device-sycl, sm_35) +// CHK-PHASES: 18: file-table-tform, {12, 17}, tempfiletable, (device-sycl, sm_35) +// CHK-PHASES: 19: clang-offload-wrapper, {18}, object, (device-sycl, sm_35) +// CHK-PHASES: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (nvptx64-nvidia-cuda:sm_35)" {19}, image From 284254571de21097bdfadc7aaa2ca6e5a6a7613e Mon Sep 17 00:00:00 2001 From: Dmitry Vodopyanov Date: Thu, 29 Jul 2021 19:11:03 +0300 Subject: [PATCH 25/82] [SYCL] Restore the correct initialization for _statically_coalesce_val (#4206) Patch https://github.com/intel/llvm/pull/3957 introduces `_statically_coalesce_val` in fpga_lsu.cpp like this: ``` _GetValue, _mem_access_params...>::value; ``` During merge conflict resolution in https://github.com/intel/llvm/pull/4014 it was change accidentally to ``` _GetValue, _mem_access_params...>::value; ``` Restoring the right value. --- sycl/include/sycl/ext/intel/fpga_lsu.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/include/sycl/ext/intel/fpga_lsu.hpp b/sycl/include/sycl/ext/intel/fpga_lsu.hpp index 3e7c5caee1803..4c40c58a671f2 100644 --- a/sycl/include/sycl/ext/intel/fpga_lsu.hpp +++ b/sycl/include/sycl/ext/intel/fpga_lsu.hpp @@ -90,7 +90,7 @@ template class lsu final { static constexpr uint8_t _cache = (_cache_val > 0) ? CACHE : 0; static constexpr int32_t _statically_coalesce_val = - _GetValue, _mem_access_params...>::value; + _GetValue, _mem_access_params...>::value; static constexpr uint8_t _dont_statically_coalesce = _statically_coalesce_val == 0 ? STATICALLY_COALESCE : 0; From 87b5473c499cfd02580f27e5fce86c14ed7a1ddc Mon Sep 17 00:00:00 2001 From: linkren Date: Fri, 30 Jul 2021 00:59:52 +0800 Subject: [PATCH 26/82] [opencl-aot] Add option to control output of verbose log (#4179) --- opencl/opencl-aot/source/main.cpp | 42 +++++++++++++++++++------------ 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/opencl/opencl-aot/source/main.cpp b/opencl/opencl-aot/source/main.cpp index 8c09f618744bc..5b97ca9b09b77 100644 --- a/opencl/opencl-aot/source/main.cpp +++ b/opencl/opencl-aot/source/main.cpp @@ -20,6 +20,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" +#include "llvm/Support/raw_ostream.h" #include #include @@ -63,6 +64,12 @@ using CLContextSPtr = // same as cl_context, should // initialized with ContextDeleter +static bool verbose = false; +static llvm::raw_ostream &logs() { + static llvm::raw_ostream &logger = verbose ? llvm::outs() : llvm::nulls(); + return logger; +} + /*! \brief Generate OpenCL program from OpenCL program binary (in ELF format) or * SPIR-V binary file or LLVM IR (bitcode file) or OpenCL source file * \param FileNames (const std::vector). @@ -220,9 +227,9 @@ generateProgramsFromInput(const std::vector &FileNames, Programs.push_back(Program); - std::cout << "OpenCL program was successfully created from " + - SupportedTypesToNames[FileType] + " file " + FileName - << '\n'; + logs() << "OpenCL program was successfully created from " + + SupportedTypesToNames[FileType] + " file " + FileName + << '\n'; } // step 5: create guards to return result safely @@ -349,6 +356,9 @@ int main(int Argc, char *Argv[]) { cl::list OptBuildOptions("bo", cl::ZeroOrMore, cl::desc("Set OpenCL build options"), cl::value_desc("build options")); + cl::opt OptVerbose("verbose", cl::desc("Show verbose logs"), + cl::location(verbose)); + cl::alias OptV("v", cl::aliasopt(OptVerbose)); cl::ParseCommandLineOptions( Argc, Argv, @@ -379,8 +389,8 @@ int main(int Argc, char *Argv[]) { // If not a link command, we only handle one input file each time. if (OptCommand != Commands::link && InputFileNames.size() >= 1) { - std::cout << "WARNING: Can " << CmdToCmdInfoMap[OptCommand].first - << " only 1 file each time. Extra file(s) will be ignored!\n"; + logs() << "WARNING: Can " << CmdToCmdInfoMap[OptCommand].first + << " only 1 file each time. Extra file(s) will be ignored!\n"; break; } InputFileNames.push_back(Item); @@ -425,7 +435,7 @@ int main(int Argc, char *Argv[]) { return CLErr; } - std::cout << "Platform name: " << PlatformName << '\n'; + logs() << "Platform name: " << PlatformName << '\n'; // step 3: get OpenCL device cl_device_id DeviceId = nullptr; @@ -446,7 +456,7 @@ int main(int Argc, char *Argv[]) { return CLErr; } - std::cout << "Device name: " << DeviceName << '\n'; + logs() << "Device name: " << DeviceName << '\n'; // step 4: get driver version std::string DriverVersion; @@ -458,7 +468,7 @@ int main(int Argc, char *Argv[]) { return CLErr; } - std::cout << "Driver version: " << DriverVersion << '\n'; + logs() << "Driver version: " << DriverVersion << '\n'; // step 5: enable optimizations for target CPU architecture if (OptMArch.getNumOccurrences()) { @@ -487,8 +497,8 @@ int main(int Argc, char *Argv[]) { << ArchTypeToArchTypeName[OptMArch] << '\n'; return OPENCL_AOT_TARGET_CPU_ARCH_FAILURE; } - std::cout << "Setting target CPU architecture to " - << ArchTypeToArchTypeName[OptMArch] << '\n'; + logs() << "Setting target CPU architecture to " + << ArchTypeToArchTypeName[OptMArch] << '\n'; } // step 6: generate OpenCL programs from input files @@ -526,7 +536,7 @@ int main(int Argc, char *Argv[]) { if (!ParentDir.empty()) { BuildOptions += " -I \"" + std::string(ParentDir) + '\"'; } - std::cout << "Using build options: " << BuildOptions << '\n'; + logs() << "Using build options: " << BuildOptions << '\n'; } // step 8: compile | build | link OpenCL program @@ -564,9 +574,9 @@ int main(int Argc, char *Argv[]) { } if (!CompilerBuildLog.empty()) { - std::cout << "\n" - << CmdToCmdInfoMap[OptCommand].first << " log:\n" - << CompilerBuildLog << '\n'; + logs() << "\n" + << CmdToCmdInfoMap[OptCommand].first << " log:\n" + << CompilerBuildLog << '\n'; } if (clFailed(CLErr)) { @@ -611,8 +621,8 @@ int main(int Argc, char *Argv[]) { << CmdToCmdInfoMap[OptCommand].second << " file" << '\n'; return OPENCL_AOT_FAILED_TO_CREATE_ELF; } - std::cout << "OpenCL program " << CmdToCmdInfoMap[OptCommand].second - << " file was successfully created: " << OutputFileName << '\n'; + logs() << "OpenCL program " << CmdToCmdInfoMap[OptCommand].second + << " file was successfully created: " << OutputFileName << '\n'; return CL_SUCCESS; } From 4b3fdded0947ff4fba18f1323808d7b7ff8a79b2 Mon Sep 17 00:00:00 2001 From: Victor Lomuller Date: Fri, 30 Jul 2021 11:08:37 +0100 Subject: [PATCH 27/82] [Doc] Update SYCL CUDA documentation (#4214) Update the documentation regarding the compilation process for CUDA targets to reflect the module splitting support. Signed-off-by: Victor Lomuller --- clang/include/clang/Driver/Action.h | 2 +- sycl/doc/CompilerAndRuntimeDesign.md | 16 +- sycl/doc/images/DeviceLinkAndWrap.svg | 617 ++++++++++++++++-------- sycl/doc/images/DevicePTXProcessing.svg | 187 ++++--- 4 files changed, 536 insertions(+), 286 deletions(-) diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h index 189bc2208c9ff..3621348f6a2ec 100644 --- a/clang/include/clang/Driver/Action.h +++ b/clang/include/clang/Driver/Action.h @@ -738,7 +738,7 @@ class SYCLPostLinkJobAction : public JobAction { void anchor() override; public: - // The tempfiletable management relies on a shadowing the main file type by + // The tempfiletable management relies on shadowing the main file type by // types::TY_Tempfiletable. The problem of shadowing is it prevents its // integration with clang tools that relies on the file type to properly set // args. diff --git a/sycl/doc/CompilerAndRuntimeDesign.md b/sycl/doc/CompilerAndRuntimeDesign.md index e98233eb73951..f55c5df905aa2 100644 --- a/sycl/doc/CompilerAndRuntimeDesign.md +++ b/sycl/doc/CompilerAndRuntimeDesign.md @@ -548,13 +548,15 @@ down to the NVPTX Back End. All produced bitcode depends on two libraries, During the "PTX target processing" in the device linking step [Device code post-link step](#device-code-post-link-step), the llvm bitcode -objects for the CUDA target are linked together alongside -`libspirv-nvptx64--nvidiacl.bc` and `libdevice.bc`, compiled to PTX -using the NVPTX backend and assembled into a cubin using the `ptxas` -tool (part of the CUDA SDK). The PTX file and cubin are assembled -together using `fatbinary` to produce a CUDA fatbin. The CUDA fatbin -then replaces the llvm bitcode file in the file table generated by -`sycl-post-link`. The resulting table is passed to the offload wrapper tool. +objects for the CUDA target are linked together during the common +`llvm-link` step and then split using the `sycl-post-link` tool. +For each temporary bitcode file, clang is invoked for the temporary file to link +`libspirv-nvptx64--nvidiacl.bc` and `libdevice.bc` and compile the resulting +module to PTX using the NVPTX backend. The resulting PTX file is assembled +into a cubin using the `ptxas` tool (part of the CUDA SDK). The PTX file and +cubin are assembled together using `fatbinary` to produce a CUDA fatbin. +The produced CUDA fatbins then replace the llvm bitcode files in the file table generated +by `sycl-post-link`. The resulting table is passed to the offload wrapper tool. ![NVPTX AOT build](images/DevicePTXProcessing.svg) diff --git a/sycl/doc/images/DeviceLinkAndWrap.svg b/sycl/doc/images/DeviceLinkAndWrap.svg index 10ea7704f79d8..1234b368fc18b 100644 --- a/sycl/doc/images/DeviceLinkAndWrap.svg +++ b/sycl/doc/images/DeviceLinkAndWrap.svg @@ -9,7 +9,7 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="DeviceLinkAndWrap.svg" - inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)" + inkscape:version="0.92.3 (2405546, 2018-03-11)" id="svg8" version="1.1" viewBox="0 0 205.79753 221.03191" @@ -1827,6 +1827,78 @@ x2="517.42999" y2="349.29999" spreadMethod="pad" /> + + + + + + + + + + + + + + + + + + + + + + + + - + Device LLVM IR + id="tspan897">Device LLVM IR + - @@ -2143,7 +2207,7 @@ id="path1013" inkscape:connector-curvature="0" /> @@ -2158,7 +2222,7 @@ id="path1019" inkscape:connector-curvature="0" /> @@ -2173,7 +2237,7 @@ id="path1025" inkscape:connector-curvature="0" /> @@ -2239,12 +2303,12 @@ @@ -2334,11 +2398,13 @@ + file + id="tspan1119">file + + - + id="tspan1131">- + + table + id="tspan1143">table + + - + id="tspan1155">- + + tform + id="tspan1167">tform + + extract “Code” + id="tspan1179">extract “Code” + + AOT backend + id="tspan1243">AOT backend + + @@ -2546,11 +2629,13 @@ + PTX target + id="tspan1307">PTX target + + processing + id="tspan1319">processing + + clang + id="tspan1383">clang + + - + id="tspan1395">- + + offload + id="tspan1407">offload + + - + id="tspan1419">- + + wrapper + id="tspan1431">wrapper + + s + id="tspan1495">s + + ycl + id="tspan1507">ycl + + - + id="tspan1519">- + + post + id="tspan1531">post + + - + id="tspan1543">- + + link + id="tspan1555">link + + file + id="tspan1619">file + + - + id="tspan1631">- + + table + id="tspan1643">table + + - + id="tspan1655">- + + tform + id="tspan1667">tform + + replace “Code” + id="tspan1679">replace “Code” + + llvm + id="tspan1743">llvm + + - + id="tspan1755">- + + spirv + id="tspan1767">spirv + - @@ -3533,11 +3655,13 @@ + Wrapper object + id="tspan2127">Wrapper object + + Device code + id="tspan2175">Device code + + (f r o m l + id="tspan2191">(f r o m l + + l + id="tspan2203">l + + v m + id="tspan2215">v m + + - + id="tspan2227">- + + l i n k) + id="tspan2239">l i n k) + + (t o h o s t l i n k e r) + id="tspan2251">(t o h o s t l i n k e r) + - @@ -3726,11 +3859,13 @@ + TY_tempfiletable + id="tspan2265">TY_tempfiletable + + TY_tempfilelist - - - - - s - - - - - ingle file - - - - - - PTX target compilation + id="tspan2277">TY_tempfilelist + + Split code + id="tspan2343">Split code + + file + id="tspan1119-5">file + + - + id="tspan1131-3">- + + table + id="tspan1143-6">table + + - + id="tspan1155-0">- + + tform + id="tspan1167-8">tform + copy “Code” + All targets + y="0">All targets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sycl/doc/images/DevicePTXProcessing.svg b/sycl/doc/images/DevicePTXProcessing.svg index a639d2906a6c8..df690ec5fb08b 100644 --- a/sycl/doc/images/DevicePTXProcessing.svg +++ b/sycl/doc/images/DevicePTXProcessing.svg @@ -9,7 +9,7 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="DevicePTXProcessing.svg" - inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)" + inkscape:version="0.92.3 (2405546, 2018-03-11)" id="svg8" version="1.1" viewBox="0 0 205.79753 221.03191" @@ -2204,16 +2204,16 @@ fit-margin-left="0" fit-margin-top="0" inkscape:window-maximized="1" - inkscape:window-y="-8" - inkscape:window-x="1912" - inkscape:window-height="1017" + inkscape:window-y="0" + inkscape:window-x="1920" + inkscape:window-height="1163" inkscape:window-width="1920" showgrid="false" inkscape:document-rotation="0" inkscape:current-layer="layer1" inkscape:document-units="mm" - inkscape:cy="361.85228" - inkscape:cx="371.91241" + inkscape:cy="330.42371" + inkscape:cx="228.34098" inkscape:zoom="1.4" inkscape:pageshadow="2" inkscape:pageopacity="0.0" @@ -2318,14 +2318,16 @@ d="m 125.31238,20.80355 0.32455,-1.291166 1.29117,-0.324556 z" /> + File table + y="16.988504">File table + + Clang + y="84.249756">Clang + @@ -2491,11 +2495,13 @@ + clang + x="0 7.7220001 15.444 23.166 30.94416">clang + + - + x="0">- + + offload + x="0 7.7922001 15.5142 23.2362 30.9582 38.736359 46.528561">offload + + - + x="0">- + + wrapper + x="0 7.7922001 15.5142 23.2362 30.9582 38.736359 46.458359">wrapper + + PTX target processing + y="60.97049">PTX target processing + @@ -2681,11 +2697,13 @@ + Wrapper object + x="0 12.11652 16.79184 23.517 30.831841 38.146679 45.138599 50.038559 53.141399 60.540482 67.911484 71.267036 78.258957 84.099602">Wrapper object + + Device code + x="0 8.6493597 15.484464 21.841393 25.076113 30.968927 37.930607 41.151264 46.917503 54.329231 61.712833">Device code + + (from sycl-post-link) + y="17.476978">(from sycl-post-link) + @@ -2792,11 +2814,13 @@ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.953px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.352778" id="text899-9" x="73.031509" - y="68.195061"> + libspirv.bc + sodipodi:role="line">libspirv.bc + + libdevice.bc + sodipodi:role="line">libdevice.bc + + ptxas + y="113.47669">ptxas + @@ -2936,11 +2964,13 @@ id="text1309-7" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.953px;font-family:Consolas;-inkscape-font-specification:'Consolas, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.352778" x="102.06758" - y="137.37424"> + fatbin + y="137.37424">fatbin + + ptx + id="tspan3794">ptx + + cubin + id="tspan3916">cubin + + LLVM IR + y="73.327454">LLVM IR + + CUDA fatbin + id="tspan2303">CUDA fatbin + + (to host linker) + y="216.68318">(to host linker) + + (nvptx backend) - (Single row) + y="88.973877">(nvptx backend) + + file-table-tform + y="33.349266">file-table-tform + + (Copy "Code") + y="37.806171">(Copy "Code") + + LLVM IR + y="47.484673">LLVM IR + + file-table-tform + y="161.4454">file-table-tform + + (Replace "Code") + y="165.9023">(Replace "Code") + + File table + id="tspan2303-1">File table + Date: Fri, 30 Jul 2021 11:09:00 +0100 Subject: [PATCH 28/82] [SYCL][LIBCLC] Add support for non-uniform [I/F]Mul op in ptx-nvidiacl (#4217) --- .../libspirv/group/collectives.cl | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/libclc/ptx-nvidiacl/libspirv/group/collectives.cl b/libclc/ptx-nvidiacl/libspirv/group/collectives.cl index b27d4f9289bac..b14afb0e73dc0 100644 --- a/libclc/ptx-nvidiacl/libspirv/group/collectives.cl +++ b/libclc/ptx-nvidiacl/libspirv/group/collectives.cl @@ -151,6 +151,7 @@ __clc__SubgroupBitwiseAny(uint op, bool predicate, bool *carry) { #define __CLC_MAX(x, y) ((x > y) ? (x) : (y)) #define __CLC_OR(x, y) (x | y) #define __CLC_AND(x, y) (x & y) +#define __CLC_MUL(x, y) (x * y) #define __CLC_SUBGROUP_COLLECTIVE_BODY(OP, TYPE, IDENTITY) \ uint sg_lid = __spirv_SubgroupLocalInvocationId(); \ @@ -210,6 +211,18 @@ __CLC_SUBGROUP_COLLECTIVE(FAdd, __CLC_ADD, half, 0) __CLC_SUBGROUP_COLLECTIVE(FAdd, __CLC_ADD, float, 0) __CLC_SUBGROUP_COLLECTIVE(FAdd, __CLC_ADD, double, 0) +__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, char, 0) +__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, uchar, 0) +__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, short, 0) +__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, ushort, 0) +__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, int, 0) +__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, uint, 0) +__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, long, 0) +__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, ulong, 0) +__CLC_SUBGROUP_COLLECTIVE(FMul, __CLC_MUL, half, 0) +__CLC_SUBGROUP_COLLECTIVE(FMul, __CLC_MUL, float, 0) +__CLC_SUBGROUP_COLLECTIVE(FMul, __CLC_MUL, double, 0) + __CLC_SUBGROUP_COLLECTIVE(SMin, __CLC_MIN, char, CHAR_MAX) __CLC_SUBGROUP_COLLECTIVE(UMin, __CLC_MIN, uchar, UCHAR_MAX) __CLC_SUBGROUP_COLLECTIVE(SMin, __CLC_MIN, short, SHRT_MAX) @@ -238,12 +251,12 @@ __CLC_SUBGROUP_COLLECTIVE(FMax, __CLC_MAX, double, -DBL_MAX) #undef __CLC_SUBGROUP_COLLECTIVE #undef __CLC_SUBGROUP_COLLECTIVE_REDUX -#define __CLC_GROUP_COLLECTIVE(NAME, OP, TYPE, IDENTITY) \ +#define __CLC_GROUP_COLLECTIVE_INNER(SPIRV_NAME, CLC_NAME, OP, TYPE, IDENTITY) \ _CLC_DEF _CLC_OVERLOAD _CLC_CONVERGENT TYPE __CLC_APPEND( \ - __spirv_Group, NAME)(uint scope, uint op, TYPE x) { \ + __spirv_Group, SPIRV_NAME)(uint scope, uint op, TYPE x) { \ TYPE carry = IDENTITY; \ /* Perform GroupOperation within sub-group */ \ - TYPE sg_x = __CLC_APPEND(__clc__Subgroup, NAME)(op, x, &carry); \ + TYPE sg_x = __CLC_APPEND(__clc__Subgroup, CLC_NAME)(op, x, &carry); \ if (scope == Subgroup) { \ return sg_x; \ } \ @@ -283,6 +296,18 @@ __CLC_SUBGROUP_COLLECTIVE(FMax, __CLC_MAX, double, -DBL_MAX) return result; \ } +#define __CLC_GROUP_COLLECTIVE_4(NAME, OP, TYPE, IDENTITY) \ + __CLC_GROUP_COLLECTIVE_INNER(NAME, NAME, OP, TYPE, IDENTITY) +#define __CLC_GROUP_COLLECTIVE_5(SPIRV_NAME, CLC_NAME, OP, TYPE, IDENTITY) \ + __CLC_GROUP_COLLECTIVE_INNER(SPIRV_NAME, CLC_NAME, OP, TYPE, IDENTITY) + +#define DISPATCH_TO_CLC_GROUP_COLLECTIVE_MACRO(_1, _2, _3, _4, _5, NAME, ...) \ + NAME +#define __CLC_GROUP_COLLECTIVE(...) \ + DISPATCH_TO_CLC_GROUP_COLLECTIVE_MACRO( \ + __VA_ARGS__, __CLC_GROUP_COLLECTIVE_5, __CLC_GROUP_COLLECTIVE_4) \ + (__VA_ARGS__) + __CLC_GROUP_COLLECTIVE(BitwiseOr, __CLC_OR, bool, false); __CLC_GROUP_COLLECTIVE(BitwiseAny, __CLC_AND, bool, true); _CLC_DEF _CLC_OVERLOAD _CLC_CONVERGENT bool __spirv_GroupAny(uint scope, @@ -306,6 +331,19 @@ __CLC_GROUP_COLLECTIVE(FAdd, __CLC_ADD, half, 0) __CLC_GROUP_COLLECTIVE(FAdd, __CLC_ADD, float, 0) __CLC_GROUP_COLLECTIVE(FAdd, __CLC_ADD, double, 0) +// There is no Mul group op in SPIR-V, use non-uniform variant instead. +__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, char, 0) +__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, uchar, 0) +__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, short, 0) +__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, ushort, 0) +__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, int, 0) +__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, uint, 0) +__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, long, 0) +__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, ulong, 0) +__CLC_GROUP_COLLECTIVE(NonUniformFMul, FMul, __CLC_MUL, half, 0) +__CLC_GROUP_COLLECTIVE(NonUniformFMul, FMul, __CLC_MUL, float, 0) +__CLC_GROUP_COLLECTIVE(NonUniformFMul, FMul, __CLC_MUL, double, 0) + __CLC_GROUP_COLLECTIVE(SMin, __CLC_MIN, char, CHAR_MAX) __CLC_GROUP_COLLECTIVE(UMin, __CLC_MIN, uchar, UCHAR_MAX) __CLC_GROUP_COLLECTIVE(SMin, __CLC_MIN, short, SHRT_MAX) @@ -344,6 +382,9 @@ _CLC_DECL _CLC_CONVERGENT half _Z17__spirv_GroupFMaxjjDF16_(uint scope, uint op, return __spirv_GroupFMax(scope, op, x); } +#undef __CLC_GROUP_COLLECTIVE_4 +#undef __CLC_GROUP_COLLECTIVE_5 +#undef DISPATCH_TO_CLC_GROUP_COLLECTIVE_MACRO #undef __CLC_GROUP_COLLECTIVE #undef __CLC_AND @@ -351,6 +392,7 @@ _CLC_DECL _CLC_CONVERGENT half _Z17__spirv_GroupFMaxjjDF16_(uint scope, uint op, #undef __CLC_MAX #undef __CLC_MIN #undef __CLC_ADD +#undef __CLC_MUL long __clc__get_linear_local_id() { size_t id_x = __spirv_LocalInvocationId_x(); From 170b3447b30375b1f8c55120680b543899b074b8 Mon Sep 17 00:00:00 2001 From: Jakub Chlanda Date: Fri, 30 Jul 2021 16:56:29 +0100 Subject: [PATCH 29/82] [SYCL][LIBCLC] Add subgroup builtins for AMDGCN (#4208) This patch brings in support for the following builtins: * `__spirv_SubgroupMaxSize` * `__spirv_NumSubgroups` * `__spirv_SubgroupId` * `__spirv_SubgroupSize` The implementation follows that of HIP. --- libclc/amdgcn-amdhsa/libspirv/SOURCES | 4 +++ .../workitem/get_max_sub_group_size.cl | 28 +++++++++++++++++++ .../libspirv/workitem/get_num_sub_groups.cl | 18 ++++++++++++ .../libspirv/workitem/get_sub_group_id.cl | 20 +++++++++++++ .../libspirv/workitem/get_sub_group_size.cl | 22 +++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl create mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl create mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl create mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl diff --git a/libclc/amdgcn-amdhsa/libspirv/SOURCES b/libclc/amdgcn-amdhsa/libspirv/SOURCES index e291cd7d16538..95c0361987929 100644 --- a/libclc/amdgcn-amdhsa/libspirv/SOURCES +++ b/libclc/amdgcn-amdhsa/libspirv/SOURCES @@ -7,3 +7,7 @@ math/sin.cl math/sqrt.cl math/atan.cl math/cbrt.cl +workitem/get_max_sub_group_size.cl +workitem/get_num_sub_groups.cl +workitem/get_sub_group_id.cl +workitem/get_sub_group_size.cl diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl new file mode 100644 index 0000000000000..394405a0c1931 --- /dev/null +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +// FIXME: Remove the following workaround once the clang change is released. +// This is for backward compatibility with older clang which does not define +// __AMDGCN_WAVEFRONT_SIZE. It does not consider -mwavefrontsize64. +// See: +// https://github.com/intel/llvm/blob/sycl/clang/lib/Basic/Targets/AMDGPU.h#L414 +// and: +// https://github.com/intel/llvm/blob/sycl/clang/lib/Basic/Targets/AMDGPU.cpp#L421 +#ifndef __AMDGCN_WAVEFRONT_SIZE +#if __gfx1010__ || __gfx1011__ || __gfx1012__ || __gfx1030__ || __gfx1031__ +#define __AMDGCN_WAVEFRONT_SIZE 32 +#else +#define __AMDGCN_WAVEFRONT_SIZE 64 +#endif +#endif + +_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupMaxSize() { + return __AMDGCN_WAVEFRONT_SIZE; +} diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl new file mode 100644 index 0000000000000..1487ba91b18e8 --- /dev/null +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl @@ -0,0 +1,18 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +_CLC_DEF _CLC_OVERLOAD uint __spirv_NumSubgroups() { + size_t size_x = __spirv_WorkgroupSize_x(); + size_t size_y = __spirv_WorkgroupSize_y(); + size_t size_z = __spirv_WorkgroupSize_z(); + uint sg_size = __spirv_SubgroupMaxSize(); + size_t linear_size = size_z * size_y * size_x; + return (uint)((linear_size + sg_size - 1) / sg_size); +} diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl new file mode 100644 index 0000000000000..6b6095d51141a --- /dev/null +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupId() { + size_t id_x = __spirv_LocalInvocationId_x(); + size_t id_y = __spirv_LocalInvocationId_y(); + size_t id_z = __spirv_LocalInvocationId_z(); + size_t size_x = __spirv_WorkgroupSize_x(); + size_t size_y = __spirv_WorkgroupSize_y(); + size_t size_z = __spirv_WorkgroupSize_z(); + uint sg_size = __spirv_SubgroupMaxSize(); + return (id_z * size_y * size_x + id_y * size_x + id_x) / sg_size; +} diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl new file mode 100644 index 0000000000000..5a9d35aa0e734 --- /dev/null +++ b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupSize() { + if (__spirv_SubgroupId() != __spirv_NumSubgroups() - 1) { + return __spirv_SubgroupMaxSize(); + } + size_t size_x = __spirv_WorkgroupSize_x(); + size_t size_y = __spirv_WorkgroupSize_y(); + size_t size_z = __spirv_WorkgroupSize_z(); + size_t linear_size = size_z * size_y * size_x; + size_t uniform_groups = __spirv_NumSubgroups() - 1; + size_t uniform_size = __spirv_SubgroupMaxSize() * uniform_groups; + return linear_size - uniform_size; +} From 5862f8479a8edd5ac838cdab2cad9f2210bb8f4b Mon Sep 17 00:00:00 2001 From: Nicolas Miller Date: Fri, 30 Jul 2021 16:57:30 +0100 Subject: [PATCH 30/82] [SYCL] Construct context from first device in unit tests (#4142) This is because multiple devices in a context is not supported with AOT compiling, which is always used for the CUDA and ROCm pluginis, and constructing the context from the platform may result in multiple devices in the context if there are multiple devices available on the system. These tests are run with a device filter so this will only happen when there is multiple devices of the same type. Which also means that it should always be fine to take the first device from the platform as it should still be of the expected device type. --- sycl/unittests/kernel-and-program/DeviceInfo.cpp | 2 +- sycl/unittests/kernel-and-program/KernelInfo.cpp | 2 +- sycl/unittests/kernel-and-program/KernelRelease.cpp | 2 +- sycl/unittests/queue/EventClear.cpp | 4 ++-- sycl/unittests/queue/Wait.cpp | 2 +- sycl/unittests/scheduler/CommandsWaitForEvents.cpp | 4 ++-- sycl/unittests/scheduler/InOrderQueueDeps.cpp | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/sycl/unittests/kernel-and-program/DeviceInfo.cpp b/sycl/unittests/kernel-and-program/DeviceInfo.cpp index 57139b368cb41..207334114e73a 100644 --- a/sycl/unittests/kernel-and-program/DeviceInfo.cpp +++ b/sycl/unittests/kernel-and-program/DeviceInfo.cpp @@ -64,7 +64,7 @@ TEST_F(DeviceInfoTest, GetDeviceUUID) { return; } - context Ctx{Plt}; + context Ctx{Plt.get_devices()[0]}; TestContext.reset(new TestCtx(Ctx)); device Dev = Ctx.get_devices()[0]; diff --git a/sycl/unittests/kernel-and-program/KernelInfo.cpp b/sycl/unittests/kernel-and-program/KernelInfo.cpp index 7290ae606e1b1..278710557b0a2 100644 --- a/sycl/unittests/kernel-and-program/KernelInfo.cpp +++ b/sycl/unittests/kernel-and-program/KernelInfo.cpp @@ -123,7 +123,7 @@ TEST_F(KernelInfoTest, GetPrivateMemUsage) { return; } - context Ctx{Plt}; + context Ctx{Plt.get_devices()[0]}; program Prg{Ctx}; TestContext.reset(new TestCtx(Ctx)); diff --git a/sycl/unittests/kernel-and-program/KernelRelease.cpp b/sycl/unittests/kernel-and-program/KernelRelease.cpp index 8d11d20b83380..95fb4b3e1b714 100644 --- a/sycl/unittests/kernel-and-program/KernelRelease.cpp +++ b/sycl/unittests/kernel-and-program/KernelRelease.cpp @@ -103,7 +103,7 @@ TEST(KernelReleaseTest, GetKernelRelease) { Mock.redefine( redefinedKernelSetExecInfo); - context Ctx{Plt}; + context Ctx{Plt.get_devices()[0]}; TestContext.reset(new TestCtx(Ctx)); program Prg{Ctx}; diff --git a/sycl/unittests/queue/EventClear.cpp b/sycl/unittests/queue/EventClear.cpp index bc4310ddd0f6f..28d5c045a8a4a 100644 --- a/sycl/unittests/queue/EventClear.cpp +++ b/sycl/unittests/queue/EventClear.cpp @@ -108,7 +108,7 @@ TEST(QueueEventClear, ClearOnQueueWait) { if (!preparePiMock(Plt)) return; - context Ctx{Plt}; + context Ctx{Plt.get_devices()[0]}; TestContext.reset(new TestCtx(Ctx)); queue Q{Ctx, default_selector()}; @@ -129,7 +129,7 @@ TEST(QueueEventClear, CleanupOnThreshold) { if (!preparePiMock(Plt)) return; - context Ctx{Plt}; + context Ctx{Plt.get_devices()[0]}; TestContext.reset(new TestCtx(Ctx)); queue Q{Ctx, default_selector()}; diff --git a/sycl/unittests/queue/Wait.cpp b/sycl/unittests/queue/Wait.cpp index 8592b5cd8d8a7..b04e85633a343 100644 --- a/sycl/unittests/queue/Wait.cpp +++ b/sycl/unittests/queue/Wait.cpp @@ -120,7 +120,7 @@ TEST(QueueWait, QueueWaitTest) { platform Plt{default_selector()}; if (!preparePiMock(Plt)) return; - context Ctx{Plt}; + context Ctx{Plt.get_devices()[0]}; queue Q{Ctx, default_selector()}; unsigned char *HostAlloc = (unsigned char *)malloc_host(1, Ctx); diff --git a/sycl/unittests/scheduler/CommandsWaitForEvents.cpp b/sycl/unittests/scheduler/CommandsWaitForEvents.cpp index 225db9301ce28..07eba4ad6a37f 100644 --- a/sycl/unittests/scheduler/CommandsWaitForEvents.cpp +++ b/sycl/unittests/scheduler/CommandsWaitForEvents.cpp @@ -79,9 +79,9 @@ TEST_F(SchedulerTest, CommandsWaitForEvents) { Mock.redefine(retainReleaseFunc); Mock.redefine(getEventInfoFunc); - context Ctx1{Plt}; + context Ctx1{Plt.get_devices()[0]}; queue Q1{Ctx1, Selector}; - context Ctx2{Plt}; + context Ctx2{Plt.get_devices()[0]}; queue Q2{Ctx2, Selector}; TestContext.reset(new TestCtx(Q1, Q2)); diff --git a/sycl/unittests/scheduler/InOrderQueueDeps.cpp b/sycl/unittests/scheduler/InOrderQueueDeps.cpp index 14c8a802d1772..d5263cdf42497 100644 --- a/sycl/unittests/scheduler/InOrderQueueDeps.cpp +++ b/sycl/unittests/scheduler/InOrderQueueDeps.cpp @@ -97,7 +97,7 @@ TEST_F(SchedulerTest, InOrderQueueDeps) { Mock.redefine(redefinedEventsWait); Mock.redefine(redefinedEventRelease); - context Ctx{Plt}; + context Ctx{Plt.get_devices()[0]}; queue InOrderQueue{Ctx, Selector, property::queue::in_order()}; cl::sycl::detail::QueueImplPtr InOrderQueueImpl = detail::getSyclObjImpl(InOrderQueue); From e7352f2c3a61ba6907f806f578594bc44fba0bba Mon Sep 17 00:00:00 2001 From: denis-kabanov Date: Fri, 30 Jul 2021 18:59:30 +0300 Subject: [PATCH 31/82] [SYCL] Expansion of the class CG to CommandGroup (#4216) Expansion of the class "CG" to "CommandGroup" to avoid possible name collisions with macro. --- sycl/include/CL/sycl/detail/cg.hpp | 110 +++++++++--------- sycl/include/CL/sycl/handler.hpp | 68 +++++------ sycl/source/detail/scheduler/commands.cpp | 71 +++++------ sycl/source/detail/scheduler/commands.hpp | 7 +- .../source/detail/scheduler/graph_builder.cpp | 19 ++- sycl/source/detail/scheduler/scheduler.cpp | 14 ++- sycl/source/detail/scheduler/scheduler.hpp | 8 +- sycl/source/handler.cpp | 46 ++++---- sycl/test/abi/layout_handler.cpp | 2 +- sycl/test/abi/vtable.cpp | 12 +- .../check_simple_name_collisions.cpp | 1 + .../scheduler/SchedulerTestUtils.hpp | 2 +- .../scheduler/StreamInitDependencyOnHost.cpp | 14 +-- 13 files changed, 193 insertions(+), 181 deletions(-) diff --git a/sycl/include/CL/sycl/detail/cg.hpp b/sycl/include/CL/sycl/detail/cg.hpp index 9a7bbfc664851..815552cd7d555 100644 --- a/sycl/include/CL/sycl/detail/cg.hpp +++ b/sycl/include/CL/sycl/detail/cg.hpp @@ -137,7 +137,7 @@ constexpr unsigned char getCGTypeVersion(unsigned int Type) { } /// Base class for all types of command groups. -class CG { +class CommandGroup { public: // Used to version CG and handler classes. Using unsigned char as the version // is encoded in the highest byte of CGType value. So it is not possible to @@ -168,11 +168,12 @@ class CG { AdviseUSM = 15, }; - CG(CGType Type, std::vector> ArgsStorage, - std::vector AccStorage, - std::vector> SharedPtrStorage, - std::vector Requirements, - std::vector Events, detail::code_location loc = {}) + CommandGroup(CGType Type, std::vector> ArgsStorage, + std::vector AccStorage, + std::vector> SharedPtrStorage, + std::vector Requirements, + std::vector Events, + detail::code_location loc = {}) : MType(Type), MArgsStorage(std::move(ArgsStorage)), MAccStorage(std::move(AccStorage)), MSharedPtrStorage(std::move(SharedPtrStorage)), @@ -188,7 +189,7 @@ class CG { MColumn = loc.columnNumber(); } - CG(CG &&CommandGroup) = default; + CommandGroup(CommandGroup &&CG) = default; CGType getType() { return static_cast(getUnversionedCGType(MType)); } @@ -206,7 +207,7 @@ class CG { return convertToExtendedMembers(MSharedPtrStorage[0]); } - virtual ~CG() = default; + virtual ~CommandGroup() = default; private: CGType MType; @@ -234,7 +235,7 @@ class CG { }; /// "Execute kernel" command group class. -class CGExecKernel : public CG { +class CGExecKernel : public CommandGroup { public: /// Stores ND-range description. NDRDescT MNDRDesc; @@ -256,9 +257,9 @@ class CGExecKernel : public CG { detail::OSModuleHandle OSModuleHandle, std::vector> Streams, CGType Type, detail::code_location loc = {}) - : CG(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MNDRDesc(std::move(NDRDesc)), MHostKernel(std::move(HKernel)), MSyclKernel(std::move(SyclKernel)), MArgs(std::move(Args)), MKernelName(std::move(KernelName)), MOSModuleHandle(OSModuleHandle), @@ -290,7 +291,7 @@ class CGExecKernel : public CG { }; /// "Copy memory" command group class. -class CGCopy : public CG { +class CGCopy : public CommandGroup { void *MSrc; void *MDst; @@ -302,16 +303,16 @@ class CGCopy : public CG { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CG(CopyType, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(CopyType, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MSrc(Src), MDst(Dst) {} void *getSrc() { return MSrc; } void *getDst() { return MDst; } }; /// "Fill memory" command group class. -class CGFill : public CG { +class CGFill : public CommandGroup { public: std::vector MPattern; Requirement *MPtr; @@ -323,15 +324,16 @@ class CGFill : public CG { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CG(CGType::Fill, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(CGType::Fill, std::move(ArgsStorage), + std::move(AccStorage), std::move(SharedPtrStorage), + std::move(Requirements), std::move(Events), + std::move(loc)), MPattern(std::move(Pattern)), MPtr((Requirement *)Ptr) {} Requirement *getReqToFill() { return MPtr; } }; /// "Update host" command group class. -class CGUpdateHost : public CG { +class CGUpdateHost : public CommandGroup { Requirement *MPtr; public: @@ -341,16 +343,17 @@ class CGUpdateHost : public CG { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CG(CGType::UpdateHost, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(CGType::UpdateHost, std::move(ArgsStorage), + std::move(AccStorage), std::move(SharedPtrStorage), + std::move(Requirements), std::move(Events), + std::move(loc)), MPtr((Requirement *)Ptr) {} Requirement *getReqToUpdate() { return MPtr; } }; /// "Copy USM" command group class. -class CGCopyUSM : public CG { +class CGCopyUSM : public CommandGroup { void *MSrc; void *MDst; size_t MLength; @@ -363,9 +366,10 @@ class CGCopyUSM : public CG { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CG(CGType::CopyUSM, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(CGType::CopyUSM, std::move(ArgsStorage), + std::move(AccStorage), std::move(SharedPtrStorage), + std::move(Requirements), std::move(Events), + std::move(loc)), MSrc(Src), MDst(Dst), MLength(Length) {} void *getSrc() { return MSrc; } @@ -374,7 +378,7 @@ class CGCopyUSM : public CG { }; /// "Fill USM" command group class. -class CGFillUSM : public CG { +class CGFillUSM : public CommandGroup { std::vector MPattern; void *MDst; size_t MLength; @@ -387,9 +391,10 @@ class CGFillUSM : public CG { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CG(CGType::FillUSM, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(CGType::FillUSM, std::move(ArgsStorage), + std::move(AccStorage), std::move(SharedPtrStorage), + std::move(Requirements), std::move(Events), + std::move(loc)), MPattern(std::move(Pattern)), MDst(DstPtr), MLength(Length) {} void *getDst() { return MDst; } size_t getLength() { return MLength; } @@ -397,7 +402,7 @@ class CGFillUSM : public CG { }; /// "Prefetch USM" command group class. -class CGPrefetchUSM : public CG { +class CGPrefetchUSM : public CommandGroup { void *MDst; size_t MLength; @@ -409,16 +414,17 @@ class CGPrefetchUSM : public CG { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CG(CGType::PrefetchUSM, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(CGType::PrefetchUSM, std::move(ArgsStorage), + std::move(AccStorage), std::move(SharedPtrStorage), + std::move(Requirements), std::move(Events), + std::move(loc)), MDst(DstPtr), MLength(Length) {} void *getDst() { return MDst; } size_t getLength() { return MLength; } }; /// "Advise USM" command group class. -class CGAdviseUSM : public CG { +class CGAdviseUSM : public CommandGroup { void *MDst; size_t MLength; @@ -430,9 +436,9 @@ class CGAdviseUSM : public CG { std::vector Requirements, std::vector Events, CGType Type, detail::code_location loc = {}) - : CG(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MDst(DstPtr), MLength(Length) {} void *getDst() { return MDst; } size_t getLength() { return MLength; } @@ -448,7 +454,7 @@ class CGAdviseUSM : public CG { } }; -class CGInteropTask : public CG { +class CGInteropTask : public CommandGroup { public: std::unique_ptr MInteropTask; @@ -459,13 +465,13 @@ class CGInteropTask : public CG { std::vector Requirements, std::vector Events, CGType Type, detail::code_location loc = {}) - : CG(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MInteropTask(std::move(InteropTask)) {} }; -class CGHostTask : public CG { +class CGHostTask : public CommandGroup { public: std::unique_ptr MHostTask; // queue for host-interop task @@ -484,14 +490,14 @@ class CGHostTask : public CG { std::vector Requirements, std::vector Events, CGType Type, detail::code_location loc = {}) - : CG(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MHostTask(std::move(HostTask)), MQueue(Queue), MContext(Context), MArgs(std::move(Args)) {} }; -class CGBarrier : public CG { +class CGBarrier : public CommandGroup { public: std::vector MEventsWaitWithBarrier; @@ -502,9 +508,9 @@ class CGBarrier : public CG { std::vector Requirements, std::vector Events, CGType Type, detail::code_location loc = {}) - : CG(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MEventsWaitWithBarrier(std::move(EventsWaitWithBarrier)) {} }; diff --git a/sycl/include/CL/sycl/handler.hpp b/sycl/include/CL/sycl/handler.hpp index 3536b055e6e2a..41f10d532361c 100644 --- a/sycl/include/CL/sycl/handler.hpp +++ b/sycl/include/CL/sycl/handler.hpp @@ -343,18 +343,20 @@ class __SYCL_EXPORT handler { return Storage; } - void setType(detail::CG::CGType Type) { - constexpr detail::CG::CG_VERSION Version = detail::CG::CG_VERSION::V1; - MCGType = static_cast( + void setType(detail::CommandGroup::CGType Type) { + constexpr detail::CommandGroup::CG_VERSION Version = + detail::CommandGroup::CG_VERSION::V1; + MCGType = static_cast( getVersionedCGType(Type, static_cast(Version))); } - detail::CG::CGType getType() { - return static_cast(getUnversionedCGType(MCGType)); + detail::CommandGroup::CGType getType() { + return static_cast( + getUnversionedCGType(MCGType)); } void throwIfActionIsCreated() { - if (detail::CG::None != getType()) + if (detail::CommandGroup::None != getType()) throw sycl::runtime_error("Attempt to set multiple actions for the " "command group. Command group must consist of " "a single kernel or explicit memory operation.", @@ -850,7 +852,7 @@ class __SYCL_EXPORT handler { MNDRDesc.set(std::move(AdjustedRange)); StoreLambda( std::move(Wrapper)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); #endif } else #endif // !__SYCL_DISABLE_PARALLEL_FOR_RANGE_ROUNDING__ && \ @@ -864,7 +866,7 @@ class __SYCL_EXPORT handler { MNDRDesc.set(std::move(NumWorkItems)); StoreLambda( std::move(KernelFunc)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); #endif } } @@ -883,7 +885,7 @@ class __SYCL_EXPORT handler { MKernel = detail::getSyclObjImpl(std::move(Kernel)); detail::checkValueRange(NumWorkItems); MNDRDesc.set(std::move(NumWorkItems)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); extractArgsAndReqs(); MKernelName = getKernelName(); } @@ -1082,7 +1084,7 @@ class __SYCL_EXPORT handler { MHostTask.reset(new detail::HostTask(std::move(Func))); - setType(detail::CG::CodeplayHostTask); + setType(detail::CommandGroup::CodeplayHostTask); } public: @@ -1229,7 +1231,7 @@ class __SYCL_EXPORT handler { MNDRDesc.set(range<1>{1}); StoreLambda(KernelFunc); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); #endif } @@ -1273,7 +1275,7 @@ class __SYCL_EXPORT handler { MArgs = std::move(MAssociatedAccesors); MHostKernel.reset( new detail::HostKernel(std::move(Func))); - setType(detail::CG::RunOnHostIntel); + setType(detail::CommandGroup::RunOnHostIntel); } template @@ -1336,7 +1338,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NumWorkItems, WorkItemOffset); MNDRDesc.set(std::move(NumWorkItems), std::move(WorkItemOffset)); StoreLambda(std::move(KernelFunc)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); #endif } @@ -1367,7 +1369,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(ExecutionRange); MNDRDesc.set(std::move(ExecutionRange)); StoreLambda(std::move(KernelFunc)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); #endif } @@ -1699,7 +1701,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NumWorkGroups); MNDRDesc.setNumWorkGroups(NumWorkGroups); StoreLambda(std::move(KernelFunc)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); #endif // __SYCL_DEVICE_ONLY__ } @@ -1734,7 +1736,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(ExecRange); MNDRDesc.set(std::move(ExecRange)); StoreLambda(std::move(KernelFunc)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); #endif // __SYCL_DEVICE_ONLY__ } @@ -1751,7 +1753,7 @@ class __SYCL_EXPORT handler { // known constant MNDRDesc.set(range<1>{1}); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); extractArgsAndReqs(); MKernelName = getKernelName(); } @@ -1785,7 +1787,7 @@ class __SYCL_EXPORT handler { MKernel = detail::getSyclObjImpl(std::move(Kernel)); detail::checkValueRange(NumWorkItems, WorkItemOffset); MNDRDesc.set(std::move(NumWorkItems), std::move(WorkItemOffset)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); extractArgsAndReqs(); MKernelName = getKernelName(); } @@ -1804,7 +1806,7 @@ class __SYCL_EXPORT handler { MKernel = detail::getSyclObjImpl(std::move(Kernel)); detail::checkValueRange(NDRange); MNDRDesc.set(std::move(NDRange)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); extractArgsAndReqs(); MKernelName = getKernelName(); } @@ -1827,7 +1829,7 @@ class __SYCL_EXPORT handler { // known constant MNDRDesc.set(range<1>{1}); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); if (!MIsHost && !lambdaAndKernelHaveEqualName()) { extractArgsAndReqs(); MKernelName = getKernelName(); @@ -1844,7 +1846,7 @@ class __SYCL_EXPORT handler { template void interop_task(FuncT Func) { MInteropTask.reset(new detail::InteropTask(std::move(Func))); - setType(detail::CG::CodeplayInteropTask); + setType(detail::CommandGroup::CodeplayInteropTask); } /// Defines and invokes a SYCL kernel function for the specified range. @@ -1869,7 +1871,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NumWorkItems); MNDRDesc.set(std::move(NumWorkItems)); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); if (!MIsHost && !lambdaAndKernelHaveEqualName()) { extractArgsAndReqs(); MKernelName = getKernelName(); @@ -1905,7 +1907,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NumWorkItems, WorkItemOffset); MNDRDesc.set(std::move(NumWorkItems), std::move(WorkItemOffset)); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); if (!MIsHost && !lambdaAndKernelHaveEqualName()) { extractArgsAndReqs(); MKernelName = getKernelName(); @@ -1940,7 +1942,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NDRange); MNDRDesc.set(std::move(NDRange)); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); if (!MIsHost && !lambdaAndKernelHaveEqualName()) { extractArgsAndReqs(); MKernelName = getKernelName(); @@ -1980,7 +1982,7 @@ class __SYCL_EXPORT handler { MNDRDesc.setNumWorkGroups(NumWorkGroups); MKernel = detail::getSyclObjImpl(std::move(Kernel)); StoreLambda(std::move(KernelFunc)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); #endif // __SYCL_DEVICE_ONLY__ } @@ -2020,7 +2022,7 @@ class __SYCL_EXPORT handler { MNDRDesc.set(std::move(ExecRange)); MKernel = detail::getSyclObjImpl(std::move(Kernel)); StoreLambda(std::move(KernelFunc)); - setType(detail::CG::Kernel); + setType(detail::CommandGroup::Kernel); #endif // __SYCL_DEVICE_ONLY__ } @@ -2103,7 +2105,7 @@ class __SYCL_EXPORT handler { return; } #endif - setType(detail::CG::CopyAccToPtr); + setType(detail::CommandGroup::CopyAccToPtr); detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Src; detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl(*AccBase); @@ -2142,7 +2144,7 @@ class __SYCL_EXPORT handler { return; } #endif - setType(detail::CG::CopyPtrToAcc); + setType(detail::CommandGroup::CopyPtrToAcc); detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Dst; detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl(*AccBase); @@ -2187,7 +2189,7 @@ class __SYCL_EXPORT handler { "The destination accessor does not fit the copied memory."); if (copyAccToAccHelper(Src, Dst)) return; - setType(detail::CG::CopyAccToAcc); + setType(detail::CommandGroup::CopyAccToAcc); detail::AccessorBaseHost *AccBaseSrc = (detail::AccessorBaseHost *)&Src; detail::AccessorImplPtr AccImplSrc = detail::getSyclObjImpl(*AccBaseSrc); @@ -2217,7 +2219,7 @@ class __SYCL_EXPORT handler { throwIfActionIsCreated(); static_assert(isValidTargetForExplicitOp(AccessTarget), "Invalid accessor target for the update_host method."); - setType(detail::CG::UpdateHost); + setType(detail::CommandGroup::UpdateHost); detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Acc; detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl(*AccBase); @@ -2249,7 +2251,7 @@ class __SYCL_EXPORT handler { "Invalid accessor target for the fill method."); if (!MIsHost && (((Dims == 1) && isConstOrGlobal(AccessTarget)) || isImageOrImageArray(AccessTarget))) { - setType(detail::CG::Fill); + setType(detail::CommandGroup::Fill); detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Dst; detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl(*AccBase); @@ -2294,7 +2296,7 @@ class __SYCL_EXPORT handler { /// complete state. void barrier() { throwIfActionIsCreated(); - setType(detail::CG::Barrier); + setType(detail::CommandGroup::Barrier); } /// Prevents any commands submitted afterward to this queue from executing @@ -2382,7 +2384,7 @@ class __SYCL_EXPORT handler { /// Type of the command group, e.g. kernel, fill. Can also encode version. /// Use getType and setType methods to access this variable unless /// manipulations with version are required - detail::CG::CGType MCGType = detail::CG::None; + detail::CommandGroup::CGType MCGType = detail::CommandGroup::None; /// Pointer to the source host memory or accessor(depending on command type). void *MSrcPtr = nullptr; /// Pointer to the dest host memory or accessor(depends on command type). diff --git a/sycl/source/detail/scheduler/commands.cpp b/sycl/source/detail/scheduler/commands.cpp index 5bdf616c9c33b..74b0655567a9e 100644 --- a/sycl/source/detail/scheduler/commands.cpp +++ b/sycl/source/detail/scheduler/commands.cpp @@ -203,7 +203,8 @@ class DispatchHostTask { void operator()() const { waitForEvents(); - assert(MThisCmd->getCG().getType() == CG::CGType::CodeplayHostTask); + assert(MThisCmd->getCG().getType() == + CommandGroup::CGType::CodeplayHostTask); CGHostTask &HostTask = static_cast(MThisCmd->getCG()); @@ -1217,13 +1218,13 @@ AllocaCommandBase *ExecCGCommand::getAllocaForReq(Requirement *Req) { } std::vector ExecCGCommand::getStreams() const { - if (MCommandGroup->getType() == CG::Kernel) + if (MCommandGroup->getType() == CommandGroup::Kernel) return ((CGExecKernel *)MCommandGroup.get())->getStreams(); return {}; } void ExecCGCommand::clearStreams() { - if (MCommandGroup->getType() == CG::Kernel) + if (MCommandGroup->getType() == CommandGroup::Kernel) ((CGExecKernel *)MCommandGroup.get())->clearStreams(); } @@ -1449,36 +1450,36 @@ void UpdateHostRequirementCommand::emitInstrumentationData() { #endif } -static std::string cgTypeToString(detail::CG::CGType Type) { +static std::string cgTypeToString(detail::CommandGroup::CGType Type) { switch (Type) { - case detail::CG::Kernel: + case detail::CommandGroup::Kernel: return "Kernel"; break; - case detail::CG::UpdateHost: + case detail::CommandGroup::UpdateHost: return "update_host"; break; - case detail::CG::Fill: + case detail::CommandGroup::Fill: return "fill"; break; - case detail::CG::CopyAccToAcc: + case detail::CommandGroup::CopyAccToAcc: return "copy acc to acc"; break; - case detail::CG::CopyAccToPtr: + case detail::CommandGroup::CopyAccToPtr: return "copy acc to ptr"; break; - case detail::CG::CopyPtrToAcc: + case detail::CommandGroup::CopyPtrToAcc: return "copy ptr to acc"; break; - case detail::CG::CopyUSM: + case detail::CommandGroup::CopyUSM: return "copy usm"; break; - case detail::CG::FillUSM: + case detail::CommandGroup::FillUSM: return "fill usm"; break; - case detail::CG::PrefetchUSM: + case detail::CommandGroup::PrefetchUSM: return "prefetch usm"; break; - case detail::CG::CodeplayHostTask: + case detail::CommandGroup::CodeplayHostTask: return "host task"; break; default: @@ -1487,7 +1488,7 @@ static std::string cgTypeToString(detail::CG::CGType Type) { } } -ExecCGCommand::ExecCGCommand(std::unique_ptr CommandGroup, +ExecCGCommand::ExecCGCommand(std::unique_ptr CommandGroup, QueueImplPtr Queue) : Command(CommandType::RUN_CG, std::move(Queue)), MCommandGroup(std::move(CommandGroup)) { @@ -1504,7 +1505,7 @@ void ExecCGCommand::emitInstrumentationData() { bool HasSourceInfo = false; std::string KernelName, FromSource; switch (MCommandGroup->getType()) { - case detail::CG::Kernel: { + case detail::CommandGroup::Kernel: { auto KernelCG = reinterpret_cast(MCommandGroup.get()); @@ -1591,7 +1592,7 @@ void ExecCGCommand::printDot(std::ostream &Stream) const { Stream << "EXEC CG ON " << deviceToString(MQueue->get_device()) << "\\n"; switch (MCommandGroup->getType()) { - case detail::CG::Kernel: { + case detail::CommandGroup::Kernel: { auto KernelCG = reinterpret_cast(MCommandGroup.get()); Stream << "Kernel name: "; @@ -1798,7 +1799,7 @@ void DispatchNativeKernel(void *Blob) { } cl_int ExecCGCommand::enqueueImp() { - if (getCG().getType() != CG::CGType::CodeplayHostTask) + if (getCG().getType() != CommandGroup::CGType::CodeplayHostTask) waitForPreparedHostEvents(); std::vector EventImpls = MPreparedDepsEvents; auto RawEvents = getPiEvents(EventImpls); @@ -1807,11 +1808,11 @@ cl_int ExecCGCommand::enqueueImp() { switch (MCommandGroup->getType()) { - case CG::CGType::UpdateHost: { + case CommandGroup::CGType::UpdateHost: { throw runtime_error("Update host should be handled by the Scheduler.", PI_INVALID_OPERATION); } - case CG::CGType::CopyAccToPtr: { + case CommandGroup::CGType::CopyAccToPtr: { CGCopy *Copy = (CGCopy *)MCommandGroup.get(); Requirement *Req = (Requirement *)Copy->getSrc(); AllocaCommandBase *AllocaCmd = getAllocaForReq(Req); @@ -1826,7 +1827,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CG::CGType::CopyPtrToAcc: { + case CommandGroup::CGType::CopyPtrToAcc: { CGCopy *Copy = (CGCopy *)MCommandGroup.get(); Requirement *Req = (Requirement *)(Copy->getDst()); AllocaCommandBase *AllocaCmd = getAllocaForReq(Req); @@ -1843,7 +1844,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CG::CGType::CopyAccToAcc: { + case CommandGroup::CGType::CopyAccToAcc: { CGCopy *Copy = (CGCopy *)MCommandGroup.get(); Requirement *ReqSrc = (Requirement *)(Copy->getSrc()); Requirement *ReqDst = (Requirement *)(Copy->getDst()); @@ -1860,7 +1861,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CG::CGType::Fill: { + case CommandGroup::CGType::Fill: { CGFill *Fill = (CGFill *)MCommandGroup.get(); Requirement *Req = (Requirement *)(Fill->getReqToFill()); AllocaCommandBase *AllocaCmd = getAllocaForReq(Req); @@ -1873,7 +1874,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CG::CGType::RunOnHostIntel: { + case CommandGroup::CGType::RunOnHostIntel: { CGExecKernel *HostTask = (CGExecKernel *)MCommandGroup.get(); // piEnqueueNativeKernel takes arguments blob which is passes to user @@ -1944,7 +1945,7 @@ cl_int ExecCGCommand::enqueueImp() { "Enqueueing run_on_host_intel task has failed.", Error); } } - case CG::CGType::Kernel: { + case CommandGroup::CGType::Kernel: { CGExecKernel *ExecKernel = (CGExecKernel *)MCommandGroup.get(); NDRDescT &NDRDesc = ExecKernel->MNDRDesc; @@ -2061,21 +2062,21 @@ cl_int ExecCGCommand::enqueueImp() { return PI_SUCCESS; } - case CG::CGType::CopyUSM: { + case CommandGroup::CGType::CopyUSM: { CGCopyUSM *Copy = (CGCopyUSM *)MCommandGroup.get(); MemoryManager::copy_usm(Copy->getSrc(), MQueue, Copy->getLength(), Copy->getDst(), std::move(RawEvents), Event); return CL_SUCCESS; } - case CG::CGType::FillUSM: { + case CommandGroup::CGType::FillUSM: { CGFillUSM *Fill = (CGFillUSM *)MCommandGroup.get(); MemoryManager::fill_usm(Fill->getDst(), MQueue, Fill->getLength(), Fill->getFill(), std::move(RawEvents), Event); return CL_SUCCESS; } - case CG::CGType::PrefetchUSM: { + case CommandGroup::CGType::PrefetchUSM: { CGPrefetchUSM *Prefetch = (CGPrefetchUSM *)MCommandGroup.get(); MemoryManager::prefetch_usm(Prefetch->getDst(), MQueue, Prefetch->getLength(), std::move(RawEvents), @@ -2083,14 +2084,14 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CG::CGType::AdviseUSM: { + case CommandGroup::CGType::AdviseUSM: { CGAdviseUSM *Advise = (CGAdviseUSM *)MCommandGroup.get(); MemoryManager::advise_usm(Advise->getDst(), MQueue, Advise->getLength(), Advise->getAdvice(), std::move(RawEvents), Event); return CL_SUCCESS; } - case CG::CGType::CodeplayInteropTask: { + case CommandGroup::CGType::CodeplayInteropTask: { const detail::plugin &Plugin = MQueue->getPlugin(); CGInteropTask *ExecInterop = (CGInteropTask *)MCommandGroup.get(); // Wait for dependencies to complete before dispatching work on the host @@ -2118,7 +2119,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CG::CGType::CodeplayHostTask: { + case CommandGroup::CGType::CodeplayHostTask: { CGHostTask *HostTask = static_cast(MCommandGroup.get()); for (ArgDesc &Arg : HostTask->MArgs) { @@ -2173,7 +2174,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CG::CGType::Barrier: { + case CommandGroup::CGType::Barrier: { if (MQueue->get_device().is_host()) { // NOP for host device. return PI_SUCCESS; @@ -2184,7 +2185,7 @@ cl_int ExecCGCommand::enqueueImp() { return PI_SUCCESS; } - case CG::CGType::BarrierWaitlist: { + case CommandGroup::CGType::BarrierWaitlist: { CGBarrier *Barrier = static_cast(MCommandGroup.get()); std::vector Events = Barrier->MEventsWaitWithBarrier; if (MQueue->get_device().is_host() || Events.empty()) { @@ -2199,14 +2200,14 @@ cl_int ExecCGCommand::enqueueImp() { return PI_SUCCESS; } - case CG::CGType::None: + case CommandGroup::CGType::None: throw runtime_error("CG type not implemented.", PI_INVALID_OPERATION); } return PI_INVALID_OPERATION; } bool ExecCGCommand::producesPiEvent() const { - return MCommandGroup->getType() != CG::CGType::CodeplayHostTask; + return MCommandGroup->getType() != CommandGroup::CGType::CodeplayHostTask; } } // namespace detail diff --git a/sycl/source/detail/scheduler/commands.hpp b/sycl/source/detail/scheduler/commands.hpp index d976577821ebb..d4e874b32e495 100644 --- a/sycl/source/detail/scheduler/commands.hpp +++ b/sycl/source/detail/scheduler/commands.hpp @@ -502,7 +502,8 @@ class MemCpyCommandHost : public Command { /// operation. class ExecCGCommand : public Command { public: - ExecCGCommand(std::unique_ptr CommandGroup, QueueImplPtr Queue); + ExecCGCommand(std::unique_ptr CommandGroup, + QueueImplPtr Queue); std::vector getStreams() const; @@ -511,7 +512,7 @@ class ExecCGCommand : public Command { void printDot(std::ostream &Stream) const final; void emitInstrumentationData() final; - detail::CG &getCG() const { return *MCommandGroup; } + detail::CommandGroup &getCG() const { return *MCommandGroup; } // MEmptyCmd is only employed if this command refers to host-task. // The mechanism of lookup for single EmptyCommand amongst users of @@ -539,7 +540,7 @@ class ExecCGCommand : public Command { NDRDescT &NDRDesc, std::vector &RawEvents, RT::PiEvent &Event, ProgramManager::KernelArgMask EliminatedArgMask); - std::unique_ptr MCommandGroup; + std::unique_ptr MCommandGroup; friend class Command; }; diff --git a/sycl/source/detail/scheduler/graph_builder.cpp b/sycl/source/detail/scheduler/graph_builder.cpp index 8fc4aa8b936a8..0396da30769c2 100644 --- a/sycl/source/detail/scheduler/graph_builder.cpp +++ b/sycl/source/detail/scheduler/graph_builder.cpp @@ -516,7 +516,7 @@ Scheduler::GraphBuilder::addHostAccessor(Requirement *Req, } Command *Scheduler::GraphBuilder::addCGUpdateHost( - std::unique_ptr CommandGroup, QueueImplPtr HostQueue, + std::unique_ptr CommandGroup, QueueImplPtr HostQueue, std::vector &ToEnqueue) { auto UpdateHost = static_cast(CommandGroup.get()); @@ -849,7 +849,7 @@ Scheduler::GraphBuilder::addEmptyCmd(Command *Cmd, const std::vector &Reqs, } static bool isInteropHostTask(const std::unique_ptr &Cmd) { - if (Cmd->getCG().getType() != CG::CGType::CodeplayHostTask) + if (Cmd->getCG().getType() != CommandGroup::CGType::CodeplayHostTask) return false; const detail::CGHostTask &HT = @@ -878,13 +878,12 @@ static void combineAccessModesOfReqs(std::vector &Reqs) { } } -Command * -Scheduler::GraphBuilder::addCG(std::unique_ptr CommandGroup, - QueueImplPtr Queue, - std::vector &ToEnqueue) { +Command *Scheduler::GraphBuilder::addCG( + std::unique_ptr CommandGroup, QueueImplPtr Queue, + std::vector &ToEnqueue) { std::vector &Reqs = CommandGroup->MRequirements; const std::vector &Events = CommandGroup->MEvents; - const CG::CGType CGType = CommandGroup->getType(); + const CommandGroup::CGType CGType = CommandGroup->getType(); std::unique_ptr NewCmd( new ExecCGCommand(std::move(CommandGroup), Queue)); @@ -978,7 +977,7 @@ Scheduler::GraphBuilder::addCG(std::unique_ptr CommandGroup, ToEnqueue.push_back(ConnCmd); } - if (CGType == CG::CGType::CodeplayHostTask) + if (CGType == CommandGroup::CGType::CodeplayHostTask) NewCmd->MEmptyCmd = addEmptyCmd(NewCmd.get(), NewCmd->getCG().MRequirements, Queue, Command::BlockReason::HostTask, ToEnqueue); @@ -1185,11 +1184,11 @@ Command *Scheduler::GraphBuilder::connectDepEvent(Command *const Cmd, { std::unique_ptr HT(new detail::HostTask); - std::unique_ptr ConnectCG(new detail::CGHostTask( + std::unique_ptr ConnectCG(new detail::CGHostTask( std::move(HT), /* Queue = */ {}, /* Context = */ {}, /* Args = */ {}, /* ArgsStorage = */ {}, /* AccStorage = */ {}, /* SharedPtrStorage = */ {}, /* Requirements = */ {}, - /* DepEvents = */ {DepEvent}, CG::CodeplayHostTask, + /* DepEvents = */ {DepEvent}, CommandGroup::CodeplayHostTask, /* Payload */ {})); ConnectCmd = new ExecCGCommand( std::move(ConnectCG), Scheduler::getInstance().getDefaultHostQueue()); diff --git a/sycl/source/detail/scheduler/scheduler.cpp b/sycl/source/detail/scheduler/scheduler.cpp index e26b068fdc0c6..7424b6cf7cbed 100644 --- a/sycl/source/detail/scheduler/scheduler.cpp +++ b/sycl/source/detail/scheduler/scheduler.cpp @@ -68,12 +68,14 @@ void Scheduler::waitForRecordToFinish(MemObjRecord *Record, } } -EventImplPtr Scheduler::addCG(std::unique_ptr CommandGroup, - QueueImplPtr Queue) { +EventImplPtr +Scheduler::addCG(std::unique_ptr CommandGroup, + QueueImplPtr Queue) { EventImplPtr NewEvent = nullptr; - const bool IsKernel = CommandGroup->getType() == CG::Kernel; + const bool IsKernel = CommandGroup->getType() == CommandGroup::Kernel; std::vector AuxiliaryCmds; - const bool IsHostKernel = CommandGroup->getType() == CG::RunOnHostIntel; + const bool IsHostKernel = + CommandGroup->getType() == CommandGroup::RunOnHostIntel; std::vector Streams; if (IsKernel) { @@ -94,11 +96,11 @@ EventImplPtr Scheduler::addCG(std::unique_ptr CommandGroup, Command *NewCmd = nullptr; switch (CommandGroup->getType()) { - case CG::UpdateHost: + case CommandGroup::UpdateHost: NewCmd = MGraphBuilder.addCGUpdateHost(std::move(CommandGroup), DefaultHostQueue, AuxiliaryCmds); break; - case CG::CodeplayHostTask: + case CommandGroup::CodeplayHostTask: NewCmd = MGraphBuilder.addCG(std::move(CommandGroup), DefaultHostQueue, AuxiliaryCmds); break; diff --git a/sycl/source/detail/scheduler/scheduler.hpp b/sycl/source/detail/scheduler/scheduler.hpp index 30df58c089234..dc89bb8033911 100644 --- a/sycl/source/detail/scheduler/scheduler.hpp +++ b/sycl/source/detail/scheduler/scheduler.hpp @@ -363,7 +363,7 @@ class Scheduler { /// /// \param CommandGroup is a unique_ptr to a command group to be added. /// \return an event object to wait on for command group completion. - EventImplPtr addCG(std::unique_ptr CommandGroup, + EventImplPtr addCG(std::unique_ptr CommandGroup, QueueImplPtr Queue); /// Registers a command group, that copies most recent memory to the memory @@ -479,14 +479,14 @@ class Scheduler { /// \sa queue::submit, Scheduler::addCG /// /// \return a command that represents command group execution. - Command *addCG(std::unique_ptr CommandGroup, QueueImplPtr Queue, - std::vector &ToEnqueue); + Command *addCG(std::unique_ptr CommandGroup, + QueueImplPtr Queue, std::vector &ToEnqueue); /// Registers a \ref CG "command group" that updates host memory to the /// latest state. /// /// \return a command that represents command group execution. - Command *addCGUpdateHost(std::unique_ptr CommandGroup, + Command *addCGUpdateHost(std::unique_ptr CommandGroup, QueueImplPtr HostQueue, std::vector &ToEnqueue); diff --git a/sycl/source/handler.cpp b/sycl/source/handler.cpp index 1ae7238703e4f..b5ad1fdbb2ae4 100644 --- a/sycl/source/handler.cpp +++ b/sycl/source/handler.cpp @@ -106,7 +106,7 @@ event handler::finalize() { // Kernel_bundles could not be used before CGType version 1 if (getCGTypeVersion(MCGType) > - static_cast(detail::CG::CG_VERSION::V0)) { + static_cast(detail::CommandGroup::CG_VERSION::V0)) { // If there were uses of set_specialization_constant build the kernel_bundle std::shared_ptr KernelBundleImpPtr = getOrInsertHandlerKernelBundle(/*Insert=*/false); @@ -131,10 +131,10 @@ event handler::finalize() { } } - std::unique_ptr CommandGroup; + std::unique_ptr CommandGroup; switch (getType()) { - case detail::CG::Kernel: - case detail::CG::RunOnHostIntel: { + case detail::CommandGroup::Kernel: + case detail::CommandGroup::RunOnHostIntel: { CommandGroup.reset(new detail::CGExecKernel( std::move(MNDRDesc), std::move(MHostKernel), std::move(MKernel), std::move(MArgsStorage), std::move(MAccStorage), @@ -144,71 +144,71 @@ event handler::finalize() { MCodeLoc)); break; } - case detail::CG::CodeplayInteropTask: + case detail::CommandGroup::CodeplayInteropTask: CommandGroup.reset(new detail::CGInteropTask( std::move(MInteropTask), std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCGType, MCodeLoc)); break; - case detail::CG::CopyAccToPtr: - case detail::CG::CopyPtrToAcc: - case detail::CG::CopyAccToAcc: + case detail::CommandGroup::CopyAccToPtr: + case detail::CommandGroup::CopyPtrToAcc: + case detail::CommandGroup::CopyAccToAcc: CommandGroup.reset(new detail::CGCopy( MCGType, MSrcPtr, MDstPtr, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CG::Fill: + case detail::CommandGroup::Fill: CommandGroup.reset(new detail::CGFill( std::move(MPattern), MDstPtr, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CG::UpdateHost: + case detail::CommandGroup::UpdateHost: CommandGroup.reset(new detail::CGUpdateHost( MDstPtr, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CG::CopyUSM: + case detail::CommandGroup::CopyUSM: CommandGroup.reset(new detail::CGCopyUSM( MSrcPtr, MDstPtr, MLength, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CG::FillUSM: + case detail::CommandGroup::FillUSM: CommandGroup.reset(new detail::CGFillUSM( std::move(MPattern), MDstPtr, MLength, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CG::PrefetchUSM: + case detail::CommandGroup::PrefetchUSM: CommandGroup.reset(new detail::CGPrefetchUSM( MDstPtr, MLength, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CG::AdviseUSM: + case detail::CommandGroup::AdviseUSM: CommandGroup.reset(new detail::CGAdviseUSM( MDstPtr, MLength, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCGType, MCodeLoc)); break; - case detail::CG::CodeplayHostTask: + case detail::CommandGroup::CodeplayHostTask: CommandGroup.reset(new detail::CGHostTask( std::move(MHostTask), MQueue, MQueue->getContextImplPtr(), std::move(MArgs), std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCGType, MCodeLoc)); break; - case detail::CG::Barrier: - case detail::CG::BarrierWaitlist: + case detail::CommandGroup::Barrier: + case detail::CommandGroup::BarrierWaitlist: CommandGroup.reset(new detail::CGBarrier( std::move(MEventsWaitWithBarrier), std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCGType, MCodeLoc)); break; - case detail::CG::None: + case detail::CommandGroup::None: if (detail::pi::trace(detail::pi::TraceLevel::PI_TRACE_ALL)) { std::cout << "WARNING: An empty command group is submitted." << std::endl; } @@ -476,7 +476,7 @@ std::string handler::getKernelName() { void handler::barrier(const std::vector &WaitList) { throwIfActionIsCreated(); - MCGType = detail::CG::BarrierWaitlist; + MCGType = detail::CommandGroup::BarrierWaitlist; MEventsWaitWithBarrier.resize(WaitList.size()); std::transform( WaitList.begin(), WaitList.end(), MEventsWaitWithBarrier.begin(), @@ -488,7 +488,7 @@ void handler::memcpy(void *Dest, const void *Src, size_t Count) { MSrcPtr = const_cast(Src); MDstPtr = Dest; MLength = Count; - setType(detail::CG::CopyUSM); + setType(detail::CommandGroup::CopyUSM); } void handler::memset(void *Dest, int Value, size_t Count) { @@ -496,21 +496,21 @@ void handler::memset(void *Dest, int Value, size_t Count) { MDstPtr = Dest; MPattern.push_back(static_cast(Value)); MLength = Count; - setType(detail::CG::FillUSM); + setType(detail::CommandGroup::FillUSM); } void handler::prefetch(const void *Ptr, size_t Count) { throwIfActionIsCreated(); MDstPtr = const_cast(Ptr); MLength = Count; - setType(detail::CG::PrefetchUSM); + setType(detail::CommandGroup::PrefetchUSM); } void handler::mem_advise(const void *Ptr, size_t Count, int Advice) { throwIfActionIsCreated(); MDstPtr = const_cast(Ptr); MLength = Count; - setType(detail::CG::AdviseUSM); + setType(detail::CommandGroup::AdviseUSM); assert(!MSharedPtrStorage.empty()); diff --git a/sycl/test/abi/layout_handler.cpp b/sycl/test/abi/layout_handler.cpp index 278884f86fc92..4b74095dcc765 100644 --- a/sycl/test/abi/layout_handler.cpp +++ b/sycl/test/abi/layout_handler.cpp @@ -116,7 +116,7 @@ void foo() { // CHECK-NEXT: 344 | std::__shared_ptr::element_type * _M_ptr // CHECK-NEXT: 352 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount // CHECK-NEXT: 352 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi -// CHECK-NEXT: 360 | detail::class CG::CGType MCGType +// CHECK-NEXT: 360 | detail::class CommandGroup::CGType MCGType // CHECK-NEXT: 368 | void * MSrcPtr // CHECK-NEXT: 376 | void * MDstPtr // CHECK-NEXT: 384 | size_t MLength diff --git a/sycl/test/abi/vtable.cpp b/sycl/test/abi/vtable.cpp index 44aa731cf5823..ac2460c6fdf4d 100644 --- a/sycl/test/abi/vtable.cpp +++ b/sycl/test/abi/vtable.cpp @@ -49,13 +49,13 @@ void foo(sycl::detail::pi::DeviceBinaryImage &Img) { Img.print(); } // CHECK-NEXT: 4 | sycl::detail::pi::DeviceBinaryImage::~DeviceBinaryImage() [complete] // CHECK-NEXT: 5 | sycl::detail::pi::DeviceBinaryImage::~DeviceBinaryImage() [deleting] -void foo(sycl::detail::CG *CG) { delete CG; } -// CHECK: Vtable for 'sycl::detail::CG' (4 entries). +void foo(sycl::detail::CommandGroup *CG) { delete CG; } +// CHECK: Vtable for 'sycl::detail::CommandGroup' (4 entries). // CHECK-NEXT: 0 | offset_to_top (0) -// CHECK-NEXT: 1 | sycl::detail::CG RTTI -// CHECK-NEXT: -- (sycl::detail::CG, 0) vtable address -- -// CHECK-NEXT: 2 | sycl::detail::CG::~CG() [complete] -// CHECK-NEXT: 3 | sycl::detail::CG::~CG() [deleting] +// CHECK-NEXT: 1 | sycl::detail::CommandGroup RTTI +// CHECK-NEXT: -- (sycl::detail::CommandGroup, 0) vtable address -- +// CHECK-NEXT: 2 | sycl::detail::CommandGroup::~CommandGroup() [complete] +// CHECK-NEXT: 3 | sycl::detail::CommandGroup::~CommandGroup() [deleting] void foo(sycl::detail::PropertyWithDataBase *Prop) { delete Prop; } // CHECK: Vtable for 'sycl::detail::PropertyWithDataBase' (4 entries). diff --git a/sycl/test/regression/check_simple_name_collisions.cpp b/sycl/test/regression/check_simple_name_collisions.cpp index 0db83613a47e8..fbc0d7655fa9d 100644 --- a/sycl/test/regression/check_simple_name_collisions.cpp +++ b/sycl/test/regression/check_simple_name_collisions.cpp @@ -20,6 +20,7 @@ #define BUFFER #define IMAGE #define UNDEFINED +#define CG #include diff --git a/sycl/unittests/scheduler/SchedulerTestUtils.hpp b/sycl/unittests/scheduler/SchedulerTestUtils.hpp index e918951108488..28ed925fbdfbb 100644 --- a/sycl/unittests/scheduler/SchedulerTestUtils.hpp +++ b/sycl/unittests/scheduler/SchedulerTestUtils.hpp @@ -146,7 +146,7 @@ class MockScheduler : public cl::sycl::detail::Scheduler { } cl::sycl::detail::Command * - addCG(std::unique_ptr CommandGroup, + addCG(std::unique_ptr CommandGroup, cl::sycl::detail::QueueImplPtr Queue, std::vector &ToEnqueue) { return MGraphBuilder.addCG(std::move(CommandGroup), Queue, ToEnqueue); diff --git a/sycl/unittests/scheduler/StreamInitDependencyOnHost.cpp b/sycl/unittests/scheduler/StreamInitDependencyOnHost.cpp index ae4820944170f..156589b3899f9 100644 --- a/sycl/unittests/scheduler/StreamInitDependencyOnHost.cpp +++ b/sycl/unittests/scheduler/StreamInitDependencyOnHost.cpp @@ -18,7 +18,7 @@ class MockHandler : public sycl::handler { MockHandler(shared_ptr_class Queue, bool IsHost) : sycl::handler(Queue, IsHost) {} - void setType(detail::CG::CGType Type) { + void setType(detail::CommandGroup::CGType Type) { static_cast(this)->MCGType = Type; } @@ -38,12 +38,12 @@ class MockHandler : public sycl::handler { sycl::handler::addStream(Stream); } - unique_ptr_class finalize() { + unique_ptr_class finalize() { auto CGH = static_cast(this); - unique_ptr_class CommandGroup; + unique_ptr_class CommandGroup; switch (CGH->MCGType) { - case detail::CG::Kernel: - case detail::CG::RunOnHostIntel: { + case detail::CommandGroup::Kernel: + case detail::CommandGroup::RunOnHostIntel: { CommandGroup.reset(new detail::CGExecKernel( std::move(CGH->MNDRDesc), std::move(CGH->MHostKernel), std::move(CGH->MKernel), std::move(CGH->MArgsStorage), @@ -97,7 +97,7 @@ TEST_F(SchedulerTest, StreamInitDependencyOnHost) { // Emulating processing of command group function MockHandler MockCGH(HQueueImpl, true); - MockCGH.setType(detail::CG::Kernel); + MockCGH.setType(detail::CommandGroup::Kernel); auto EmptyKernel = [](sycl::nd_item<1>) {}; MockCGH @@ -118,7 +118,7 @@ TEST_F(SchedulerTest, StreamInitDependencyOnHost) { ASSERT_TRUE(!!FlushBufMemObjPtr) << "Memory object for stream flush buffer not initialized"; - unique_ptr_class MainCG = MockCGH.finalize(); + unique_ptr_class MainCG = MockCGH.finalize(); // Emulate call of Scheduler::addCG vector_class Streams = From 23ff551e04be1446c080201f7a15721c0abf5298 Mon Sep 17 00:00:00 2001 From: Alexander Batashev Date: Fri, 30 Jul 2021 21:22:06 +0300 Subject: [PATCH 32/82] [SYCL] Fix true missing on Windows (#4211) Switch to `echo` instead of Unix-specific `true` --- sycl/test/on-device/lit.cfg.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sycl/test/on-device/lit.cfg.py b/sycl/test/on-device/lit.cfg.py index f42d713ea57eb..ada28d7c51728 100644 --- a/sycl/test/on-device/lit.cfg.py +++ b/sycl/test/on-device/lit.cfg.py @@ -191,8 +191,8 @@ def getDeviceCount(device_type): found_at_least_one_device = False -cpu_run_substitute = "true" -cpu_run_on_linux_substitute = "true " +cpu_run_substitute = "echo " +cpu_run_on_linux_substitute = "echo " cpu_check_substitute = "" cpu_check_on_linux_substitute = "" @@ -213,8 +213,8 @@ def getDeviceCount(device_type): config.substitutions.append( ('%CPU_CHECK_PLACEHOLDER', cpu_check_substitute) ) config.substitutions.append( ('%CPU_CHECK_ON_LINUX_PLACEHOLDER', cpu_check_on_linux_substitute) ) -gpu_run_substitute = "true" -gpu_run_on_linux_substitute = "true " +gpu_run_substitute = "echo " +gpu_run_on_linux_substitute = "echo " gpu_check_substitute = "" gpu_check_on_linux_substitute = "" @@ -244,7 +244,7 @@ def getDeviceCount(device_type): config.substitutions.append( ('%GPU_CHECK_PLACEHOLDER', gpu_check_substitute) ) config.substitutions.append( ('%GPU_CHECK_ON_LINUX_PLACEHOLDER', gpu_check_on_linux_substitute) ) -acc_run_substitute = "true" +acc_run_substitute = "echo " acc_check_substitute = "" if getDeviceCount("accelerator")[0]: found_at_least_one_device = True From c1b1a74d58a7fae6ec32c32cc03ee932d1dd246f Mon Sep 17 00:00:00 2001 From: Nicolas Miller Date: Sun, 1 Aug 2021 10:46:25 +0100 Subject: [PATCH 33/82] [SYCL][LIBCLC] Add sqrt for doubles for amdgcn-amdhsa (#4223) --- libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl b/libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl index fafa64c82059c..d499e1de2a90a 100644 --- a/libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl +++ b/libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl @@ -12,3 +12,8 @@ _CLC_OVERLOAD _CLC_DECL _CLC_CONSTFN __clc_fp32_t __spirv_ocl_sqrt(__clc_fp32_t In) { return __builtin_amdgcn_sqrtf(In); } + +_CLC_OVERLOAD _CLC_DECL _CLC_CONSTFN __clc_fp64_t +__spirv_ocl_sqrt(__clc_fp64_t In) { + return __builtin_amdgcn_sqrt(In); +} From 96f7cb562e682401822b23ea2c744dfa95dbc06f Mon Sep 17 00:00:00 2001 From: mdtoguchi Date: Sun, 1 Aug 2021 02:47:04 -0700 Subject: [PATCH 34/82] [Driver][SYCL] Enable adding of default device triple (#4175) Add the default device triple (spir64) when we encounter any incoming objects or libraries that have been previously built with the spir64 target. The use of -fno-sycl-link-spirv has been added to disable this behavior. --- clang/include/clang/Driver/Driver.h | 19 +++++ clang/include/clang/Driver/Options.td | 3 + clang/lib/Driver/Driver.cpp | 85 +++++++++++++++++-- clang/lib/Driver/ToolChains/Clang.cpp | 8 +- clang/lib/Driver/ToolChains/SYCL.cpp | 41 ++++++--- clang/lib/Driver/ToolChains/SYCL.h | 10 ++- clang/test/Driver/sycl-intelfpga-aoco-win.cpp | 2 +- clang/test/Driver/sycl-intelfpga-aoco.cpp | 4 +- clang/test/Driver/sycl-offload-intelfpga.cpp | 1 - clang/test/Driver/sycl-offload.cpp | 52 ++++++++++++ 10 files changed, 198 insertions(+), 27 deletions(-) diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index cc43503558be0..8a099a51df628 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -655,6 +655,21 @@ class Driver { FPGAEmulationMode = IsEmulation; } + /// The inclusion of the default SYCL device triple is dependent on either + /// the discovery of an existing object/archive that contains the device code + /// or if a user explicitly turns this on with -fsycl-add-spirv. + /// We need to keep track of this so any use of any generic target option + /// setting is only applied to the user specified triples. + bool SYCLDefaultTripleImplied = false; + void setSYCLDefaultTriple(bool IsDefaultImplied) { + SYCLDefaultTripleImplied = IsDefaultImplied; + } + + /// Returns true if an offload binary is found that contains the default + /// triple for SYCL (spir64) + bool checkForSYCLDefaultDevice(Compilation &C, + llvm::opt::DerivedArgList &Args) const; + /// Returns true if an offload static library is found. bool checkForOffloadStaticLib(Compilation &C, llvm::opt::DerivedArgList &Args) const; @@ -714,6 +729,10 @@ class Driver { /// FPGA Emulation. This is only used for SYCL offloading to FPGA device. bool isFPGAEmulationMode() const { return FPGAEmulationMode; }; + /// isSYCLDefaultTripleImplied - The default SYCL triple (spir64) has been + /// added or should be added given proper criteria. + bool isSYCLDefaultTripleImplied() const { return SYCLDefaultTripleImplied; }; + /// addIntegrationFiles - Add the integration files that will be populated /// by the device compilation and used by the host compile. void addIntegrationFiles(StringRef IntHeaderName, StringRef IntFooterName, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 0146787363c32..4d91d9c0061d0 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2644,6 +2644,9 @@ def fno_sycl_use_footer : Flag<["-"], "fno-sycl-use-footer">, Flags<[CoreOption] def fsycl_footer_path_EQ : Joined<["-"], "fsycl-footer-path=">, Flags<[CoreOption]>, HelpText<"Specify the location of the temporary " "source file with the included integration footer.">; +def fno_sycl_link_spirv : Flag<["-"], "fno-sycl-link-spirv">, + Flags<[CoreOption]>, HelpText<"Disable adding of the default (spir64) triple " + "when discovered in user specified objects and archives.">; def fsyntax_only : Flag<["-"], "fsyntax-only">, Flags<[NoXarchOption,CoreOption,CC1Option,FC1Option]>, Group; def ftabstop_EQ : Joined<["-"], "ftabstop=">, Group; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 0d90bf7902e7b..18871089dfcd1 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -718,6 +718,23 @@ static bool isValidSYCLTriple(llvm::Triple T) { return true; } +static void addSYCLDefaultTriple(Compilation &C, + SmallVectorImpl &SYCLTriples) { + if (!C.getDriver().isSYCLDefaultTripleImplied()) + return; + for (const auto &SYCLTriple : SYCLTriples) { + if (SYCLTriple.getSubArch() == llvm::Triple::NoSubArch && + SYCLTriple.isSPIR()) + return; + // If we encounter a known non-spir* target, do not add the default triple. + if (SYCLTriple.isNVPTX() || SYCLTriple.isAMDGCN()) + return; + } + // Add the default triple as it was not found. + llvm::Triple DefaultTriple = C.getDriver().MakeSYCLDeviceTriple("spir64"); + SYCLTriples.insert(SYCLTriples.begin(), DefaultTriple); +} + void Driver::CreateOffloadingDeviceToolChains(Compilation &C, InputList &Inputs) { @@ -929,6 +946,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, FoundNormalizedTriples[NormalizedName] = Val; UniqueSYCLTriplesVec.push_back(TT); } + addSYCLDefaultTriple(C, UniqueSYCLTriplesVec); } else Diag(clang::diag::warn_drv_empty_joined_argument) << SYCLTargetsValues->getAsString(C.getInputArgs()); @@ -987,8 +1005,10 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, else if (HasValidSYCLRuntime) // Triple for -fintelfpga is spir64_fpga-unknown-unknown-sycldevice. SYCLTargetArch = SYCLfpga ? "spir64_fpga" : "spir64"; - if (!SYCLTargetArch.empty()) + if (!SYCLTargetArch.empty()) { UniqueSYCLTriplesVec.push_back(MakeSYCLDeviceTriple(SYCLTargetArch)); + addSYCLDefaultTriple(C, UniqueSYCLTriplesVec); + } } // We'll need to use the SYCL and host triples as the key into // getOffloadingDeviceToolChain, because the device toolchains we're @@ -1418,6 +1438,11 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { if (checkForOffloadStaticLib(*C, *TranslatedArgs)) setOffloadStaticLibSeen(); + // Check for any objects/archives that need to be compiled with the default + // triple. + if (checkForSYCLDefaultDevice(*C, *TranslatedArgs)) + setSYCLDefaultTriple(true); + // Populate the tool chains for the offloading devices, if any. CreateOffloadingDeviceToolChains(*C, Inputs); @@ -1428,7 +1453,8 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { const ToolChain *TC = SYCLTCRange.first->second; const toolchains::SYCLToolChain *SYCLTC = static_cast(TC); - SYCLTC->TranslateBackendTargetArgs(*TranslatedArgs, TargetArgs); + SYCLTC->TranslateBackendTargetArgs(SYCLTC->getTriple(), *TranslatedArgs, + TargetArgs); for (StringRef ArgString : TargetArgs) { if (ArgString.equals("-hardware") || ArgString.equals("-simulation")) { setFPGAEmulationMode(false); @@ -2762,6 +2788,30 @@ bool hasFPGABinary(Compilation &C, std::string Object, types::ID Type) { return runBundler(BundlerArgs, C); } +static bool hasSYCLDefaultSection(Compilation &C, const StringRef &File) { + // Do not do the check if the file doesn't exist + if (!llvm::sys::fs::exists(File)) + return false; + + bool IsArchive = isStaticArchiveFile(File); + if (!(IsArchive || isObjectFile(File.str()))) + return false; + + llvm::Triple TT(C.getDriver().MakeSYCLDeviceTriple("spir64")); + // Checking uses -check-section option with the input file, no output + // file and the target triple being looked for. + const char *Targets = + C.getArgs().MakeArgString(Twine("-targets=sycl-") + TT.str()); + const char *Inputs = + C.getArgs().MakeArgString(Twine("-inputs=") + File.str()); + // Always use -type=ao for bundle checking. The 'bundles' are + // actually archives. + SmallVector BundlerArgs = {"clang-offload-bundler", + IsArchive ? "-type=ao" : "-type=o", + Targets, Inputs, "-check-section"}; + return runBundler(BundlerArgs, C); +} + static bool hasOffloadSections(Compilation &C, const StringRef &Archive, DerivedArgList &Args) { // Do not do the check if the file doesn't exist @@ -2792,14 +2842,15 @@ static bool optionMatches(const std::string &Option, // Process linker inputs for use with offload static libraries. We are only // handling options and explicitly named static archives as these need to be // partially linked. -static SmallVector getLinkerArgs(Compilation &C, - DerivedArgList &Args) { +static SmallVector +getLinkerArgs(Compilation &C, DerivedArgList &Args, bool IncludeObj = false) { SmallVector LibArgs; for (const auto *A : Args) { std::string FileName = A->getAsString(Args); if (A->getOption().getKind() == Option::InputClass) { StringRef Value(A->getValue()); - if (isStaticArchiveFile(Value)) { + if (isStaticArchiveFile(Value) || + (IncludeObj && isObjectFile(Value.str()))) { LibArgs.push_back(Args.MakeArgString(FileName)); continue; } @@ -2818,7 +2869,7 @@ static SmallVector getLinkerArgs(Compilation &C, // Only add named static libs objects and --whole-archive options. if (optionMatches("-whole-archive", V.str()) || optionMatches("-no-whole-archive", V.str()) || - isStaticArchiveFile(V)) { + isStaticArchiveFile(V) || (IncludeObj && isObjectFile(V.str()))) { LibArgs.push_back(Args.MakeArgString(V)); return; } @@ -2884,6 +2935,26 @@ static bool IsSYCLDeviceLibObj(std::string ObjFilePath, bool isMSVCEnv) { return Ret; } +// Goes through all of the arguments, including inputs expected for the +// linker directly, to determine if we need to potentially add the SYCL +// default triple. +bool Driver::checkForSYCLDefaultDevice(Compilation &C, + DerivedArgList &Args) const { + // Check only if enabled with -fsycl + if (!Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) + return false; + + if (Args.hasArg(options::OPT_fno_sycl_link_spirv)) + return false; + + SmallVector AllArgs(getLinkerArgs(C, Args, true)); + for (StringRef Arg : AllArgs) { + if (hasSYCLDefaultSection(C, Arg)) + return true; + } + return false; +} + // Goes through all of the arguments, including inputs expected for the // linker directly, to determine if we need to perform additional work for // static offload libraries. @@ -4657,6 +4728,7 @@ class OffloadingActionBuilder final { if (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga) SYCLfpgaTriple = true; } + addSYCLDefaultTriple(C, SYCLTripleList); } if (SYCLAddTargets) { for (StringRef Val : SYCLAddTargets->getValues()) { @@ -4679,6 +4751,7 @@ class OffloadingActionBuilder final { const char *SYCLTargetArch = SYCLfpga ? "spir64_fpga" : "spir64"; SYCLTripleList.push_back( C.getDriver().MakeSYCLDeviceTriple(SYCLTargetArch)); + addSYCLDefaultTriple(C, SYCLTripleList); if (SYCLfpga) SYCLfpgaTriple = true; } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 2eb49d68c0ee1..7709b491a73dd 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8274,6 +8274,8 @@ void OffloadBundler::ConstructJobMultipleOutputs( if (getToolChain().getTriple().getSubArch() == llvm::Triple::SPIRSubArch_fpga && Dep.DependentOffloadKind == Action::OFK_SYCL) { + if (J++) + Triples += ','; llvm::Triple TT; TT.setArchName(types::getTypeName(InputType)); TT.setVendorName("intel"); @@ -8284,6 +8286,8 @@ void OffloadBundler::ConstructJobMultipleOutputs( } else if (getToolChain().getTriple().getSubArch() != llvm::Triple::SPIRSubArch_fpga && Dep.DependentOffloadKind == Action::OFK_Host) { + if (J++) + Triples += ','; Triples += Action::GetOffloadKindName(Dep.DependentOffloadKind); Triples += '-'; Triples += Dep.DependentToolChain->getTriple().normalize(); @@ -8443,10 +8447,10 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA, // Only store compile/link opts in the image descriptor for the SPIR-V // target; AOT compilation has already been performed otherwise. TC.AddImpliedTargetArgs(TT, TCArgs, BuildArgs); - TC.TranslateBackendTargetArgs(TCArgs, BuildArgs); + TC.TranslateBackendTargetArgs(TT, TCArgs, BuildArgs); createArgString("-compile-opts="); BuildArgs.clear(); - TC.TranslateLinkerTargetArgs(TCArgs, BuildArgs); + TC.TranslateLinkerTargetArgs(TT, TCArgs, BuildArgs); createArgString("-link-opts="); } diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 4bbf9b8f7b649..1efbd80023448 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -387,8 +387,8 @@ void SYCL::fpga::BackendCompiler::constructOpenCLAOTCommand( llvm::Triple CPUTriple("spir64_x86_64"); TC.AddImpliedTargetArgs(CPUTriple, Args, CmdArgs); // Add the target args passed in - TC.TranslateBackendTargetArgs(Args, CmdArgs); - TC.TranslateLinkerTargetArgs(Args, CmdArgs); + TC.TranslateBackendTargetArgs(CPUTriple, Args, CmdArgs); + TC.TranslateLinkerTargetArgs(CPUTriple, Args, CmdArgs); SmallString<128> ExecPath( getToolChain().GetProgramPath(makeExeName(C, "opencl-aot"))); @@ -414,7 +414,7 @@ void SYCL::fpga::BackendCompiler::ConstructJob( const toolchains::SYCLToolChain &TC = static_cast(getToolChain()); ArgStringList TargetArgs; - TC.TranslateBackendTargetArgs(Args, TargetArgs); + TC.TranslateBackendTargetArgs(TC.getTriple(), Args, TargetArgs); // When performing emulation compilations for FPGA AOT, we want to use // opencl-aot instead of aoc. @@ -534,8 +534,8 @@ void SYCL::fpga::BackendCompiler::ConstructJob( TC.AddImpliedTargetArgs(getToolChain().getTriple(), Args, CmdArgs); // Add -Xsycl-target* options. - TC.TranslateBackendTargetArgs(Args, CmdArgs); - TC.TranslateLinkerTargetArgs(Args, CmdArgs); + TC.TranslateBackendTargetArgs(getToolChain().getTriple(), Args, CmdArgs); + TC.TranslateLinkerTargetArgs(getToolChain().getTriple(), Args, CmdArgs); // Look for -reuse-exe=XX option if (Arg *A = Args.getLastArg(options::OPT_reuse_exe_EQ)) { @@ -581,8 +581,8 @@ void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C, const toolchains::SYCLToolChain &TC = static_cast(getToolChain()); TC.AddImpliedTargetArgs(getToolChain().getTriple(), Args, CmdArgs); - TC.TranslateBackendTargetArgs(Args, CmdArgs); - TC.TranslateLinkerTargetArgs(Args, CmdArgs); + TC.TranslateBackendTargetArgs(getToolChain().getTriple(), Args, CmdArgs); + TC.TranslateLinkerTargetArgs(getToolChain().getTriple(), Args, CmdArgs); SmallString<128> ExecPath( getToolChain().GetProgramPath(makeExeName(C, "ocloc"))); const char *Exec = C.getArgs().MakeArgString(ExecPath); @@ -614,8 +614,8 @@ void SYCL::x86_64::BackendCompiler::ConstructJob( static_cast(getToolChain()); TC.AddImpliedTargetArgs(getToolChain().getTriple(), Args, CmdArgs); - TC.TranslateBackendTargetArgs(Args, CmdArgs); - TC.TranslateLinkerTargetArgs(Args, CmdArgs); + TC.TranslateBackendTargetArgs(getToolChain().getTriple(), Args, CmdArgs); + TC.TranslateLinkerTargetArgs(getToolChain().getTriple(), Args, CmdArgs); SmallString<128> ExecPath( getToolChain().GetProgramPath(makeExeName(C, "opencl-aot"))); const char *Exec = C.getArgs().MakeArgString(ExecPath); @@ -765,7 +765,8 @@ void SYCLToolChain::AddImpliedTargetArgs( } void SYCLToolChain::TranslateBackendTargetArgs( - const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const { + const llvm::Triple &Triple, const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const { // Handle -Xs flags. for (auto *A : Args) { // When parsing the target args, the -Xs type option applies to all @@ -775,6 +776,15 @@ void SYCLToolChain::TranslateBackendTargetArgs( // -Xs "-DFOO -DBAR" // -XsDFOO -XsDBAR // All of the above examples will pass -DFOO -DBAR to the backend compiler. + + // Do not add the -Xs to the default SYCL triple (spir64) when we know we + // have implied the setting. + if ((A->getOption().matches(options::OPT_Xs) || + A->getOption().matches(options::OPT_Xs_separate)) && + Triple.getSubArch() == llvm::Triple::NoSubArch && Triple.isSPIR() && + getDriver().isSYCLDefaultTripleImplied()) + continue; + if (A->getOption().matches(options::OPT_Xs)) { // Take the arg and create an option out of it. CmdArgs.push_back(Args.MakeArgString(Twine("-") + A->getValue())); @@ -788,13 +798,22 @@ void SYCLToolChain::TranslateBackendTargetArgs( continue; } } + // Do not process -Xsycl-target-backend for implied spir64 + if (Triple.getSubArch() == llvm::Triple::NoSubArch && Triple.isSPIR() && + getDriver().isSYCLDefaultTripleImplied()) + return; // Handle -Xsycl-target-backend. TranslateTargetOpt(Args, CmdArgs, options::OPT_Xsycl_backend, options::OPT_Xsycl_backend_EQ); } void SYCLToolChain::TranslateLinkerTargetArgs( - const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const { + const llvm::Triple &Triple, const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const { + // Do not process -Xsycl-target-linker for implied spir64 + if (Triple.getSubArch() == llvm::Triple::NoSubArch && Triple.isSPIR() && + getDriver().isSYCLDefaultTripleImplied()) + return; // Handle -Xsycl-target-linker. TranslateTargetOpt(Args, CmdArgs, options::OPT_Xsycl_linker, options::OPT_Xsycl_linker_EQ); diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index e6c1ab2ed3966..e767ede212b9b 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -151,10 +151,12 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { void AddImpliedTargetArgs(const llvm::Triple &Triple, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; - void TranslateBackendTargetArgs(const llvm::opt::ArgList &Args, - llvm::opt::ArgStringList &CmdArgs) const; - void TranslateLinkerTargetArgs(const llvm::opt::ArgList &Args, - llvm::opt::ArgStringList &CmdArgs) const; + void TranslateBackendTargetArgs(const llvm::Triple &Triple, + const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; + void TranslateLinkerTargetArgs(const llvm::Triple &Triple, + const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; bool useIntegratedAs() const override { return true; } bool isPICDefault() const override { return false; } diff --git a/clang/test/Driver/sycl-intelfpga-aoco-win.cpp b/clang/test/Driver/sycl-intelfpga-aoco-win.cpp index c96b8f2ff9028..3cc1587ebf54c 100755 --- a/clang/test/Driver/sycl-intelfpga-aoco-win.cpp +++ b/clang/test/Driver/sycl-intelfpga-aoco-win.cpp @@ -3,7 +3,7 @@ // RUN: echo "void foo() {}" > %t.c // RUN: echo "void foo2() {}" > %t2.c // RUN: %clang -target x86_64-pc-windows-msvc -c -o %t.o %t.c -// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -c -o %t2.o %t2.c +// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fintelfpga -c -o %t2.o %t2.c // RUN: clang-offload-wrapper -o %t-aoco.bc -host=x86_64-pc-windows-msvc -kind=sycl -target=fpga_aoco-intel-unknown-sycldevice %t.aoco // RUN: llc -filetype=obj -o %t-aoco.o %t-aoco.bc // RUN: llvm-ar crv %t_aoco.a %t.o %t2.o %t-aoco.o diff --git a/clang/test/Driver/sycl-intelfpga-aoco.cpp b/clang/test/Driver/sycl-intelfpga-aoco.cpp index 2ba6edfbe2700..cf9160bd57968 100755 --- a/clang/test/Driver/sycl-intelfpga-aoco.cpp +++ b/clang/test/Driver/sycl-intelfpga-aoco.cpp @@ -5,8 +5,8 @@ // RUN: echo "void foo() {}" > %t.c // RUN: echo "void foo2() {}" > %t2.c // RUN: %clang -c -o %t.o %t.c -// RUN: %clang -fsycl -c -o %t2.o %t2.c -// RUN: %clang_cl -fsycl -c -o %t2_cl.o %t2.c +// RUN: %clang -fsycl -fintelfpga -c -o %t2.o %t2.c +// RUN: %clang_cl -fsycl -fintelfpga -c -o %t2_cl.o %t2.c // RUN: clang-offload-wrapper -o %t-aoco.bc -host=x86_64-unknown-linux-gnu -kind=sycl -target=fpga_aoco-intel-unknown-sycldevice %t.aoco // RUN: llc -filetype=obj -o %t-aoco.o %t-aoco.bc // RUN: clang-offload-wrapper -o %t-aoco_cl.bc -host=x86_64-unknown-linux-gnu -kind=sycl -target=fpga_aoco-intel-unknown-sycldevice %t.aoco diff --git a/clang/test/Driver/sycl-offload-intelfpga.cpp b/clang/test/Driver/sycl-offload-intelfpga.cpp index 0b3f3caf418b4..a9779d59934d3 100644 --- a/clang/test/Driver/sycl-offload-intelfpga.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga.cpp @@ -46,7 +46,6 @@ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK,CHK-FPGA-IMAGE %s // RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fsycl-link=image -Xshardware %t.o -o libfoo.a 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK,CHK-FPGA-IMAGE %s -// CHK-FPGA-LINK-NOT: clang-offload-bundler{{.*}} "-check-section" // CHK-FPGA-LINK: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown-sycldevice" "-inputs=[[INPUT:.+\.o]]" "-outputs=[[OUTPUT1:.+\.o]]" "-unbundle" // CHK-FPGA-LINK-NOT: clang-offload-bundler{{.*}} // CHK-FPGA-LINK: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" diff --git a/clang/test/Driver/sycl-offload.cpp b/clang/test/Driver/sycl-offload.cpp index b0ec06346bb6c..1208f4214104c 100644 --- a/clang/test/Driver/sycl-offload.cpp +++ b/clang/test/Driver/sycl-offload.cpp @@ -47,3 +47,55 @@ // CHECK_S_LLVM: clang{{.*}} "-fsycl-is-device"{{.*}} "-emit-llvm"{{.*}} "-o" "[[DEVICE:.+\.ll]]" // CHECK_S_LLVM: clang{{.*}} "-fsycl-is-host"{{.*}} "-emit-llvm"{{.*}} "-o" "[[HOST:.+\.ll]]" // CHECK_S_LLVM: clang-offload-bundler{{.*}} "-type=ll"{{.*}} "-inputs=[[DEVICE]],[[HOST]]" + +/// Check for default device triple compilations based on object, archive or +/// forced from command line. +// RUN: echo "void foo();" > %t_dummy.cpp +// RUN: %clang -fsycl -c %t_dummy.cpp -o %t_dummy.o +// RUN: llvm-ar cr %t_dummy.a %t_dummy.o +// RUN: touch %t_empty.o +// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_x86_64 %t_dummy.o %s 2>&1 \ +// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_OBJ %s +// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_fpga %t_dummy.o %s 2>&1 \ +// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_OBJ %s +// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_gen %t_dummy.o %s 2>&1 \ +// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_OBJ %s +// RUN: %clangxx -### -fsycl -fintelfpga %t_dummy.o %s 2>&1 \ +// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_OBJ %s +// IMPLIED_DEVICE_OBJ: clang-offload-bundler{{.*}} "-type=o"{{.*}} "-targets=sycl-spir64-unknown-unknown-sycldevice,sycl-spir64_{{.*}}-unknown-unknown-sycldevice"{{.*}} "-unbundle" + +// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_x86_64 %t_dummy.a %s 2>&1 \ +// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s +// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_fpga %t_dummy.a %s 2>&1 \ +// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s +// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_gen %t_dummy.a %s 2>&1 \ +// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s +// RUN: %clangxx -### -fsycl -fintelfpga %t_dummy.a %s 2>&1 \ +// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s +// IMPLIED_DEVICE_LIB: clang-offload-bundler{{.*}} "-type=a"{{.*}} "-targets=sycl-spir64-unknown-unknown-sycldevice,sycl-spir64_{{.*}}-unknown-unknown-sycldevice"{{.*}} "-unbundle" + +/// Check that the default device triple is not used with -fno-sycl-link-spirv +// RUN: %clangxx -### -fsycl -fno-sycl-link-spirv -fsycl-targets=spir64_x86_64 %t_dummy.o %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=NO_IMPLIED_DEVICE_OPT,NO_IMPLIED_DEVICE_CPU %s +// RUN: %clangxx -### -fsycl -fno-sycl-link-spirv -fsycl-targets=spir64_fpga %t_dummy.o %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=NO_IMPLIED_DEVICE_OPT,NO_IMPLIED_DEVICE_FPGA %s +// RUN: %clangxx -### -fsycl -fno-sycl-link-spirv -fsycl-targets=spir64_gen %t_dummy.o %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=NO_IMPLIED_DEVICE_OPT,NO_IMPLIED_DEVICE_GEN %s +// RUN: %clangxx -### -fsycl -fno-sycl-link-spirv -fintelfpga %t_dummy.o %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=NO_IMPLIED_DEVICE_OPT,NO_IMPLIED_DEVICE_FPGA %s +// NO_IMPLIED_DEVICE_CPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown-sycldevice" +// NO_IMPLIED_DEVICE_FPGA: clang{{.*}} "-triple" "spir64_fpga-unknown-unknown-sycldevice" +// NO_IMPLIED_DEVICE_GEN: clang{{.*}} "-triple" "spir64_gen-unknown-unknown-sycldevice" +// NO_IMPLIED_DEVICE_OPT-NOT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice"{{.*}} "-check-section" +// NO_IMPLIED_DEVICE_OPT-NOT: clang-offload-bundler{{.*}} "-targets={{.*}}spir64-unknown-unknown-sycldevice{{.*}}" "-unbundle" + +// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_x86_64 %t_empty.o %s 2>&1 \ +// RUN: | FileCheck -check-prefix NO_IMPLIED_DEVICE %s +// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_fpga %t_empty.o %s 2>&1 \ +// RUN: | FileCheck -check-prefix NO_IMPLIED_DEVICE %s +// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_gen %t_empty.o %s 2>&1 \ +// RUN: | FileCheck -check-prefix NO_IMPLIED_DEVICE %s +// RUN: %clangxx -### -fsycl -fintelfpga %t_empty.o %s 2>&1 \ +// RUN: | FileCheck -check-prefix NO_IMPLIED_DEVICE %s +// NO_IMPLIED_DEVICE: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice"{{.*}} "-check-section" +// NO_IMPLIED_DEVICE-NOT: clang-offload-bundler{{.*}} "-targets={{.*}}spir64-unknown-unknown-sycldevice{{.*}}" "-unbundle" From aa8d164e5ea905ae322b57db2f2a0623ad78ea81 Mon Sep 17 00:00:00 2001 From: mdtoguchi Date: Mon, 2 Aug 2021 01:04:26 -0700 Subject: [PATCH 35/82] [Driver][SYCL] Adjust header inclusion for source + generated footer compile (#4228) When we are compiling the generated temporary source file that contains the integration header, we cannot rely on the location of the source as one of the default locations to search for headers. We add the known location of the original source to resolve those search directories. When adding this location to the compilation, add via -internal-isystem as opposed to -I so we can be sure that user -I values will win. --- clang/lib/Driver/ToolChains/Clang.cpp | 7 ++++--- clang/test/Driver/sycl-int-footer.cpp | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 7709b491a73dd..62d22cb76c675 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1420,16 +1420,17 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, // The file being compiled that contains the integration footer is not being // compiled in the directory of the original source. Add that directory - // as a -I option so we can properly find potential headers there. + // as an -internal-isystem option so we can properly find potential headers + // there. if (ContainsAppendFooterAction(&JA)) { SmallString<128> SourcePath(Inputs[0].getBaseInput()); llvm::sys::path::remove_filename(SourcePath); if (!SourcePath.empty()) { - CmdArgs.push_back("-I"); + CmdArgs.push_back("-internal-isystem"); CmdArgs.push_back(Args.MakeArgString(SourcePath)); } else if (llvm::ErrorOr CWD = D.getVFS().getCurrentWorkingDirectory()) { - CmdArgs.push_back("-I"); + CmdArgs.push_back("-internal-isystem"); CmdArgs.push_back(Args.MakeArgString(*CWD)); } } diff --git a/clang/test/Driver/sycl-int-footer.cpp b/clang/test/Driver/sycl-int-footer.cpp index e1e9e62199ff7..362493ffd5507 100644 --- a/clang/test/Driver/sycl-int-footer.cpp +++ b/clang/test/Driver/sycl-int-footer.cpp @@ -1,9 +1,9 @@ /// Check compilation tool steps when using the integration footer // RUN: %clangxx -fsycl -include dummy.h %/s -### 2>&1 \ -// RUN: | FileCheck -check-prefix FOOTER %s +// RUN: | FileCheck -check-prefix FOOTER %s -DSRCDIR=%/S // FOOTER: clang{{.*}} "-fsycl-is-device"{{.*}} "-fsycl-int-header=[[INTHEADER:.+\.h]]" "-fsycl-int-footer=[[INTFOOTER:.+\h]]" "-sycl-std={{.*}}"{{.*}} "-include" "dummy.h" // FOOTER: append-file{{.*}} "[[INPUTFILE:.+\.cpp]]" "--append=[[INTFOOTER]]" "--orig-filename=[[INPUTFILE]]" "--output=[[APPENDEDSRC:.+\.cpp]]" -// FOOTER: clang{{.*}} "-include" "[[INTHEADER]]"{{.*}} "-fsycl-is-host"{{.*}} "-include" "dummy.h"{{.*}} +// FOOTER: clang{{.*}} "-include" "[[INTHEADER]]"{{.*}} "-fsycl-is-host"{{.*}} "-include" "dummy.h"{{.*}} "-internal-isystem" "[[SRCDIR]]" // FOOTER-NOT: "-include" "[[INTHEADER]]" /// Preprocessed file creation with integration footer From 7275b34a21868dc022255c8edd37caaf1387efa7 Mon Sep 17 00:00:00 2001 From: Nikita Rudenko Date: Mon, 2 Aug 2021 14:25:15 +0600 Subject: [PATCH 36/82] [SYCL] Update windows driver version (#4215) --- buildbot/dependency.conf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/buildbot/dependency.conf b/buildbot/dependency.conf index 200f480a399cb..9563d84d035fc 100644 --- a/buildbot/dependency.conf +++ b/buildbot/dependency.conf @@ -7,8 +7,9 @@ ocl_cpu_rt_ver_win=2021.12.6.0.19 # https://github.com/intel/compute-runtime/releases/tag/21.26.20194 ocl_gpu_rt_ver=21.26.20194 # Same GPU driver supports Level Zero and OpenCL +# https://downloadmirror.intel.com/30579/a08/igfx_win_100.9684.zip # https://downloadmirror.intel.com/30381/a08/igfx_win10_100.9466.zip -ocl_gpu_rt_ver_win=27.20.100.9466 +ocl_gpu_rt_ver_win=30.0.100.9684 intel_sycl_ver=build # TBB binaries can be built from sources following instructions under @@ -31,7 +32,7 @@ ocloc_ver_win=27.20.100.9168 cpu_driver_lin=2021.12.6.0.19 cpu_driver_win=2021.12.6.0.19 gpu_driver_lin=21.26.20194 -gpu_driver_win=27.20.100.9466 +gpu_driver_win=30.0.100.9684 fpga_driver_lin=2021.12.6.0.19 fpga_driver_win=2021.12.6.0.19 # NVidia CUDA driver From f308a4e93cd879603b1cd39b46a0514aa9f1a304 Mon Sep 17 00:00:00 2001 From: Sergey Semenov Date: Mon, 2 Aug 2021 13:26:35 +0300 Subject: [PATCH 37/82] [SYCL] Fix initialization of interoperability memory objects (#4205) Fix an issue where the native memory object passed to interoperability memory object constructor was ignored on devices without host unified memory. --- .../include/CL/sycl/detail/sycl_mem_obj_t.hpp | 2 + .../source/detail/scheduler/graph_builder.cpp | 6 +-- sycl/source/detail/sycl_mem_obj_t.cpp | 2 + sycl/test/abi/sycl_symbols_linux.dump | 1 + .../scheduler/NoHostUnifiedMemory.cpp | 37 +++++++++++++++++++ 5 files changed, 45 insertions(+), 3 deletions(-) diff --git a/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp b/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp index 03165fbe68b4e..5d16eb6034bd8 100644 --- a/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp +++ b/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp @@ -302,6 +302,8 @@ class __SYCL_EXPORT SYCLMemObjT : public SYCLMemObjI { bool hasUserDataPtr() const { return MUserPtr != nullptr; }; + bool isInterop() const; + protected: // An allocateMem helper that determines which host ptr to use void determineHostPtr(const ContextImplPtr &Context, bool InitFromUserData, diff --git a/sycl/source/detail/scheduler/graph_builder.cpp b/sycl/source/detail/scheduler/graph_builder.cpp index 0396da30769c2..7f8c9d4f4b884 100644 --- a/sycl/source/detail/scheduler/graph_builder.cpp +++ b/sycl/source/detail/scheduler/graph_builder.cpp @@ -677,12 +677,12 @@ AllocaCommandBase *Scheduler::GraphBuilder::getOrCreateAllocaForReq( // unnecessary copy on devices with unified host memory support. const bool HostUnifiedMemory = checkHostUnifiedMemory(Queue->getContextImplPtr()); - const bool InitFromUserData = - Record->MAllocaCommands.empty() && HostUnifiedMemory; - AllocaCommandBase *LinkedAllocaCmd = nullptr; // TODO casting is required here to get the necessary information // without breaking ABI, replace with the next major version. auto *MemObj = static_cast(Req->MSYCLMemObj); + const bool InitFromUserData = Record->MAllocaCommands.empty() && + (HostUnifiedMemory || MemObj->isInterop()); + AllocaCommandBase *LinkedAllocaCmd = nullptr; // For the first allocation on a device without host unified memory we // might need to also create a host alloca right away in order to perform diff --git a/sycl/source/detail/sycl_mem_obj_t.cpp b/sycl/source/detail/sycl_mem_obj_t.cpp index f54e5c5d61624..8a43345738216 100644 --- a/sycl/source/detail/sycl_mem_obj_t.cpp +++ b/sycl/source/detail/sycl_mem_obj_t.cpp @@ -100,6 +100,8 @@ size_t SYCLMemObjT::getBufSizeForContext(const ContextImplPtr &Context, return BufSize; } +bool SYCLMemObjT::isInterop() const { return MOpenCLInterop; } + void SYCLMemObjT::determineHostPtr(const ContextImplPtr &Context, bool InitFromUserData, void *&HostPtr, bool &HostPtrReadOnly) { diff --git a/sycl/test/abi/sycl_symbols_linux.dump b/sycl/test/abi/sycl_symbols_linux.dump index eed93b8ca86f2..56bda0b5e7a6b 100644 --- a/sycl/test/abi/sycl_symbols_linux.dump +++ b/sycl/test/abi/sycl_symbols_linux.dump @@ -4041,6 +4041,7 @@ _ZNK2cl4sycl6detail10image_implILi3EE7getTypeEv _ZNK2cl4sycl6detail10image_implILi3EE9get_countEv _ZNK2cl4sycl6detail10image_implILi3EE9get_rangeEv _ZNK2cl4sycl6detail11SYCLMemObjT9getPluginEv +_ZNK2cl4sycl6detail11SYCLMemObjT9isInteropEv _ZNK2cl4sycl6detail11stream_impl22get_max_statement_sizeEv _ZNK2cl4sycl6detail11stream_impl8get_sizeEv _ZNK2cl4sycl6detail12sampler_impl18get_filtering_modeEv diff --git a/sycl/unittests/scheduler/NoHostUnifiedMemory.cpp b/sycl/unittests/scheduler/NoHostUnifiedMemory.cpp index ed66cc0c9f60f..d46b3cff9862b 100644 --- a/sycl/unittests/scheduler/NoHostUnifiedMemory.cpp +++ b/sycl/unittests/scheduler/NoHostUnifiedMemory.cpp @@ -58,8 +58,19 @@ static pi_result redefinedEnqueueMemBufferWriteRect( return PI_SUCCESS; } +static pi_result redefinedMemRetain(pi_mem mem) { return PI_SUCCESS; } static pi_result redefinedMemRelease(pi_mem mem) { return PI_SUCCESS; } +static pi_context InteropPiContext = nullptr; +static pi_result redefinedMemGetInfo(pi_mem mem, cl_mem_info param_name, + size_t param_value_size, void *param_value, + size_t *param_value_size_ret) { + EXPECT_EQ(param_name, static_cast(CL_MEM_CONTEXT)); + auto *Result = reinterpret_cast(param_value); + *Result = InteropPiContext; + return PI_SUCCESS; +} + TEST_F(SchedulerTest, NoHostUnifiedMemory) { platform Plt{default_selector()}; if (Plt.is_host()) { @@ -75,7 +86,9 @@ TEST_F(SchedulerTest, NoHostUnifiedMemory) { redefinedEnqueueMemBufferReadRect); Mock.redefine( redefinedEnqueueMemBufferWriteRect); + Mock.redefine(redefinedMemRetain); Mock.redefine(redefinedMemRelease); + Mock.redefine(redefinedMemGetInfo); cl::sycl::detail::QueueImplPtr QImpl = detail::getSyclObjImpl(Q); device HostDevice; @@ -185,4 +198,28 @@ TEST_F(SchedulerTest, NoHostUnifiedMemory) { // The current context for the record should still be modified. EXPECT_EQ(Record->MCurContext, DefaultHostQueue->getContextImplPtr()); } + // Check that interoperability memory objects are initialized. + { + cl_mem MockInteropBuffer = reinterpret_cast(1); + context InteropContext = Q.get_context(); + InteropPiContext = detail::getSyclObjImpl(InteropContext)->getHandleRef(); + std::shared_ptr BufI = std::make_shared< + detail::buffer_impl>( + MockInteropBuffer, Q.get_context(), /*BufSize*/ 8, + make_unique_ptr>(), + event()); + + detail::Requirement Req = getMockRequirement(); + Req.MSYCLMemObj = BufI.get(); + std::vector AuxCmds; + detail::MemObjRecord *Record = + MS.getOrInsertMemObjRecord(QImpl, &Req, AuxCmds); + detail::AllocaCommandBase *InteropAlloca = + MS.getOrCreateAllocaForReq(Record, &Req, QImpl, AuxCmds); + detail::EnqueueResultT Res; + MockScheduler::enqueueCommand(InteropAlloca, Res, detail::BLOCKING); + + EXPECT_EQ(Record->MAllocaCommands.size(), 1U); + EXPECT_EQ(InteropAlloca->MMemAllocation, MockInteropBuffer); + } } From 5950cd025c4f206ec9c27c6126a31ffc574e9ce9 Mon Sep 17 00:00:00 2001 From: sergei Date: Mon, 2 Aug 2021 13:28:21 +0300 Subject: [PATCH 38/82] [SYCL] Replace filename default argument of code_location to nullptr (#4212) This is a short-term solution to workaround leak of full paths in builds Signed-off-by: Sergey Kanaev --- sycl/include/CL/sycl/detail/common.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sycl/include/CL/sycl/detail/common.hpp b/sycl/include/CL/sycl/detail/common.hpp index f277f470c2e77..8cb2e3ab384a0 100644 --- a/sycl/include/CL/sycl/detail/common.hpp +++ b/sycl/include/CL/sycl/detail/common.hpp @@ -48,8 +48,10 @@ struct code_location { return code_location(fileName, funcName, lineNo, columnNo); } #else + // FIXME Having a nullptr for fileName here is a short-term solution to + // workaround leak of full paths in builds static constexpr code_location - current(const char *fileName = __builtin_FILE(), + current(const char *fileName = nullptr, const char *funcName = __builtin_FUNCTION(), unsigned long lineNo = __builtin_LINE(), unsigned long columnNo = 0) noexcept { From 6a3589b5d9e1b6dcbeb58ed1028260d291013312 Mon Sep 17 00:00:00 2001 From: rolandschulz Date: Mon, 2 Aug 2021 03:28:50 -0700 Subject: [PATCH 39/82] [SYCL][Doc] Update ROCM section of GetStartedGuide (#4229) bfbd5af782be9 changed that __HIP_PLATFORM_AMD__ instead of __HIP_PLATFORM_HCC__ is used. This requires 4.2.0. --- sycl/doc/GetStartedGuide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sycl/doc/GetStartedGuide.md b/sycl/doc/GetStartedGuide.md index 35ff90a6d87af..8eb54324c770e 100644 --- a/sycl/doc/GetStartedGuide.md +++ b/sycl/doc/GetStartedGuide.md @@ -166,10 +166,10 @@ To enable support for ROCm devices, follow the instructions for the Linux DPC++ toolchain, but add the `--rocm` flag to `configure.py` Enabling this flag requires an installation of -ROCm 4.1.0 on the system, refer to +ROCm 4.2.0 on the system, refer to [AMD ROCm Installation Guide for Linux](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation-Guide.html). -Currently, the only combination tested is Ubuntu 18.04 with ROCm 4.1.0 using a Vega20 gfx906. +Currently, the only combination tested is Ubuntu 18.04 with ROCm 4.2.0 using a Vega20 gfx906. [LLD](https://llvm.org/docs/AMDGPUUsage.html) is necessary for the AMD GPU compilation chain. The AMDGPU backend generates a standard ELF [ELF] relocatable code object that can be linked by lld to @@ -734,7 +734,7 @@ which contains all the symbols required. ### ROCm back-end limitations * For supported Operating Systems, please refer to the [Supported Operating Systems](https://github.com/RadeonOpenCompute/ROCm#supported-operating-systems) -* The only combination tested is Ubuntu 18.04 with ROCm 4.1 using a Vega20 gfx906. +* The only combination tested is Ubuntu 18.04 with ROCm 4.2 using a Vega20 gfx906. * Judging from the current [test](https://github.com/zjin-lcf/oneAPI-DirectProgramming) results, there is still a lot of room for improvement in ROCm back-end support. The current problems include three aspects. The first one is at compile time: the `barrier` and `atomic` keywords are not supported. From 71e85cfa06188e255eaee040d3ac9f2db6aeb836 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 2 Aug 2021 05:40:20 -0700 Subject: [PATCH 40/82] Respond to review comments Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 6aa1ea16e529e..c87a7a48dd169 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -998,8 +998,8 @@ static void addScopeAttrToLocalVars(CXXMethodDecl &F) { } /// Return method by name -static CXXMethodDecl *getMethodByName(const CXXRecordDecl *CRD, - StringRef MethodName) { +static CXXMethodDecl *isCXXRecordWithInitMember(const CXXRecordDecl *CRD, + StringRef MethodName) { CXXMethodDecl *Method; auto It = std::find_if(CRD->methods().begin(), CRD->methods().end(), [MethodName](const CXXMethodDecl *Method) { @@ -1359,7 +1359,8 @@ class SyclKernelFieldHandlerBase { // Mark these virtual so that we can use override in the implementer classes, // despite virtual dispatch never being used. - // Accessor can be a base class or a field decl, so both must be handled. + // SYCL special class can be a base class or a field decl, so both must be + // handled. virtual bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &, QualType) { return true; @@ -1964,7 +1965,8 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { RecordDecl->hasAttr() ? InitESIMDMethodName : InitMethodName; - CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, MethodName); + CXXMethodDecl *InitMethod = + isCXXRecordWithInitMember(RecordDecl, MethodName); assert(InitMethod && "The accessor/sampler must have the __init method"); // Don't do -1 here because we count on this to be the first parameter added @@ -1974,7 +1976,7 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { QualType ParamTy = Param->getType(); addParam(FD, ParamTy.getCanonicalType()); if (ParamTy.getTypePtr()->isPointerType() && - !getMethodByName(RecordDecl, FinalizeMethodName)) { + !isCXXRecordWithInitMember(RecordDecl, FinalizeMethodName)) { handleAccessorPropertyList(Params.back(), RecordDecl, FD->getLocation()); if (KernelDecl->hasAttr()) @@ -2088,7 +2090,8 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { llvm::StringLiteral MethodName = KernelDecl->hasAttr() ? InitESIMDMethodName : InitMethodName; - CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, MethodName); + CXXMethodDecl *InitMethod = + isCXXRecordWithInitMember(RecordDecl, MethodName); assert(InitMethod && "The accessor/sampler must have the __init method"); // Get access mode of accessor. @@ -2241,7 +2244,8 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { assert(RecordDecl && "The accessor/sampler must be a RecordDecl"); llvm::StringLiteral MethodName = IsSIMD ? InitESIMDMethodName : InitMethodName; - CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, MethodName); + CXXMethodDecl *InitMethod = + isCXXRecordWithInitMember(RecordDecl, MethodName); assert(InitMethod && "The accessor/sampler must have the __init method"); for (const ParmVarDecl *Param : InitMethod->parameters()) addParam(Param->getType()); @@ -2421,7 +2425,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); - if (getMethodByName(RecordDecl, FinalizeMethodName)) + if (isCXXRecordWithInitMember(RecordDecl, FinalizeMethodName)) return handleSpecialType( FD, FieldTy, KernelArgDescription(KernelArgDescription::Stream)); if (dyn_cast(FieldTy->getAsRecordDecl())) @@ -2768,7 +2772,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { void createSpecialMethodCall(const CXXRecordDecl *RD, StringRef MethodName, SmallVectorImpl &AddTo) { - CXXMethodDecl *Method = getMethodByName(RD, MethodName); + CXXMethodDecl *Method = isCXXRecordWithInitMember(RD, MethodName); if (!Method) return; @@ -2864,9 +2868,9 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { const auto *RecordDecl = Ty->getAsCXXRecordDecl(); createSpecialMethodCall(RecordDecl, getInitMethodName(), BodyStmts); CXXMethodDecl *FinalizeMethod = - getMethodByName(RecordDecl, FinalizeMethodName); + isCXXRecordWithInitMember(RecordDecl, FinalizeMethodName); // A finalize-method is expected for stream class. - if (!FinalizeMethod && getMethodByName(RecordDecl, "__finalize")) + if (!FinalizeMethod && isCXXRecordWithInitMember(RecordDecl, "__finalize")) SemaRef.Diag(FD->getLocation(), diag::err_sycl_expected_finalize_method); else createSpecialMethodCall(RecordDecl, FinalizeMethodName, FinalizeStmts); @@ -3275,10 +3279,11 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset + offsetOf(FD, FieldTy)); } else { - if (getMethodByName(ClassTy, FinalizeMethodName)) + if (isCXXRecordWithInitMember(ClassTy, FinalizeMethodName)) addParam(FD, FieldTy, SYCLIntegrationHeader::kind_stream); else { - CXXMethodDecl *InitMethod = getMethodByName(ClassTy, InitMethodName); + CXXMethodDecl *InitMethod = + isCXXRecordWithInitMember(ClassTy, InitMethodName); assert(InitMethod && "sampler must have __init method"); const ParmVarDecl *SamplerArg = InitMethod->getParamDecl(0); addParam(SamplerArg->getType(), SYCLIntegrationHeader::kind_sampler, @@ -4955,7 +4960,7 @@ bool Util::isSyclSpecialType(const QualType Ty) { const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); if (!RecTy) return false; - return getMethodByName(RecTy, "__init"); + return isCXXRecordWithInitMember(RecTy, "__init"); } bool Util::isSyclHalfType(QualType Ty) { From c2602c64367e4cf01944fffea3474df487f2f209 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 2 Aug 2021 08:18:07 -0700 Subject: [PATCH 41/82] Remove driver changes Signed-off-by: Zahira Ammarguellat --- buildbot/dependency.conf | 5 +- clang/include/clang/Driver/Driver.h | 19 ------ clang/include/clang/Driver/Options.td | 3 - clang/lib/Driver/Driver.cpp | 85 ++------------------------- clang/lib/Driver/ToolChains/Clang.cpp | 15 ++--- clang/lib/Driver/ToolChains/SYCL.cpp | 41 ++++--------- clang/lib/Driver/ToolChains/SYCL.h | 10 ++-- 7 files changed, 28 insertions(+), 150 deletions(-) diff --git a/buildbot/dependency.conf b/buildbot/dependency.conf index 9563d84d035fc..200f480a399cb 100644 --- a/buildbot/dependency.conf +++ b/buildbot/dependency.conf @@ -7,9 +7,8 @@ ocl_cpu_rt_ver_win=2021.12.6.0.19 # https://github.com/intel/compute-runtime/releases/tag/21.26.20194 ocl_gpu_rt_ver=21.26.20194 # Same GPU driver supports Level Zero and OpenCL -# https://downloadmirror.intel.com/30579/a08/igfx_win_100.9684.zip # https://downloadmirror.intel.com/30381/a08/igfx_win10_100.9466.zip -ocl_gpu_rt_ver_win=30.0.100.9684 +ocl_gpu_rt_ver_win=27.20.100.9466 intel_sycl_ver=build # TBB binaries can be built from sources following instructions under @@ -32,7 +31,7 @@ ocloc_ver_win=27.20.100.9168 cpu_driver_lin=2021.12.6.0.19 cpu_driver_win=2021.12.6.0.19 gpu_driver_lin=21.26.20194 -gpu_driver_win=30.0.100.9684 +gpu_driver_win=27.20.100.9466 fpga_driver_lin=2021.12.6.0.19 fpga_driver_win=2021.12.6.0.19 # NVidia CUDA driver diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 8a099a51df628..cc43503558be0 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -655,21 +655,6 @@ class Driver { FPGAEmulationMode = IsEmulation; } - /// The inclusion of the default SYCL device triple is dependent on either - /// the discovery of an existing object/archive that contains the device code - /// or if a user explicitly turns this on with -fsycl-add-spirv. - /// We need to keep track of this so any use of any generic target option - /// setting is only applied to the user specified triples. - bool SYCLDefaultTripleImplied = false; - void setSYCLDefaultTriple(bool IsDefaultImplied) { - SYCLDefaultTripleImplied = IsDefaultImplied; - } - - /// Returns true if an offload binary is found that contains the default - /// triple for SYCL (spir64) - bool checkForSYCLDefaultDevice(Compilation &C, - llvm::opt::DerivedArgList &Args) const; - /// Returns true if an offload static library is found. bool checkForOffloadStaticLib(Compilation &C, llvm::opt::DerivedArgList &Args) const; @@ -729,10 +714,6 @@ class Driver { /// FPGA Emulation. This is only used for SYCL offloading to FPGA device. bool isFPGAEmulationMode() const { return FPGAEmulationMode; }; - /// isSYCLDefaultTripleImplied - The default SYCL triple (spir64) has been - /// added or should be added given proper criteria. - bool isSYCLDefaultTripleImplied() const { return SYCLDefaultTripleImplied; }; - /// addIntegrationFiles - Add the integration files that will be populated /// by the device compilation and used by the host compile. void addIntegrationFiles(StringRef IntHeaderName, StringRef IntFooterName, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 4d91d9c0061d0..0146787363c32 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2644,9 +2644,6 @@ def fno_sycl_use_footer : Flag<["-"], "fno-sycl-use-footer">, Flags<[CoreOption] def fsycl_footer_path_EQ : Joined<["-"], "fsycl-footer-path=">, Flags<[CoreOption]>, HelpText<"Specify the location of the temporary " "source file with the included integration footer.">; -def fno_sycl_link_spirv : Flag<["-"], "fno-sycl-link-spirv">, - Flags<[CoreOption]>, HelpText<"Disable adding of the default (spir64) triple " - "when discovered in user specified objects and archives.">; def fsyntax_only : Flag<["-"], "fsyntax-only">, Flags<[NoXarchOption,CoreOption,CC1Option,FC1Option]>, Group; def ftabstop_EQ : Joined<["-"], "ftabstop=">, Group; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 18871089dfcd1..0d90bf7902e7b 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -718,23 +718,6 @@ static bool isValidSYCLTriple(llvm::Triple T) { return true; } -static void addSYCLDefaultTriple(Compilation &C, - SmallVectorImpl &SYCLTriples) { - if (!C.getDriver().isSYCLDefaultTripleImplied()) - return; - for (const auto &SYCLTriple : SYCLTriples) { - if (SYCLTriple.getSubArch() == llvm::Triple::NoSubArch && - SYCLTriple.isSPIR()) - return; - // If we encounter a known non-spir* target, do not add the default triple. - if (SYCLTriple.isNVPTX() || SYCLTriple.isAMDGCN()) - return; - } - // Add the default triple as it was not found. - llvm::Triple DefaultTriple = C.getDriver().MakeSYCLDeviceTriple("spir64"); - SYCLTriples.insert(SYCLTriples.begin(), DefaultTriple); -} - void Driver::CreateOffloadingDeviceToolChains(Compilation &C, InputList &Inputs) { @@ -946,7 +929,6 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, FoundNormalizedTriples[NormalizedName] = Val; UniqueSYCLTriplesVec.push_back(TT); } - addSYCLDefaultTriple(C, UniqueSYCLTriplesVec); } else Diag(clang::diag::warn_drv_empty_joined_argument) << SYCLTargetsValues->getAsString(C.getInputArgs()); @@ -1005,10 +987,8 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, else if (HasValidSYCLRuntime) // Triple for -fintelfpga is spir64_fpga-unknown-unknown-sycldevice. SYCLTargetArch = SYCLfpga ? "spir64_fpga" : "spir64"; - if (!SYCLTargetArch.empty()) { + if (!SYCLTargetArch.empty()) UniqueSYCLTriplesVec.push_back(MakeSYCLDeviceTriple(SYCLTargetArch)); - addSYCLDefaultTriple(C, UniqueSYCLTriplesVec); - } } // We'll need to use the SYCL and host triples as the key into // getOffloadingDeviceToolChain, because the device toolchains we're @@ -1438,11 +1418,6 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { if (checkForOffloadStaticLib(*C, *TranslatedArgs)) setOffloadStaticLibSeen(); - // Check for any objects/archives that need to be compiled with the default - // triple. - if (checkForSYCLDefaultDevice(*C, *TranslatedArgs)) - setSYCLDefaultTriple(true); - // Populate the tool chains for the offloading devices, if any. CreateOffloadingDeviceToolChains(*C, Inputs); @@ -1453,8 +1428,7 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { const ToolChain *TC = SYCLTCRange.first->second; const toolchains::SYCLToolChain *SYCLTC = static_cast(TC); - SYCLTC->TranslateBackendTargetArgs(SYCLTC->getTriple(), *TranslatedArgs, - TargetArgs); + SYCLTC->TranslateBackendTargetArgs(*TranslatedArgs, TargetArgs); for (StringRef ArgString : TargetArgs) { if (ArgString.equals("-hardware") || ArgString.equals("-simulation")) { setFPGAEmulationMode(false); @@ -2788,30 +2762,6 @@ bool hasFPGABinary(Compilation &C, std::string Object, types::ID Type) { return runBundler(BundlerArgs, C); } -static bool hasSYCLDefaultSection(Compilation &C, const StringRef &File) { - // Do not do the check if the file doesn't exist - if (!llvm::sys::fs::exists(File)) - return false; - - bool IsArchive = isStaticArchiveFile(File); - if (!(IsArchive || isObjectFile(File.str()))) - return false; - - llvm::Triple TT(C.getDriver().MakeSYCLDeviceTriple("spir64")); - // Checking uses -check-section option with the input file, no output - // file and the target triple being looked for. - const char *Targets = - C.getArgs().MakeArgString(Twine("-targets=sycl-") + TT.str()); - const char *Inputs = - C.getArgs().MakeArgString(Twine("-inputs=") + File.str()); - // Always use -type=ao for bundle checking. The 'bundles' are - // actually archives. - SmallVector BundlerArgs = {"clang-offload-bundler", - IsArchive ? "-type=ao" : "-type=o", - Targets, Inputs, "-check-section"}; - return runBundler(BundlerArgs, C); -} - static bool hasOffloadSections(Compilation &C, const StringRef &Archive, DerivedArgList &Args) { // Do not do the check if the file doesn't exist @@ -2842,15 +2792,14 @@ static bool optionMatches(const std::string &Option, // Process linker inputs for use with offload static libraries. We are only // handling options and explicitly named static archives as these need to be // partially linked. -static SmallVector -getLinkerArgs(Compilation &C, DerivedArgList &Args, bool IncludeObj = false) { +static SmallVector getLinkerArgs(Compilation &C, + DerivedArgList &Args) { SmallVector LibArgs; for (const auto *A : Args) { std::string FileName = A->getAsString(Args); if (A->getOption().getKind() == Option::InputClass) { StringRef Value(A->getValue()); - if (isStaticArchiveFile(Value) || - (IncludeObj && isObjectFile(Value.str()))) { + if (isStaticArchiveFile(Value)) { LibArgs.push_back(Args.MakeArgString(FileName)); continue; } @@ -2869,7 +2818,7 @@ getLinkerArgs(Compilation &C, DerivedArgList &Args, bool IncludeObj = false) { // Only add named static libs objects and --whole-archive options. if (optionMatches("-whole-archive", V.str()) || optionMatches("-no-whole-archive", V.str()) || - isStaticArchiveFile(V) || (IncludeObj && isObjectFile(V.str()))) { + isStaticArchiveFile(V)) { LibArgs.push_back(Args.MakeArgString(V)); return; } @@ -2935,26 +2884,6 @@ static bool IsSYCLDeviceLibObj(std::string ObjFilePath, bool isMSVCEnv) { return Ret; } -// Goes through all of the arguments, including inputs expected for the -// linker directly, to determine if we need to potentially add the SYCL -// default triple. -bool Driver::checkForSYCLDefaultDevice(Compilation &C, - DerivedArgList &Args) const { - // Check only if enabled with -fsycl - if (!Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) - return false; - - if (Args.hasArg(options::OPT_fno_sycl_link_spirv)) - return false; - - SmallVector AllArgs(getLinkerArgs(C, Args, true)); - for (StringRef Arg : AllArgs) { - if (hasSYCLDefaultSection(C, Arg)) - return true; - } - return false; -} - // Goes through all of the arguments, including inputs expected for the // linker directly, to determine if we need to perform additional work for // static offload libraries. @@ -4728,7 +4657,6 @@ class OffloadingActionBuilder final { if (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga) SYCLfpgaTriple = true; } - addSYCLDefaultTriple(C, SYCLTripleList); } if (SYCLAddTargets) { for (StringRef Val : SYCLAddTargets->getValues()) { @@ -4751,7 +4679,6 @@ class OffloadingActionBuilder final { const char *SYCLTargetArch = SYCLfpga ? "spir64_fpga" : "spir64"; SYCLTripleList.push_back( C.getDriver().MakeSYCLDeviceTriple(SYCLTargetArch)); - addSYCLDefaultTriple(C, SYCLTripleList); if (SYCLfpga) SYCLfpgaTriple = true; } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 62d22cb76c675..2eb49d68c0ee1 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1420,17 +1420,16 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, // The file being compiled that contains the integration footer is not being // compiled in the directory of the original source. Add that directory - // as an -internal-isystem option so we can properly find potential headers - // there. + // as a -I option so we can properly find potential headers there. if (ContainsAppendFooterAction(&JA)) { SmallString<128> SourcePath(Inputs[0].getBaseInput()); llvm::sys::path::remove_filename(SourcePath); if (!SourcePath.empty()) { - CmdArgs.push_back("-internal-isystem"); + CmdArgs.push_back("-I"); CmdArgs.push_back(Args.MakeArgString(SourcePath)); } else if (llvm::ErrorOr CWD = D.getVFS().getCurrentWorkingDirectory()) { - CmdArgs.push_back("-internal-isystem"); + CmdArgs.push_back("-I"); CmdArgs.push_back(Args.MakeArgString(*CWD)); } } @@ -8275,8 +8274,6 @@ void OffloadBundler::ConstructJobMultipleOutputs( if (getToolChain().getTriple().getSubArch() == llvm::Triple::SPIRSubArch_fpga && Dep.DependentOffloadKind == Action::OFK_SYCL) { - if (J++) - Triples += ','; llvm::Triple TT; TT.setArchName(types::getTypeName(InputType)); TT.setVendorName("intel"); @@ -8287,8 +8284,6 @@ void OffloadBundler::ConstructJobMultipleOutputs( } else if (getToolChain().getTriple().getSubArch() != llvm::Triple::SPIRSubArch_fpga && Dep.DependentOffloadKind == Action::OFK_Host) { - if (J++) - Triples += ','; Triples += Action::GetOffloadKindName(Dep.DependentOffloadKind); Triples += '-'; Triples += Dep.DependentToolChain->getTriple().normalize(); @@ -8448,10 +8443,10 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA, // Only store compile/link opts in the image descriptor for the SPIR-V // target; AOT compilation has already been performed otherwise. TC.AddImpliedTargetArgs(TT, TCArgs, BuildArgs); - TC.TranslateBackendTargetArgs(TT, TCArgs, BuildArgs); + TC.TranslateBackendTargetArgs(TCArgs, BuildArgs); createArgString("-compile-opts="); BuildArgs.clear(); - TC.TranslateLinkerTargetArgs(TT, TCArgs, BuildArgs); + TC.TranslateLinkerTargetArgs(TCArgs, BuildArgs); createArgString("-link-opts="); } diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 1efbd80023448..4bbf9b8f7b649 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -387,8 +387,8 @@ void SYCL::fpga::BackendCompiler::constructOpenCLAOTCommand( llvm::Triple CPUTriple("spir64_x86_64"); TC.AddImpliedTargetArgs(CPUTriple, Args, CmdArgs); // Add the target args passed in - TC.TranslateBackendTargetArgs(CPUTriple, Args, CmdArgs); - TC.TranslateLinkerTargetArgs(CPUTriple, Args, CmdArgs); + TC.TranslateBackendTargetArgs(Args, CmdArgs); + TC.TranslateLinkerTargetArgs(Args, CmdArgs); SmallString<128> ExecPath( getToolChain().GetProgramPath(makeExeName(C, "opencl-aot"))); @@ -414,7 +414,7 @@ void SYCL::fpga::BackendCompiler::ConstructJob( const toolchains::SYCLToolChain &TC = static_cast(getToolChain()); ArgStringList TargetArgs; - TC.TranslateBackendTargetArgs(TC.getTriple(), Args, TargetArgs); + TC.TranslateBackendTargetArgs(Args, TargetArgs); // When performing emulation compilations for FPGA AOT, we want to use // opencl-aot instead of aoc. @@ -534,8 +534,8 @@ void SYCL::fpga::BackendCompiler::ConstructJob( TC.AddImpliedTargetArgs(getToolChain().getTriple(), Args, CmdArgs); // Add -Xsycl-target* options. - TC.TranslateBackendTargetArgs(getToolChain().getTriple(), Args, CmdArgs); - TC.TranslateLinkerTargetArgs(getToolChain().getTriple(), Args, CmdArgs); + TC.TranslateBackendTargetArgs(Args, CmdArgs); + TC.TranslateLinkerTargetArgs(Args, CmdArgs); // Look for -reuse-exe=XX option if (Arg *A = Args.getLastArg(options::OPT_reuse_exe_EQ)) { @@ -581,8 +581,8 @@ void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C, const toolchains::SYCLToolChain &TC = static_cast(getToolChain()); TC.AddImpliedTargetArgs(getToolChain().getTriple(), Args, CmdArgs); - TC.TranslateBackendTargetArgs(getToolChain().getTriple(), Args, CmdArgs); - TC.TranslateLinkerTargetArgs(getToolChain().getTriple(), Args, CmdArgs); + TC.TranslateBackendTargetArgs(Args, CmdArgs); + TC.TranslateLinkerTargetArgs(Args, CmdArgs); SmallString<128> ExecPath( getToolChain().GetProgramPath(makeExeName(C, "ocloc"))); const char *Exec = C.getArgs().MakeArgString(ExecPath); @@ -614,8 +614,8 @@ void SYCL::x86_64::BackendCompiler::ConstructJob( static_cast(getToolChain()); TC.AddImpliedTargetArgs(getToolChain().getTriple(), Args, CmdArgs); - TC.TranslateBackendTargetArgs(getToolChain().getTriple(), Args, CmdArgs); - TC.TranslateLinkerTargetArgs(getToolChain().getTriple(), Args, CmdArgs); + TC.TranslateBackendTargetArgs(Args, CmdArgs); + TC.TranslateLinkerTargetArgs(Args, CmdArgs); SmallString<128> ExecPath( getToolChain().GetProgramPath(makeExeName(C, "opencl-aot"))); const char *Exec = C.getArgs().MakeArgString(ExecPath); @@ -765,8 +765,7 @@ void SYCLToolChain::AddImpliedTargetArgs( } void SYCLToolChain::TranslateBackendTargetArgs( - const llvm::Triple &Triple, const llvm::opt::ArgList &Args, - llvm::opt::ArgStringList &CmdArgs) const { + const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const { // Handle -Xs flags. for (auto *A : Args) { // When parsing the target args, the -Xs type option applies to all @@ -776,15 +775,6 @@ void SYCLToolChain::TranslateBackendTargetArgs( // -Xs "-DFOO -DBAR" // -XsDFOO -XsDBAR // All of the above examples will pass -DFOO -DBAR to the backend compiler. - - // Do not add the -Xs to the default SYCL triple (spir64) when we know we - // have implied the setting. - if ((A->getOption().matches(options::OPT_Xs) || - A->getOption().matches(options::OPT_Xs_separate)) && - Triple.getSubArch() == llvm::Triple::NoSubArch && Triple.isSPIR() && - getDriver().isSYCLDefaultTripleImplied()) - continue; - if (A->getOption().matches(options::OPT_Xs)) { // Take the arg and create an option out of it. CmdArgs.push_back(Args.MakeArgString(Twine("-") + A->getValue())); @@ -798,22 +788,13 @@ void SYCLToolChain::TranslateBackendTargetArgs( continue; } } - // Do not process -Xsycl-target-backend for implied spir64 - if (Triple.getSubArch() == llvm::Triple::NoSubArch && Triple.isSPIR() && - getDriver().isSYCLDefaultTripleImplied()) - return; // Handle -Xsycl-target-backend. TranslateTargetOpt(Args, CmdArgs, options::OPT_Xsycl_backend, options::OPT_Xsycl_backend_EQ); } void SYCLToolChain::TranslateLinkerTargetArgs( - const llvm::Triple &Triple, const llvm::opt::ArgList &Args, - llvm::opt::ArgStringList &CmdArgs) const { - // Do not process -Xsycl-target-linker for implied spir64 - if (Triple.getSubArch() == llvm::Triple::NoSubArch && Triple.isSPIR() && - getDriver().isSYCLDefaultTripleImplied()) - return; + const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const { // Handle -Xsycl-target-linker. TranslateTargetOpt(Args, CmdArgs, options::OPT_Xsycl_linker, options::OPT_Xsycl_linker_EQ); diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index e767ede212b9b..e6c1ab2ed3966 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -151,12 +151,10 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain { void AddImpliedTargetArgs(const llvm::Triple &Triple, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; - void TranslateBackendTargetArgs(const llvm::Triple &Triple, - const llvm::opt::ArgList &Args, - llvm::opt::ArgStringList &CmdArgs) const; - void TranslateLinkerTargetArgs(const llvm::Triple &Triple, - const llvm::opt::ArgList &Args, - llvm::opt::ArgStringList &CmdArgs) const; + void TranslateBackendTargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; + void TranslateLinkerTargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; bool useIntegratedAs() const override { return true; } bool isPICDefault() const override { return false; } From 8db682de9d4ca57cd2b90c8c082559a2ad387a7c Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 2 Aug 2021 10:28:17 -0700 Subject: [PATCH 42/82] Remove non-related changes Signed-off-by: Zahira Ammarguellat --- clang/include/clang/Driver/Action.h | 50 +- clang/include/clang/Driver/Job.h | 2 - clang/lib/Driver/Action.cpp | 34 +- clang/lib/Driver/Driver.cpp | 206 ++---- clang/lib/Driver/ToolChain.cpp | 1 - clang/lib/Driver/ToolChains/Clang.cpp | 11 +- clang/lib/Sema/SemaSYCL.cpp | 36 +- clang/test/Driver/sycl-int-footer.cpp | 4 +- clang/test/Driver/sycl-intelfpga-aoco-win.cpp | 2 +- clang/test/Driver/sycl-intelfpga-aoco.cpp | 4 +- clang/test/Driver/sycl-offload-amdgcn.cpp | 9 +- clang/test/Driver/sycl-offload-intelfpga.cpp | 1 + clang/test/Driver/sycl-offload-nvptx.cpp | 42 +- clang/test/Driver/sycl-offload.cpp | 52 -- libclc/amdgcn-amdhsa/libspirv/SOURCES | 4 - libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl | 5 - .../libspirv/synchronization/barrier.cl | 1 - .../workitem/get_max_sub_group_size.cl | 28 - .../libspirv/workitem/get_num_sub_groups.cl | 18 - .../libspirv/workitem/get_sub_group_id.cl | 20 - .../libspirv/workitem/get_sub_group_size.cl | 22 - .../libspirv/group/collectives.cl | 48 +- opencl/opencl-aot/source/main.cpp | 42 +- sycl/doc/CompilerAndRuntimeDesign.md | 16 +- sycl/doc/GetStartedGuide.md | 6 +- sycl/doc/images/DeviceLinkAndWrap.svg | 617 ++++++------------ sycl/doc/images/DevicePTXProcessing.svg | 187 ++---- sycl/include/CL/sycl/context.hpp | 1 - sycl/include/CL/sycl/detail/cg.hpp | 110 ++-- sycl/include/CL/sycl/detail/common.hpp | 4 +- sycl/include/CL/sycl/detail/pi.h | 2 +- .../include/CL/sycl/detail/sycl_mem_obj_t.hpp | 2 - sycl/include/CL/sycl/handler.hpp | 68 +- sycl/include/sycl/ext/intel/fpga_lsu.hpp | 2 +- sycl/plugins/cuda/pi_cuda.cpp | 2 +- sycl/source/detail/program_impl.hpp | 3 - sycl/source/detail/scheduler/commands.cpp | 71 +- sycl/source/detail/scheduler/commands.hpp | 7 +- .../source/detail/scheduler/graph_builder.cpp | 25 +- sycl/source/detail/scheduler/scheduler.cpp | 14 +- sycl/source/detail/scheduler/scheduler.hpp | 8 +- sycl/source/detail/sycl_mem_obj_t.cpp | 2 - sycl/source/detail/usm/usm_impl.cpp | 8 +- sycl/source/handler.cpp | 46 +- sycl/test/abi/layout_handler.cpp | 2 +- sycl/test/abi/sycl_symbols_linux.dump | 1 - sycl/test/abi/vtable.cpp | 12 +- sycl/test/on-device/lit.cfg.py | 10 +- .../check_simple_name_collisions.cpp | 1 - .../kernel-and-program/DeviceInfo.cpp | 2 +- .../kernel-and-program/KernelInfo.cpp | 2 +- .../kernel-and-program/KernelRelease.cpp | 2 +- sycl/unittests/queue/EventClear.cpp | 4 +- sycl/unittests/queue/Wait.cpp | 2 +- .../scheduler/CommandsWaitForEvents.cpp | 4 +- sycl/unittests/scheduler/InOrderQueueDeps.cpp | 2 +- .../scheduler/NoHostUnifiedMemory.cpp | 37 -- .../scheduler/SchedulerTestUtils.hpp | 2 +- .../scheduler/StreamInitDependencyOnHost.cpp | 14 +- 59 files changed, 638 insertions(+), 1302 deletions(-) delete mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl delete mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl delete mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl delete mode 100644 libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h index 3621348f6a2ec..15921528c960a 100644 --- a/clang/include/clang/Driver/Action.h +++ b/clang/include/clang/Driver/Action.h @@ -57,7 +57,6 @@ class Action { InputClass = 0, BindArchClass, OffloadClass, - ForEachWrappingClass, PreprocessJobClass, PrecompileJobClass, HeaderModulePrecompileJobClass, @@ -738,15 +737,7 @@ class SYCLPostLinkJobAction : public JobAction { void anchor() override; public: - // The tempfiletable management relies on shadowing the main file type by - // types::TY_Tempfiletable. The problem of shadowing is it prevents its - // integration with clang tools that relies on the file type to properly set - // args. - // We "trick" the driver by declaring the underlying file type and set a - // "true output type" which will be used by the SYCLPostLinkJobAction - // to properly set the job. - SYCLPostLinkJobAction(Action *Input, types::ID ShadowOutputType, - types::ID TrueOutputType); + SYCLPostLinkJobAction(Action *Input, types::ID OutputType); static bool classof(const Action *A) { return A->getKind() == SYCLPostLinkJobClass; @@ -756,11 +747,8 @@ class SYCLPostLinkJobAction : public JobAction { bool getRTSetsSpecConstants() const { return RTSetsSpecConsts; } - types::ID getTrueType() const { return TrueOutputType; } - private: bool RTSetsSpecConsts = true; - types::ID TrueOutputType; }; class BackendCompileJobAction : public JobAction { @@ -783,9 +771,6 @@ class FileTableTformJobAction : public JobAction { void anchor() override; public: - static constexpr const char *COL_CODE = "Code"; - static constexpr const char *COL_ZERO = "0"; - struct Tform { enum Kind { EXTRACT, @@ -806,10 +791,8 @@ class FileTableTformJobAction : public JobAction { SmallVector TheArgs; }; - FileTableTformJobAction(Action *Input, types::ID ShadowOutputType, - types::ID TrueOutputType); - FileTableTformJobAction(ActionList &Inputs, types::ID ShadowOutputType, - types::ID TrueOutputType); + FileTableTformJobAction(Action *Input, types::ID OutputType); + FileTableTformJobAction(ActionList &Inputs, types::ID OutputType); // Deletes all columns except the one with given name. void addExtractColumnTform(StringRef ColumnName, bool WithColTitle = true); @@ -837,10 +820,7 @@ class FileTableTformJobAction : public JobAction { const ArrayRef getTforms() const { return Tforms; } - types::ID getTrueType() const { return TrueOutputType; } - private: - types::ID TrueOutputType; SmallVector Tforms; // transformation actions requested // column to copy single file from if requested @@ -869,30 +849,6 @@ class StaticLibJobAction : public JobAction { } }; -/// Wrap all jobs performed between TFormInput (excluded) and Job (included) -/// behind a `llvm-foreach` call. -/// -/// Assumptions: -/// - No change of toolchain, boundarch and offloading kind should occur -/// within the sub-region; -/// - No job should produce multiple outputs; -/// - Results of action within the sub-region should not be used outside the -/// wrapped region. -/// Note: this doesn't bind to a tool directly and this need special casing -/// anyhow. Hence why this is an Action and not a JobAction, even if there is a -/// command behind. -class ForEachWrappingAction : public Action { -public: - ForEachWrappingAction(JobAction *TFormInput, JobAction *Job); - - JobAction *getTFormInput() const; - JobAction *getJobAction() const; - - static bool classof(const Action *A) { - return A->getKind() == ForEachWrappingClass; - } -}; - } // namespace driver } // namespace clang diff --git a/clang/include/clang/Driver/Job.h b/clang/include/clang/Driver/Job.h index dd523cea9c340..597e643ead5ca 100644 --- a/clang/include/clang/Driver/Job.h +++ b/clang/include/clang/Driver/Job.h @@ -319,8 +319,6 @@ class JobList { /// Clear the job list. void clear(); - /// Return a mutable list of Jobs for llvm-foreach wrapping. - list_type &getJobsForOverride() { return Jobs; } const list_type &getJobs() const { return Jobs; } bool empty() const { return Jobs.empty(); } diff --git a/clang/lib/Driver/Action.cpp b/clang/lib/Driver/Action.cpp index 3a1b5261d6810..4ff09ca4e216b 100644 --- a/clang/lib/Driver/Action.cpp +++ b/clang/lib/Driver/Action.cpp @@ -59,8 +59,6 @@ const char *Action::getClassName(ActionClass AC) { return "append-footer"; case StaticLibJobClass: return "static-lib-linker"; - case ForEachWrappingClass: - return "foreach"; } llvm_unreachable("invalid class"); @@ -476,11 +474,8 @@ SPIRCheckJobAction::SPIRCheckJobAction(Action *Input, types::ID Type) void SYCLPostLinkJobAction::anchor() {} -SYCLPostLinkJobAction::SYCLPostLinkJobAction(Action *Input, - types::ID ShadowOutputType, - types::ID TrueOutputType) - : JobAction(SYCLPostLinkJobClass, Input, ShadowOutputType), - TrueOutputType(TrueOutputType) {} +SYCLPostLinkJobAction::SYCLPostLinkJobAction(Action *Input, types::ID Type) + : JobAction(SYCLPostLinkJobClass, Input, Type) {} void BackendCompileJobAction::anchor() {} @@ -494,17 +489,12 @@ BackendCompileJobAction::BackendCompileJobAction(Action *Input, void FileTableTformJobAction::anchor() {} -FileTableTformJobAction::FileTableTformJobAction(Action *Input, - types::ID ShadowOutputType, - types::ID TrueOutputType) - : JobAction(FileTableTformJobClass, Input, ShadowOutputType), - TrueOutputType(TrueOutputType) {} +FileTableTformJobAction::FileTableTformJobAction(Action *Input, types::ID Type) + : JobAction(FileTableTformJobClass, Input, Type) {} FileTableTformJobAction::FileTableTformJobAction(ActionList &Inputs, - types::ID ShadowOutputType, - types::ID TrueOutputType) - : JobAction(FileTableTformJobClass, Inputs, ShadowOutputType), - TrueOutputType(TrueOutputType) {} + types::ID Type) + : JobAction(FileTableTformJobClass, Inputs, Type) {} void FileTableTformJobAction::addExtractColumnTform(StringRef ColumnName, bool WithColTitle) { @@ -543,15 +533,3 @@ void StaticLibJobAction::anchor() {} StaticLibJobAction::StaticLibJobAction(ActionList &Inputs, types::ID Type) : JobAction(StaticLibJobClass, Inputs, Type) {} - -ForEachWrappingAction::ForEachWrappingAction(JobAction *TFormInput, - JobAction *Job) - : Action(ForEachWrappingClass, {TFormInput, Job}, Job->getType()) {} - -JobAction *ForEachWrappingAction::getTFormInput() const { - return llvm::cast(getInputs()[0]); -} - -JobAction *ForEachWrappingAction::getJobAction() const { - return llvm::cast(getInputs()[1]); -} diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 0d90bf7902e7b..1e19957ad921f 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3896,7 +3896,7 @@ class OffloadingActionBuilder final { SmallVector GpuArchList; /// Build the last steps for CUDA after all BC files have been linked. - JobAction *finalizeNVPTXDependences(Action *Input, const llvm::Triple &TT) { + Action *finalizeNVPTXDependences(Action *Input, const llvm::Triple &TT) { auto *BA = C.getDriver().ConstructPhaseAction( C, Args, phases::Backend, Input, AssociatedOffloadKind); if (TT.getOS() != llvm::Triple::NVCL) { @@ -3906,11 +3906,10 @@ class OffloadingActionBuilder final { return C.MakeAction(DeviceActions, types::TY_CUDA_FATBIN); } - return cast(BA); + return BA; } - JobAction *finalizeAMDGCNDependences(Action *Input, - const llvm::Triple &TT) { + Action *finalizeAMDGCNDependences(Action *Input, const llvm::Triple &TT) { auto *BA = C.getDriver().ConstructPhaseAction( C, Args, phases::Backend, Input, AssociatedOffloadKind); @@ -3920,7 +3919,7 @@ class OffloadingActionBuilder final { ActionList AL = {AA}; Action *LinkAction = C.MakeAction(AL, types::TY_Image); ActionList HIPActions = {LinkAction}; - JobAction *HIPFatBinary = + Action *HIPFatBinary = C.MakeAction(HIPActions, types::TY_HIP_FATBIN); return HIPFatBinary; } @@ -4053,7 +4052,7 @@ class OffloadingActionBuilder final { else FullDeviceLinkAction = DeviceLinkAction; auto *PostLinkAction = C.MakeAction( - FullDeviceLinkAction, types::TY_LLVM_BC, types::TY_LLVM_BC); + FullDeviceLinkAction, types::TY_LLVM_BC); auto *TranslateAction = C.MakeAction( PostLinkAction, types::TY_Image); SYCLLinkBinary = C.MakeAction( @@ -4325,7 +4324,6 @@ class OffloadingActionBuilder final { auto TT = SYCLTripleList[I]; auto isNVPTX = (*TC)->getTriple().isNVPTX(); auto isAMDGCN = (*TC)->getTriple().isAMDGCN(); - auto isSPIR = (*TC)->getTriple().isSPIR(); bool isSpirvAOT = TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga || TT.getSubArch() == llvm::Triple::SPIRSubArch_gen || TT.getSubArch() == llvm::Triple::SPIRSubArch_x86_64; @@ -4337,6 +4335,8 @@ class OffloadingActionBuilder final { // directly to the backend compilation step (aocr) or wrapper (aocx) else if (types::isFPGA(Input->getType())) { Action *FPGAAOTAction; + constexpr char COL_CODE[] = "Code"; + constexpr char COL_ZERO[] = "0"; if (Input->getType() == types::TY_FPGA_AOCR || Input->getType() == types::TY_FPGA_AOCR_EMU) // Generate AOCX/AOCR @@ -4347,10 +4347,8 @@ class OffloadingActionBuilder final { else llvm_unreachable("Unexpected FPGA input type."); auto *RenameAction = C.MakeAction( - FPGAAOTAction, types::TY_Tempfilelist, types::TY_Tempfilelist); - RenameAction->addRenameColumnTform( - FileTableTformJobAction::COL_ZERO, - FileTableTformJobAction::COL_CODE); + FPGAAOTAction, types::TY_Tempfilelist); + RenameAction->addRenameColumnTform(COL_ZERO, COL_CODE); auto *DeviceWrappingAction = C.MakeAction( RenameAction, types::TY_Object); DA.add(*DeviceWrappingAction, **TC, /*BoundArch=*/nullptr, @@ -4364,7 +4362,7 @@ class OffloadingActionBuilder final { // The linkage actions subgraph leading to the offload wrapper. // [cond] Means incoming/outgoing dependence is created only when cond // is true. A function of: - // n - target is NVPTX/AMDGCN + // n - target is NVPTX // a - SPIRV AOT compilation is requested // s - device code split requested // * - "all other cases" @@ -4381,18 +4379,17 @@ class OffloadingActionBuilder final { // .--------------------------------------. // | PostLink | // .--------------------------------------. - // [+*] [+] - // | | - // .-----------------. | - // | FileTableTform | | - // | (extract "Code")| | - // .-----------------. | - // [-] | - // --------------------| | + // [+n] [+*] [+] + // | | | + // .----------------. .-----------------. | + // | FileTableTform | | FileTableTform | | + // | (copy "Code") | | (extract "Code")| | + // .----------------. .-----------------. | + // [.] [-] | + // | | | // [.] [-*] | // .---------------. .-------------------. | - // | finalizeNVPTX | | SPIRVTranslator | | - // | finalizeAMDGCN | | | | + // | finalizeNVPTX | | SPIRVTranslator | | // .---------------. .-------------------. | // [.] [-as] [-!a] | // | | | | @@ -4402,13 +4399,13 @@ class OffloadingActionBuilder final { // | .----------------. | | // | [-s] | | // | | | | - // | [-a] [-!a] [+] - // | .--------------------. - // -----------[-n]| FileTableTform | - // | (replace "Code") | - // .--------------------. - // | - // [+*] + // [.] [-a] [-!a] [+] + // .------------------------------------. + // | FileTableTform | + // | (replace "Code") | + // .------------------------------------. + // | + // [+] // .--------------------------------------. // | OffloadWrapper | // .--------------------------------------. @@ -4423,7 +4420,7 @@ class OffloadingActionBuilder final { // When spv online link is supported by all backends, the fallback // device libraries are only needed when current toolchain is using // AOT compilation. - if (isSPIR) { + if (!isNVPTX && !isAMDGCN) { SYCLDeviceLibLinked = addSYCLDeviceLibs( *TC, FullLinkObjects, true, C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment()); @@ -4435,7 +4432,18 @@ class OffloadingActionBuilder final { C.MakeAction(FullLinkObjects, types::TY_LLVM_BC); else FullDeviceLinkAction = DeviceLinkAction; - + // setup some flags upfront + + if ((isNVPTX || isAMDGCN) && DeviceCodeSplit) { + // TODO Temporary limitation, need to support code splitting for PTX + const Driver &D = C.getDriver(); + const std::string &OptName = + D.getOpts() + .getOption(options::OPT_fsycl_device_code_split) + .getPrefixedName(); + D.Diag(diag::err_drv_unsupported_opt_for_target) + << OptName << (*TC)->getTriple().str(); + } // reflects whether current target is ahead-of-time and can't support // runtime setting of specialization constants bool isAOT = isNVPTX || isAMDGCN || isSpirvAOT; @@ -4444,48 +4452,50 @@ class OffloadingActionBuilder final { ActionList WrapperInputs; // post link is not optional - even if not splitting, always need to // process specialization constants - - types::ID PostLinkOutType = - isSPIR ? types::TY_Tempfiletable : FullDeviceLinkAction->getType(); - // For SPIR-V targets, force TY_Tempfiletable. auto *PostLinkAction = C.MakeAction( - FullDeviceLinkAction, PostLinkOutType, types::TY_Tempfiletable); + FullDeviceLinkAction, types::TY_Tempfiletable); PostLinkAction->setRTSetsSpecConstants(!isAOT); - auto *ExtractIRFilesAction = C.MakeAction( - PostLinkAction, - isSPIR ? types::TY_Tempfilelist : PostLinkAction->getType(), - types::TY_Tempfilelist); - // single column w/o title fits TY_Tempfilelist format - ExtractIRFilesAction->addExtractColumnTform( - FileTableTformJobAction::COL_CODE, false /*drop titles*/); + constexpr char COL_CODE[] = "Code"; if (isNVPTX || isAMDGCN) { - JobAction *FinAction = - isNVPTX ? finalizeNVPTXDependences(ExtractIRFilesAction, - (*TC)->getTriple()) - : finalizeAMDGCNDependences(ExtractIRFilesAction, + // Make extraction copy the only remaining code file instead of + // creating a new table with a single entry. + // TODO: Process all PTX code files in file table to enable code + // splitting for PTX target. + auto *ExtractIRFilesAction = C.MakeAction( + PostLinkAction, types::TY_LLVM_BC); + ExtractIRFilesAction->addCopySingleFileTform(COL_CODE, 0); + + Action *FinAction; + if (isNVPTX) { + FinAction = finalizeNVPTXDependences(ExtractIRFilesAction, + (*TC)->getTriple()); + } else /* isAMDGCN */ { + FinAction = finalizeAMDGCNDependences(ExtractIRFilesAction, (*TC)->getTriple()); - auto *ForEachWrapping = C.MakeAction( - ExtractIRFilesAction, FinAction); + } + ActionList TformInputs{PostLinkAction, FinAction}; - ActionList TformInputs{PostLinkAction, ForEachWrapping}; + // Replace the only code entry in the table, as confirmed by the + // previous transformation. auto *ReplaceFilesAction = C.MakeAction( - TformInputs, types::TY_Tempfiletable, types::TY_Tempfiletable); - ReplaceFilesAction->addReplaceColumnTform( - FileTableTformJobAction::COL_CODE, - FileTableTformJobAction::COL_CODE); - + TformInputs, types::TY_Tempfiletable); + ReplaceFilesAction->addReplaceCellTform(COL_CODE, 0); WrapperInputs.push_back(ReplaceFilesAction); } else { // For SPIRV-based targets - translate to SPIRV then optionally // compile ahead-of-time to native architecture - Action *BuildCodeAction = - (Action *)C.MakeAction( - ExtractIRFilesAction, types::TY_Tempfilelist); + auto *ExtractIRFilesAction = C.MakeAction( + PostLinkAction, types::TY_Tempfilelist); + // single column w/o title fits TY_Tempfilelist format + ExtractIRFilesAction->addExtractColumnTform(COL_CODE, + false /*drop titles*/); + Action *BuildCodeAction = C.MakeAction( + ExtractIRFilesAction, types::TY_Tempfilelist); // After the Link, wrap the files before the final host link - if (isAOT) { + if (isSpirvAOT) { types::ID OutType = types::TY_Tempfilelist; if (!DeviceCodeSplit) { OutType = (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga) @@ -4516,10 +4526,8 @@ class OffloadingActionBuilder final { } ActionList TformInputs{PostLinkAction, BuildCodeAction}; auto *ReplaceFilesAction = C.MakeAction( - TformInputs, types::TY_Tempfiletable, types::TY_Tempfiletable); - ReplaceFilesAction->addReplaceColumnTform( - FileTableTformJobAction::COL_CODE, - FileTableTformJobAction::COL_CODE); + TformInputs, types::TY_Tempfiletable); + ReplaceFilesAction->addReplaceColumnTform(COL_CODE, COL_CODE); WrapperInputs.push_back(ReplaceFilesAction); } @@ -6210,26 +6218,6 @@ static std::string GetTriplePlusArchString(const ToolChain *TC, return TriplePlusArch; } -static void CollectForEachInputs( - InputInfoList &InputInfos, const Action *SourceAction, const ToolChain *TC, - StringRef BoundArch, Action::OffloadKind TargetDeviceOffloadKind, - const std::map, InputInfo> - &CachedResults) { - for (const Action *Input : SourceAction->getInputs()) { - // Search for the Input, if not in the cache assume actions were collapsed - // so recurse. - auto Lookup = CachedResults.find( - {Input, - GetTriplePlusArchString(TC, BoundArch, TargetDeviceOffloadKind)}); - if (Lookup != CachedResults.end()) { - InputInfos.push_back(Lookup->second); - } else { - CollectForEachInputs(InputInfos, Input, TC, BoundArch, - TargetDeviceOffloadKind, CachedResults); - } - } -} - InputInfo Driver::BuildJobsForAction( Compilation &C, const Action *A, const ToolChain *TC, StringRef BoundArch, bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, @@ -6345,58 +6333,6 @@ InputInfo Driver::BuildJobsForActionNoCache( TargetDeviceOffloadKind); } - if (const ForEachWrappingAction *FEA = dyn_cast(A)) { - // Check that the main action wasn't already processed. - auto MainActionOutput = CachedResults.find( - {FEA->getJobAction(), - GetTriplePlusArchString(TC, BoundArch, TargetDeviceOffloadKind)}); - if (MainActionOutput != CachedResults.end()) { - // The input was processed on behalf of another foreach. - // Add entry in cache and return. - CachedResults[{FEA, GetTriplePlusArchString(TC, BoundArch, - TargetDeviceOffloadKind)}] = - MainActionOutput->second; - return MainActionOutput->second; - } - - // Build commands for the TFormInput then take any command added after as - // needing a llvm-foreach wrapping. - BuildJobsForAction(C, FEA->getTFormInput(), TC, BoundArch, - /*AtTopLevel=*/false, MultipleArchs, LinkingOutput, - CachedResults, TargetDeviceOffloadKind); - unsigned OffsetIdx = C.getJobs().size(); - BuildJobsForAction(C, FEA->getJobAction(), TC, BoundArch, - /*AtTopLevel=*/false, MultipleArchs, LinkingOutput, - CachedResults, TargetDeviceOffloadKind); - - auto begin = C.getJobs().getJobsForOverride().begin() + OffsetIdx; - auto end = C.getJobs().getJobsForOverride().end(); - - // Steal the commands. - llvm::SmallVector, 4> JobsToWrap( - std::make_move_iterator(begin), std::make_move_iterator(end)); - C.getJobs().getJobsForOverride().erase(begin, end); - - InputInfo ActionResult; - for (std::unique_ptr Cmd : - llvm::make_range(std::make_move_iterator(JobsToWrap.begin()), - std::make_move_iterator(JobsToWrap.end()))) { - const JobAction *SourceAction = cast(&Cmd->getSource()); - - ActionResult = CachedResults.at( - {SourceAction, - GetTriplePlusArchString(TC, BoundArch, TargetDeviceOffloadKind)}); - InputInfoList InputInfos; - CollectForEachInputs(InputInfos, SourceAction, TC, BoundArch, - TargetDeviceOffloadKind, CachedResults); - const Tool *Creator = &Cmd->getCreator(); - - tools::SYCL::constructLLVMForeachCommand( - C, *SourceAction, std::move(Cmd), InputInfos, ActionResult, Creator, - "", types::getTypeTempSuffix(ActionResult.getType())); - } - return ActionResult; - } ActionList Inputs = A->getInputs(); diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 07927a190e977..f3cda040c936b 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -390,7 +390,6 @@ Tool *ToolChain::getTool(Action::ActionClass AC) const { case Action::InputClass: case Action::BindArchClass: case Action::OffloadClass: - case Action::ForEachWrappingClass: case Action::LipoJobClass: case Action::DsymutilJobClass: case Action::VerifyDebugInfoJobClass: diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 2eb49d68c0ee1..dc3c39af9f16c 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8834,10 +8834,8 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, const InputInfoList &Inputs, const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const { - const SYCLPostLinkJobAction *SYCLPostLink = - dyn_cast(&JA); // Construct sycl-post-link command. - assert(SYCLPostLink && "Expecting SYCL post link job!"); + assert(isa(JA) && "Expecting SYCL post link job!"); ArgStringList CmdArgs; // See if device code splitting is requested @@ -8867,13 +8865,13 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, // Enable PI program metadata if (getToolChain().getTriple().isNVPTX()) addArgs(CmdArgs, TCArgs, {"-emit-program-metadata"}); - if (SYCLPostLink->getTrueType() == types::TY_LLVM_BC) { + if (JA.getType() == types::TY_LLVM_BC) { // single file output requested - this means only perform necessary IR // transformations (like specialization constant intrinsic lowering) and // output LLVMIR addArgs(CmdArgs, TCArgs, {"-ir-output-only"}); } else { - assert(SYCLPostLink->getTrueType() == types::TY_Tempfiletable); + assert(JA.getType() == types::TY_Tempfiletable); // Symbol file and specialization constant info generation is mandatory - // add options unconditionally addArgs(CmdArgs, TCArgs, {"-symbols"}); @@ -8888,7 +8886,8 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, addArgs(CmdArgs, TCArgs, {StringRef(getSYCLPostLinkOptimizationLevel(TCArgs))}); // specialization constants processing is mandatory - if (SYCLPostLink->getRTSetsSpecConstants()) + auto *SYCLPostLink = llvm::dyn_cast(&JA); + if (SYCLPostLink && SYCLPostLink->getRTSetsSpecConstants()) addArgs(CmdArgs, TCArgs, {"-spec-const=rt"}); else addArgs(CmdArgs, TCArgs, {"-spec-const=default"}); diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index c87a7a48dd169..9ddf27948e503 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -2409,15 +2409,6 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { ""); } - // Handles SYCL special types (accessor, sampler and stream) and modified - // types (arrays and pointers) - bool handleSpecialType(const FieldDecl *FD, QualType FieldTy, - KernelArgDescription Desc) { - for (const auto *Param : DC.getParamVarDeclsForCurrentField()) - addParam(FD, Param->getType(), Desc); - return true; - } - public: static constexpr const bool VisitInsideSimpleContainers = false; SyclOptReportCreator(Sema &S, SyclKernelDeclCreator &DC, SourceLocation Loc) @@ -2425,14 +2416,16 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); - if (isCXXRecordWithInitMember(RecordDecl, FinalizeMethodName)) - return handleSpecialType( - FD, FieldTy, KernelArgDescription(KernelArgDescription::Stream)); - if (dyn_cast(FieldTy->getAsRecordDecl())) - return handleSpecialType( - FD, FieldTy, KernelArgDescription(KernelArgDescription::Accessor)); - return handleSpecialType( - FD, FieldTy, KernelArgDescription(KernelArgDescription::Sampler)); + FieldTy.getAsString(); + KernelArgDescription Desc = + isCXXRecordWithInitMember(RecordDecl, FinalizeMethodName) + ? KernelArgDescription::Stream + : dyn_cast(FieldTy->getAsRecordDecl()) + ? KernelArgDescription::Accessor + : KernelArgDescription::Sampler; + for (const auto *Param : DC.getParamVarDeclsForCurrentField()) + addParam(FD, Param->getType(), Desc); + return true; } bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, @@ -2460,7 +2453,9 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { // the openCL kernel argument is of type __wrapper_class. if (!KernelParameter->getType()->isPointerType()) Desc = KernelArgDescription::WrappedPointer; - return handleSpecialType(FD, FieldTy, Desc); + for (const auto *Param : DC.getParamVarDeclsForCurrentField()) + addParam(FD, Param->getType(), Desc); + return true; } bool handleScalarType(FieldDecl *FD, QualType FieldTy) final { @@ -2470,8 +2465,9 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { bool handleSimpleArrayType(FieldDecl *FD, QualType FieldTy) final { // Simple arrays are always wrapped. - handleSpecialType(FD, FieldTy, - KernelArgDescription(KernelArgDescription::WrappedArray)); + for (const auto *Param : DC.getParamVarDeclsForCurrentField()) + addParam(FD, Param->getType(), + KernelArgDescription(KernelArgDescription::WrappedArray)); return true; } diff --git a/clang/test/Driver/sycl-int-footer.cpp b/clang/test/Driver/sycl-int-footer.cpp index 362493ffd5507..e1e9e62199ff7 100644 --- a/clang/test/Driver/sycl-int-footer.cpp +++ b/clang/test/Driver/sycl-int-footer.cpp @@ -1,9 +1,9 @@ /// Check compilation tool steps when using the integration footer // RUN: %clangxx -fsycl -include dummy.h %/s -### 2>&1 \ -// RUN: | FileCheck -check-prefix FOOTER %s -DSRCDIR=%/S +// RUN: | FileCheck -check-prefix FOOTER %s // FOOTER: clang{{.*}} "-fsycl-is-device"{{.*}} "-fsycl-int-header=[[INTHEADER:.+\.h]]" "-fsycl-int-footer=[[INTFOOTER:.+\h]]" "-sycl-std={{.*}}"{{.*}} "-include" "dummy.h" // FOOTER: append-file{{.*}} "[[INPUTFILE:.+\.cpp]]" "--append=[[INTFOOTER]]" "--orig-filename=[[INPUTFILE]]" "--output=[[APPENDEDSRC:.+\.cpp]]" -// FOOTER: clang{{.*}} "-include" "[[INTHEADER]]"{{.*}} "-fsycl-is-host"{{.*}} "-include" "dummy.h"{{.*}} "-internal-isystem" "[[SRCDIR]]" +// FOOTER: clang{{.*}} "-include" "[[INTHEADER]]"{{.*}} "-fsycl-is-host"{{.*}} "-include" "dummy.h"{{.*}} // FOOTER-NOT: "-include" "[[INTHEADER]]" /// Preprocessed file creation with integration footer diff --git a/clang/test/Driver/sycl-intelfpga-aoco-win.cpp b/clang/test/Driver/sycl-intelfpga-aoco-win.cpp index 3cc1587ebf54c..c96b8f2ff9028 100755 --- a/clang/test/Driver/sycl-intelfpga-aoco-win.cpp +++ b/clang/test/Driver/sycl-intelfpga-aoco-win.cpp @@ -3,7 +3,7 @@ // RUN: echo "void foo() {}" > %t.c // RUN: echo "void foo2() {}" > %t2.c // RUN: %clang -target x86_64-pc-windows-msvc -c -o %t.o %t.c -// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fintelfpga -c -o %t2.o %t2.c +// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -c -o %t2.o %t2.c // RUN: clang-offload-wrapper -o %t-aoco.bc -host=x86_64-pc-windows-msvc -kind=sycl -target=fpga_aoco-intel-unknown-sycldevice %t.aoco // RUN: llc -filetype=obj -o %t-aoco.o %t-aoco.bc // RUN: llvm-ar crv %t_aoco.a %t.o %t2.o %t-aoco.o diff --git a/clang/test/Driver/sycl-intelfpga-aoco.cpp b/clang/test/Driver/sycl-intelfpga-aoco.cpp index cf9160bd57968..2ba6edfbe2700 100755 --- a/clang/test/Driver/sycl-intelfpga-aoco.cpp +++ b/clang/test/Driver/sycl-intelfpga-aoco.cpp @@ -5,8 +5,8 @@ // RUN: echo "void foo() {}" > %t.c // RUN: echo "void foo2() {}" > %t2.c // RUN: %clang -c -o %t.o %t.c -// RUN: %clang -fsycl -fintelfpga -c -o %t2.o %t2.c -// RUN: %clang_cl -fsycl -fintelfpga -c -o %t2_cl.o %t2.c +// RUN: %clang -fsycl -c -o %t2.o %t2.c +// RUN: %clang_cl -fsycl -c -o %t2_cl.o %t2.c // RUN: clang-offload-wrapper -o %t-aoco.bc -host=x86_64-unknown-linux-gnu -kind=sycl -target=fpga_aoco-intel-unknown-sycldevice %t.aoco // RUN: llc -filetype=obj -o %t-aoco.o %t-aoco.bc // RUN: clang-offload-wrapper -o %t-aoco_cl.bc -host=x86_64-unknown-linux-gnu -kind=sycl -target=fpga_aoco-intel-unknown-sycldevice %t.aoco diff --git a/clang/test/Driver/sycl-offload-amdgcn.cpp b/clang/test/Driver/sycl-offload-amdgcn.cpp index ca7ff0474fda6..cbfaad9980337 100644 --- a/clang/test/Driver/sycl-offload-amdgcn.cpp +++ b/clang/test/Driver/sycl-offload-amdgcn.cpp @@ -28,13 +28,12 @@ // CHK-PHASES-NO-CC: 9: assembler, {8}, object, (host-sycl) // CHK-PHASES-NO-CC: 10: linker, {9}, image, (host-sycl) // CHK-PHASES-NO-CC: 11: linker, {5}, ir, (device-sycl) -// CHK-PHASES-NO-CC: 12: sycl-post-link, {11}, ir, (device-sycl) +// CHK-PHASES-NO-CC: 12: sycl-post-link, {11}, tempfiletable, (device-sycl) // CHK-PHASES-NO-CC: 13: file-table-tform, {12}, ir, (device-sycl) // CHK-PHASES-NO-CC: 14: backend, {13}, assembler, (device-sycl) // CHK-PHASES-NO-CC: 15: assembler, {14}, object, (device-sycl) // CHK-PHASES-NO-CC: 16: linker, {15}, image, (device-sycl) // CHK-PHASES-NO-CC: 17: linker, {16}, hip-fatbin, (device-sycl) -// CHK-PHASES-NO-CC: 18: foreach, {13, 17}, hip-fatbin, (device-sycl) -// CHK-PHASES-NO-CC: 19: file-table-tform, {12, 18}, tempfiletable, (device-sycl) -// CHK-PHASES-NO-CC: 20: clang-offload-wrapper, {19}, object, (device-sycl) -// CHK-PHASES-NO-CC: 21: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (amdgcn-amd-amdhsa-sycldevice)" {20}, image +// CHK-PHASES-NO-CC: 18: file-table-tform, {12, 17}, tempfiletable, (device-sycl) +// CHK-PHASES-NO-CC: 19: clang-offload-wrapper, {18}, object, (device-sycl) +// CHK-PHASES-NO-CC: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (amdgcn-amd-amdhsa-sycldevice)" {19}, image diff --git a/clang/test/Driver/sycl-offload-intelfpga.cpp b/clang/test/Driver/sycl-offload-intelfpga.cpp index a9779d59934d3..0b3f3caf418b4 100644 --- a/clang/test/Driver/sycl-offload-intelfpga.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga.cpp @@ -46,6 +46,7 @@ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK,CHK-FPGA-IMAGE %s // RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fsycl-link=image -Xshardware %t.o -o libfoo.a 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK,CHK-FPGA-IMAGE %s +// CHK-FPGA-LINK-NOT: clang-offload-bundler{{.*}} "-check-section" // CHK-FPGA-LINK: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown-sycldevice" "-inputs=[[INPUT:.+\.o]]" "-outputs=[[OUTPUT1:.+\.o]]" "-unbundle" // CHK-FPGA-LINK-NOT: clang-offload-bundler{{.*}} // CHK-FPGA-LINK: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" diff --git a/clang/test/Driver/sycl-offload-nvptx.cpp b/clang/test/Driver/sycl-offload-nvptx.cpp index d04b1eae99e0a..fb8fb31a68cea 100644 --- a/clang/test/Driver/sycl-offload-nvptx.cpp +++ b/clang/test/Driver/sycl-offload-nvptx.cpp @@ -5,23 +5,16 @@ /// Check action graph. // RUN: %clangxx -### -std=c++11 -target x86_64-unknown-linux-gnu -fsycl \ -// RUN: -fsycl-targets=nvptx64-nvidia-cuda --cuda-path=%S/Inputs/CUDA/usr/local/cuda \ +// RUN: -fsycl-targets=nvptx64-nvidia-nvcl-sycldevice --cuda-path=%S/Inputs/CUDA/usr/local/cuda \ // RUN: -fsycl-libspirv-path=%S/Inputs/SYCL/libspirv.bc %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-ACTIONS %s - -// CHK-ACTIONS: "-cc1" "-triple" "nvptx64-nvidia-cuda" "-aux-triple" "x86_64-unknown-linux-gnu"{{.*}} "-fsycl-is-device"{{.*}} "-Wno-sycl-strict"{{.*}} "-sycl-std=2020" {{.*}} "-emit-llvm-bc" {{.*}} "-internal-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libspirv.bc"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libdevice{{.*}}.10.bc"{{.*}} "-target-feature" "+ptx42"{{.*}} "-target-sdk-version=[[CUDA_VERSION:[0-9.]+]]"{{.*}} "-target-cpu" "sm_50"{{.*}} "-std=c++11"{{.*}} -// CHK-ACTIONS: sycl-post-link{{.*}} "-split=auto" -// CHK-ACTIONS: file-table-tform" "-extract=Code" "-drop_titles" -// CHK-ACTIONS: llvm-foreach" {{.*}} "--" "{{.*}}clang-13" -// CHK-ACTIONS: llvm-foreach" {{.*}} "--" "{{.*}}ptxas" -// CHK-ACTIONS: llvm-foreach" {{.*}} "--" "{{.*}}fatbinary" -// CHK-ACTIONS: file-table-tform" "-replace=Code,Code" +// CHK-ACTIONS: "-cc1" "-triple" "nvptx64-nvidia-nvcl-sycldevice" "-aux-triple" "x86_64-unknown-linux-gnu"{{.*}} "-fsycl-is-device"{{.*}} "-Wno-sycl-strict"{{.*}} "-sycl-std=2020" {{.*}} "-internal-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libspirv.bc"{{.*}} "-mlink-builtin-bitcode" "{{.*}}libdevice{{.*}}.10.bc"{{.*}} "-target-feature" "+ptx42"{{.*}} "-target-sdk-version=[[CUDA_VERSION:[0-9.]+]]"{{.*}} "-target-cpu" "sm_50"{{.*}} "-std=c++11"{{.*}} // CHK-ACTIONS-NOT: "-mllvm -sycl-opt" // CHK-ACTIONS: clang-offload-wrapper"{{.*}} "-host=x86_64-unknown-linux-gnu" "-target=nvptx64" "-kind=sycl"{{.*}} /// Check phases w/out specifying a compute capability. // RUN: %clangxx -ccc-print-phases -std=c++11 -target x86_64-unknown-linux-gnu -fsycl \ -// RUN: -fsycl-targets=nvptx64-nvidia-cuda %s 2>&1 \ +// RUN: -fsycl-targets=nvptx64-nvidia-nvcl-sycldevice %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASES-NO-CC %s // CHK-PHASES-NO-CC: 0: input, "{{.*}}", c++, (host-sycl) // CHK-PHASES-NO-CC: 1: append-footer, {0}, c++, (host-sycl) @@ -29,26 +22,22 @@ // CHK-PHASES-NO-CC: 3: input, "{{.*}}", c++, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 4: preprocessor, {3}, c++-cpp-output, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 5: compiler, {4}, ir, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 6: offload, "host-sycl (x86_64-unknown-linux-gnu)" {2}, "device-sycl (nvptx64-nvidia-cuda:sm_50)" {5}, c++-cpp-output +// CHK-PHASES-NO-CC: 6: offload, "host-sycl (x86_64-unknown-linux-gnu)" {2}, "device-sycl (nvptx64-nvidia-nvcl-sycldevice:sm_50)" {5}, c++-cpp-output // CHK-PHASES-NO-CC: 7: compiler, {6}, ir, (host-sycl) // CHK-PHASES-NO-CC: 8: backend, {7}, assembler, (host-sycl) // CHK-PHASES-NO-CC: 9: assembler, {8}, object, (host-sycl) // CHK-PHASES-NO-CC: 10: linker, {9}, image, (host-sycl) // CHK-PHASES-NO-CC: 11: linker, {5}, ir, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 12: sycl-post-link, {11}, ir, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 12: sycl-post-link, {11}, tempfiletable, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 13: file-table-tform, {12}, ir, (device-sycl, sm_50) // CHK-PHASES-NO-CC: 14: backend, {13}, assembler, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 15: assembler, {14}, object, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 16: linker, {14, 15}, cuda-fatbin, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 17: foreach, {13, 16}, cuda-fatbin, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 18: file-table-tform, {12, 17}, tempfiletable, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 19: clang-offload-wrapper, {18}, object, (device-sycl, sm_50) -// CHK-PHASES-NO-CC: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (nvptx64-nvidia-cuda:sm_50)" {19}, image +// CHK-PHASES-NO-CC: 15: file-table-tform, {12, 14}, tempfiletable, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 16: clang-offload-wrapper, {15}, object, (device-sycl, sm_50) +// CHK-PHASES-NO-CC: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (nvptx64-nvidia-nvcl-sycldevice:sm_50)" {16}, image /// Check phases specifying a compute capability. // RUN: %clangxx -ccc-print-phases -std=c++11 -target x86_64-unknown-linux-gnu -fsycl \ -// RUN: -fsycl-targets=nvptx64-nvidia-cuda \ -N.) +// RUN: -fsycl-targets=nvptx64-nvidia-nvcl-sycldevice \ // RUN: -Xsycl-target-backend "--cuda-gpu-arch=sm_35" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASES %s // CHK-PHASES: 0: input, "{{.*}}", c++, (host-sycl) @@ -57,18 +46,15 @@ N.) // CHK-PHASES: 3: input, "{{.*}}", c++, (device-sycl, sm_35) // CHK-PHASES: 4: preprocessor, {3}, c++-cpp-output, (device-sycl, sm_35) // CHK-PHASES: 5: compiler, {4}, ir, (device-sycl, sm_35) -// CHK-PHASES: 6: offload, "host-sycl (x86_64-unknown-linux-gnu)" {2}, "device-sycl (nvptx64-nvidia-cuda:sm_35)" {5}, c++-cpp-output +// CHK-PHASES: 6: offload, "host-sycl (x86_64-unknown-linux-gnu)" {2}, "device-sycl (nvptx64-nvidia-nvcl-sycldevice:sm_35)" {5}, c++-cpp-output // CHK-PHASES: 7: compiler, {6}, ir, (host-sycl) // CHK-PHASES: 8: backend, {7}, assembler, (host-sycl) // CHK-PHASES: 9: assembler, {8}, object, (host-sycl) // CHK-PHASES: 10: linker, {9}, image, (host-sycl) // CHK-PHASES: 11: linker, {5}, ir, (device-sycl, sm_35) -// CHK-PHASES: 12: sycl-post-link, {11}, ir, (device-sycl, sm_35) +// CHK-PHASES: 12: sycl-post-link, {11}, tempfiletable, (device-sycl, sm_35) // CHK-PHASES: 13: file-table-tform, {12}, ir, (device-sycl, sm_35) // CHK-PHASES: 14: backend, {13}, assembler, (device-sycl, sm_35) -// CHK-PHASES: 15: assembler, {14}, object, (device-sycl, sm_35) -// CHK-PHASES: 16: linker, {14, 15}, cuda-fatbin, (device-sycl, sm_35) -// CHK-PHASES: 17: foreach, {13, 16}, cuda-fatbin, (device-sycl, sm_35) -// CHK-PHASES: 18: file-table-tform, {12, 17}, tempfiletable, (device-sycl, sm_35) -// CHK-PHASES: 19: clang-offload-wrapper, {18}, object, (device-sycl, sm_35) -// CHK-PHASES: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (nvptx64-nvidia-cuda:sm_35)" {19}, image +// CHK-PHASES: 15: file-table-tform, {12, 14}, tempfiletable, (device-sycl, sm_35) +// CHK-PHASES: 16: clang-offload-wrapper, {15}, object, (device-sycl, sm_35) +// CHK-PHASES: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (nvptx64-nvidia-nvcl-sycldevice:sm_35)" {16}, image diff --git a/clang/test/Driver/sycl-offload.cpp b/clang/test/Driver/sycl-offload.cpp index 1208f4214104c..b0ec06346bb6c 100644 --- a/clang/test/Driver/sycl-offload.cpp +++ b/clang/test/Driver/sycl-offload.cpp @@ -47,55 +47,3 @@ // CHECK_S_LLVM: clang{{.*}} "-fsycl-is-device"{{.*}} "-emit-llvm"{{.*}} "-o" "[[DEVICE:.+\.ll]]" // CHECK_S_LLVM: clang{{.*}} "-fsycl-is-host"{{.*}} "-emit-llvm"{{.*}} "-o" "[[HOST:.+\.ll]]" // CHECK_S_LLVM: clang-offload-bundler{{.*}} "-type=ll"{{.*}} "-inputs=[[DEVICE]],[[HOST]]" - -/// Check for default device triple compilations based on object, archive or -/// forced from command line. -// RUN: echo "void foo();" > %t_dummy.cpp -// RUN: %clang -fsycl -c %t_dummy.cpp -o %t_dummy.o -// RUN: llvm-ar cr %t_dummy.a %t_dummy.o -// RUN: touch %t_empty.o -// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_x86_64 %t_dummy.o %s 2>&1 \ -// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_OBJ %s -// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_fpga %t_dummy.o %s 2>&1 \ -// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_OBJ %s -// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_gen %t_dummy.o %s 2>&1 \ -// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_OBJ %s -// RUN: %clangxx -### -fsycl -fintelfpga %t_dummy.o %s 2>&1 \ -// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_OBJ %s -// IMPLIED_DEVICE_OBJ: clang-offload-bundler{{.*}} "-type=o"{{.*}} "-targets=sycl-spir64-unknown-unknown-sycldevice,sycl-spir64_{{.*}}-unknown-unknown-sycldevice"{{.*}} "-unbundle" - -// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_x86_64 %t_dummy.a %s 2>&1 \ -// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s -// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_fpga %t_dummy.a %s 2>&1 \ -// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s -// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_gen %t_dummy.a %s 2>&1 \ -// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s -// RUN: %clangxx -### -fsycl -fintelfpga %t_dummy.a %s 2>&1 \ -// RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s -// IMPLIED_DEVICE_LIB: clang-offload-bundler{{.*}} "-type=a"{{.*}} "-targets=sycl-spir64-unknown-unknown-sycldevice,sycl-spir64_{{.*}}-unknown-unknown-sycldevice"{{.*}} "-unbundle" - -/// Check that the default device triple is not used with -fno-sycl-link-spirv -// RUN: %clangxx -### -fsycl -fno-sycl-link-spirv -fsycl-targets=spir64_x86_64 %t_dummy.o %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=NO_IMPLIED_DEVICE_OPT,NO_IMPLIED_DEVICE_CPU %s -// RUN: %clangxx -### -fsycl -fno-sycl-link-spirv -fsycl-targets=spir64_fpga %t_dummy.o %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=NO_IMPLIED_DEVICE_OPT,NO_IMPLIED_DEVICE_FPGA %s -// RUN: %clangxx -### -fsycl -fno-sycl-link-spirv -fsycl-targets=spir64_gen %t_dummy.o %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=NO_IMPLIED_DEVICE_OPT,NO_IMPLIED_DEVICE_GEN %s -// RUN: %clangxx -### -fsycl -fno-sycl-link-spirv -fintelfpga %t_dummy.o %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=NO_IMPLIED_DEVICE_OPT,NO_IMPLIED_DEVICE_FPGA %s -// NO_IMPLIED_DEVICE_CPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown-sycldevice" -// NO_IMPLIED_DEVICE_FPGA: clang{{.*}} "-triple" "spir64_fpga-unknown-unknown-sycldevice" -// NO_IMPLIED_DEVICE_GEN: clang{{.*}} "-triple" "spir64_gen-unknown-unknown-sycldevice" -// NO_IMPLIED_DEVICE_OPT-NOT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice"{{.*}} "-check-section" -// NO_IMPLIED_DEVICE_OPT-NOT: clang-offload-bundler{{.*}} "-targets={{.*}}spir64-unknown-unknown-sycldevice{{.*}}" "-unbundle" - -// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_x86_64 %t_empty.o %s 2>&1 \ -// RUN: | FileCheck -check-prefix NO_IMPLIED_DEVICE %s -// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_fpga %t_empty.o %s 2>&1 \ -// RUN: | FileCheck -check-prefix NO_IMPLIED_DEVICE %s -// RUN: %clangxx -### -fsycl -fsycl-targets=spir64_gen %t_empty.o %s 2>&1 \ -// RUN: | FileCheck -check-prefix NO_IMPLIED_DEVICE %s -// RUN: %clangxx -### -fsycl -fintelfpga %t_empty.o %s 2>&1 \ -// RUN: | FileCheck -check-prefix NO_IMPLIED_DEVICE %s -// NO_IMPLIED_DEVICE: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice"{{.*}} "-check-section" -// NO_IMPLIED_DEVICE-NOT: clang-offload-bundler{{.*}} "-targets={{.*}}spir64-unknown-unknown-sycldevice{{.*}}" "-unbundle" diff --git a/libclc/amdgcn-amdhsa/libspirv/SOURCES b/libclc/amdgcn-amdhsa/libspirv/SOURCES index 95c0361987929..e291cd7d16538 100644 --- a/libclc/amdgcn-amdhsa/libspirv/SOURCES +++ b/libclc/amdgcn-amdhsa/libspirv/SOURCES @@ -7,7 +7,3 @@ math/sin.cl math/sqrt.cl math/atan.cl math/cbrt.cl -workitem/get_max_sub_group_size.cl -workitem/get_num_sub_groups.cl -workitem/get_sub_group_id.cl -workitem/get_sub_group_size.cl diff --git a/libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl b/libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl index d499e1de2a90a..fafa64c82059c 100644 --- a/libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl +++ b/libclc/amdgcn-amdhsa/libspirv/math/sqrt.cl @@ -12,8 +12,3 @@ _CLC_OVERLOAD _CLC_DECL _CLC_CONSTFN __clc_fp32_t __spirv_ocl_sqrt(__clc_fp32_t In) { return __builtin_amdgcn_sqrtf(In); } - -_CLC_OVERLOAD _CLC_DECL _CLC_CONSTFN __clc_fp64_t -__spirv_ocl_sqrt(__clc_fp64_t In) { - return __builtin_amdgcn_sqrt(In); -} diff --git a/libclc/amdgcn-amdhsa/libspirv/synchronization/barrier.cl b/libclc/amdgcn-amdhsa/libspirv/synchronization/barrier.cl index 5989cc75be0fd..7dd218d2f1e53 100644 --- a/libclc/amdgcn-amdhsa/libspirv/synchronization/barrier.cl +++ b/libclc/amdgcn-amdhsa/libspirv/synchronization/barrier.cl @@ -6,7 +6,6 @@ // //===----------------------------------------------------------------------===// -#include #include void __clc_amdgcn_s_waitcnt(unsigned flags); diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl deleted file mode 100644 index 394405a0c1931..0000000000000 --- a/libclc/amdgcn-amdhsa/libspirv/workitem/get_max_sub_group_size.cl +++ /dev/null @@ -1,28 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include - -// FIXME: Remove the following workaround once the clang change is released. -// This is for backward compatibility with older clang which does not define -// __AMDGCN_WAVEFRONT_SIZE. It does not consider -mwavefrontsize64. -// See: -// https://github.com/intel/llvm/blob/sycl/clang/lib/Basic/Targets/AMDGPU.h#L414 -// and: -// https://github.com/intel/llvm/blob/sycl/clang/lib/Basic/Targets/AMDGPU.cpp#L421 -#ifndef __AMDGCN_WAVEFRONT_SIZE -#if __gfx1010__ || __gfx1011__ || __gfx1012__ || __gfx1030__ || __gfx1031__ -#define __AMDGCN_WAVEFRONT_SIZE 32 -#else -#define __AMDGCN_WAVEFRONT_SIZE 64 -#endif -#endif - -_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupMaxSize() { - return __AMDGCN_WAVEFRONT_SIZE; -} diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl deleted file mode 100644 index 1487ba91b18e8..0000000000000 --- a/libclc/amdgcn-amdhsa/libspirv/workitem/get_num_sub_groups.cl +++ /dev/null @@ -1,18 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include - -_CLC_DEF _CLC_OVERLOAD uint __spirv_NumSubgroups() { - size_t size_x = __spirv_WorkgroupSize_x(); - size_t size_y = __spirv_WorkgroupSize_y(); - size_t size_z = __spirv_WorkgroupSize_z(); - uint sg_size = __spirv_SubgroupMaxSize(); - size_t linear_size = size_z * size_y * size_x; - return (uint)((linear_size + sg_size - 1) / sg_size); -} diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl deleted file mode 100644 index 6b6095d51141a..0000000000000 --- a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_id.cl +++ /dev/null @@ -1,20 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include - -_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupId() { - size_t id_x = __spirv_LocalInvocationId_x(); - size_t id_y = __spirv_LocalInvocationId_y(); - size_t id_z = __spirv_LocalInvocationId_z(); - size_t size_x = __spirv_WorkgroupSize_x(); - size_t size_y = __spirv_WorkgroupSize_y(); - size_t size_z = __spirv_WorkgroupSize_z(); - uint sg_size = __spirv_SubgroupMaxSize(); - return (id_z * size_y * size_x + id_y * size_x + id_x) / sg_size; -} diff --git a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl b/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl deleted file mode 100644 index 5a9d35aa0e734..0000000000000 --- a/libclc/amdgcn-amdhsa/libspirv/workitem/get_sub_group_size.cl +++ /dev/null @@ -1,22 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include - -_CLC_DEF _CLC_OVERLOAD uint __spirv_SubgroupSize() { - if (__spirv_SubgroupId() != __spirv_NumSubgroups() - 1) { - return __spirv_SubgroupMaxSize(); - } - size_t size_x = __spirv_WorkgroupSize_x(); - size_t size_y = __spirv_WorkgroupSize_y(); - size_t size_z = __spirv_WorkgroupSize_z(); - size_t linear_size = size_z * size_y * size_x; - size_t uniform_groups = __spirv_NumSubgroups() - 1; - size_t uniform_size = __spirv_SubgroupMaxSize() * uniform_groups; - return linear_size - uniform_size; -} diff --git a/libclc/ptx-nvidiacl/libspirv/group/collectives.cl b/libclc/ptx-nvidiacl/libspirv/group/collectives.cl index b14afb0e73dc0..b27d4f9289bac 100644 --- a/libclc/ptx-nvidiacl/libspirv/group/collectives.cl +++ b/libclc/ptx-nvidiacl/libspirv/group/collectives.cl @@ -151,7 +151,6 @@ __clc__SubgroupBitwiseAny(uint op, bool predicate, bool *carry) { #define __CLC_MAX(x, y) ((x > y) ? (x) : (y)) #define __CLC_OR(x, y) (x | y) #define __CLC_AND(x, y) (x & y) -#define __CLC_MUL(x, y) (x * y) #define __CLC_SUBGROUP_COLLECTIVE_BODY(OP, TYPE, IDENTITY) \ uint sg_lid = __spirv_SubgroupLocalInvocationId(); \ @@ -211,18 +210,6 @@ __CLC_SUBGROUP_COLLECTIVE(FAdd, __CLC_ADD, half, 0) __CLC_SUBGROUP_COLLECTIVE(FAdd, __CLC_ADD, float, 0) __CLC_SUBGROUP_COLLECTIVE(FAdd, __CLC_ADD, double, 0) -__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, char, 0) -__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, uchar, 0) -__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, short, 0) -__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, ushort, 0) -__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, int, 0) -__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, uint, 0) -__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, long, 0) -__CLC_SUBGROUP_COLLECTIVE(IMul, __CLC_MUL, ulong, 0) -__CLC_SUBGROUP_COLLECTIVE(FMul, __CLC_MUL, half, 0) -__CLC_SUBGROUP_COLLECTIVE(FMul, __CLC_MUL, float, 0) -__CLC_SUBGROUP_COLLECTIVE(FMul, __CLC_MUL, double, 0) - __CLC_SUBGROUP_COLLECTIVE(SMin, __CLC_MIN, char, CHAR_MAX) __CLC_SUBGROUP_COLLECTIVE(UMin, __CLC_MIN, uchar, UCHAR_MAX) __CLC_SUBGROUP_COLLECTIVE(SMin, __CLC_MIN, short, SHRT_MAX) @@ -251,12 +238,12 @@ __CLC_SUBGROUP_COLLECTIVE(FMax, __CLC_MAX, double, -DBL_MAX) #undef __CLC_SUBGROUP_COLLECTIVE #undef __CLC_SUBGROUP_COLLECTIVE_REDUX -#define __CLC_GROUP_COLLECTIVE_INNER(SPIRV_NAME, CLC_NAME, OP, TYPE, IDENTITY) \ +#define __CLC_GROUP_COLLECTIVE(NAME, OP, TYPE, IDENTITY) \ _CLC_DEF _CLC_OVERLOAD _CLC_CONVERGENT TYPE __CLC_APPEND( \ - __spirv_Group, SPIRV_NAME)(uint scope, uint op, TYPE x) { \ + __spirv_Group, NAME)(uint scope, uint op, TYPE x) { \ TYPE carry = IDENTITY; \ /* Perform GroupOperation within sub-group */ \ - TYPE sg_x = __CLC_APPEND(__clc__Subgroup, CLC_NAME)(op, x, &carry); \ + TYPE sg_x = __CLC_APPEND(__clc__Subgroup, NAME)(op, x, &carry); \ if (scope == Subgroup) { \ return sg_x; \ } \ @@ -296,18 +283,6 @@ __CLC_SUBGROUP_COLLECTIVE(FMax, __CLC_MAX, double, -DBL_MAX) return result; \ } -#define __CLC_GROUP_COLLECTIVE_4(NAME, OP, TYPE, IDENTITY) \ - __CLC_GROUP_COLLECTIVE_INNER(NAME, NAME, OP, TYPE, IDENTITY) -#define __CLC_GROUP_COLLECTIVE_5(SPIRV_NAME, CLC_NAME, OP, TYPE, IDENTITY) \ - __CLC_GROUP_COLLECTIVE_INNER(SPIRV_NAME, CLC_NAME, OP, TYPE, IDENTITY) - -#define DISPATCH_TO_CLC_GROUP_COLLECTIVE_MACRO(_1, _2, _3, _4, _5, NAME, ...) \ - NAME -#define __CLC_GROUP_COLLECTIVE(...) \ - DISPATCH_TO_CLC_GROUP_COLLECTIVE_MACRO( \ - __VA_ARGS__, __CLC_GROUP_COLLECTIVE_5, __CLC_GROUP_COLLECTIVE_4) \ - (__VA_ARGS__) - __CLC_GROUP_COLLECTIVE(BitwiseOr, __CLC_OR, bool, false); __CLC_GROUP_COLLECTIVE(BitwiseAny, __CLC_AND, bool, true); _CLC_DEF _CLC_OVERLOAD _CLC_CONVERGENT bool __spirv_GroupAny(uint scope, @@ -331,19 +306,6 @@ __CLC_GROUP_COLLECTIVE(FAdd, __CLC_ADD, half, 0) __CLC_GROUP_COLLECTIVE(FAdd, __CLC_ADD, float, 0) __CLC_GROUP_COLLECTIVE(FAdd, __CLC_ADD, double, 0) -// There is no Mul group op in SPIR-V, use non-uniform variant instead. -__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, char, 0) -__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, uchar, 0) -__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, short, 0) -__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, ushort, 0) -__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, int, 0) -__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, uint, 0) -__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, long, 0) -__CLC_GROUP_COLLECTIVE(NonUniformIMul, IMul, __CLC_MUL, ulong, 0) -__CLC_GROUP_COLLECTIVE(NonUniformFMul, FMul, __CLC_MUL, half, 0) -__CLC_GROUP_COLLECTIVE(NonUniformFMul, FMul, __CLC_MUL, float, 0) -__CLC_GROUP_COLLECTIVE(NonUniformFMul, FMul, __CLC_MUL, double, 0) - __CLC_GROUP_COLLECTIVE(SMin, __CLC_MIN, char, CHAR_MAX) __CLC_GROUP_COLLECTIVE(UMin, __CLC_MIN, uchar, UCHAR_MAX) __CLC_GROUP_COLLECTIVE(SMin, __CLC_MIN, short, SHRT_MAX) @@ -382,9 +344,6 @@ _CLC_DECL _CLC_CONVERGENT half _Z17__spirv_GroupFMaxjjDF16_(uint scope, uint op, return __spirv_GroupFMax(scope, op, x); } -#undef __CLC_GROUP_COLLECTIVE_4 -#undef __CLC_GROUP_COLLECTIVE_5 -#undef DISPATCH_TO_CLC_GROUP_COLLECTIVE_MACRO #undef __CLC_GROUP_COLLECTIVE #undef __CLC_AND @@ -392,7 +351,6 @@ _CLC_DECL _CLC_CONVERGENT half _Z17__spirv_GroupFMaxjjDF16_(uint scope, uint op, #undef __CLC_MAX #undef __CLC_MIN #undef __CLC_ADD -#undef __CLC_MUL long __clc__get_linear_local_id() { size_t id_x = __spirv_LocalInvocationId_x(); diff --git a/opencl/opencl-aot/source/main.cpp b/opencl/opencl-aot/source/main.cpp index 5b97ca9b09b77..8c09f618744bc 100644 --- a/opencl/opencl-aot/source/main.cpp +++ b/opencl/opencl-aot/source/main.cpp @@ -20,7 +20,6 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" -#include "llvm/Support/raw_ostream.h" #include #include @@ -64,12 +63,6 @@ using CLContextSPtr = // same as cl_context, should // initialized with ContextDeleter -static bool verbose = false; -static llvm::raw_ostream &logs() { - static llvm::raw_ostream &logger = verbose ? llvm::outs() : llvm::nulls(); - return logger; -} - /*! \brief Generate OpenCL program from OpenCL program binary (in ELF format) or * SPIR-V binary file or LLVM IR (bitcode file) or OpenCL source file * \param FileNames (const std::vector). @@ -227,9 +220,9 @@ generateProgramsFromInput(const std::vector &FileNames, Programs.push_back(Program); - logs() << "OpenCL program was successfully created from " + - SupportedTypesToNames[FileType] + " file " + FileName - << '\n'; + std::cout << "OpenCL program was successfully created from " + + SupportedTypesToNames[FileType] + " file " + FileName + << '\n'; } // step 5: create guards to return result safely @@ -356,9 +349,6 @@ int main(int Argc, char *Argv[]) { cl::list OptBuildOptions("bo", cl::ZeroOrMore, cl::desc("Set OpenCL build options"), cl::value_desc("build options")); - cl::opt OptVerbose("verbose", cl::desc("Show verbose logs"), - cl::location(verbose)); - cl::alias OptV("v", cl::aliasopt(OptVerbose)); cl::ParseCommandLineOptions( Argc, Argv, @@ -389,8 +379,8 @@ int main(int Argc, char *Argv[]) { // If not a link command, we only handle one input file each time. if (OptCommand != Commands::link && InputFileNames.size() >= 1) { - logs() << "WARNING: Can " << CmdToCmdInfoMap[OptCommand].first - << " only 1 file each time. Extra file(s) will be ignored!\n"; + std::cout << "WARNING: Can " << CmdToCmdInfoMap[OptCommand].first + << " only 1 file each time. Extra file(s) will be ignored!\n"; break; } InputFileNames.push_back(Item); @@ -435,7 +425,7 @@ int main(int Argc, char *Argv[]) { return CLErr; } - logs() << "Platform name: " << PlatformName << '\n'; + std::cout << "Platform name: " << PlatformName << '\n'; // step 3: get OpenCL device cl_device_id DeviceId = nullptr; @@ -456,7 +446,7 @@ int main(int Argc, char *Argv[]) { return CLErr; } - logs() << "Device name: " << DeviceName << '\n'; + std::cout << "Device name: " << DeviceName << '\n'; // step 4: get driver version std::string DriverVersion; @@ -468,7 +458,7 @@ int main(int Argc, char *Argv[]) { return CLErr; } - logs() << "Driver version: " << DriverVersion << '\n'; + std::cout << "Driver version: " << DriverVersion << '\n'; // step 5: enable optimizations for target CPU architecture if (OptMArch.getNumOccurrences()) { @@ -497,8 +487,8 @@ int main(int Argc, char *Argv[]) { << ArchTypeToArchTypeName[OptMArch] << '\n'; return OPENCL_AOT_TARGET_CPU_ARCH_FAILURE; } - logs() << "Setting target CPU architecture to " - << ArchTypeToArchTypeName[OptMArch] << '\n'; + std::cout << "Setting target CPU architecture to " + << ArchTypeToArchTypeName[OptMArch] << '\n'; } // step 6: generate OpenCL programs from input files @@ -536,7 +526,7 @@ int main(int Argc, char *Argv[]) { if (!ParentDir.empty()) { BuildOptions += " -I \"" + std::string(ParentDir) + '\"'; } - logs() << "Using build options: " << BuildOptions << '\n'; + std::cout << "Using build options: " << BuildOptions << '\n'; } // step 8: compile | build | link OpenCL program @@ -574,9 +564,9 @@ int main(int Argc, char *Argv[]) { } if (!CompilerBuildLog.empty()) { - logs() << "\n" - << CmdToCmdInfoMap[OptCommand].first << " log:\n" - << CompilerBuildLog << '\n'; + std::cout << "\n" + << CmdToCmdInfoMap[OptCommand].first << " log:\n" + << CompilerBuildLog << '\n'; } if (clFailed(CLErr)) { @@ -621,8 +611,8 @@ int main(int Argc, char *Argv[]) { << CmdToCmdInfoMap[OptCommand].second << " file" << '\n'; return OPENCL_AOT_FAILED_TO_CREATE_ELF; } - logs() << "OpenCL program " << CmdToCmdInfoMap[OptCommand].second - << " file was successfully created: " << OutputFileName << '\n'; + std::cout << "OpenCL program " << CmdToCmdInfoMap[OptCommand].second + << " file was successfully created: " << OutputFileName << '\n'; return CL_SUCCESS; } diff --git a/sycl/doc/CompilerAndRuntimeDesign.md b/sycl/doc/CompilerAndRuntimeDesign.md index f55c5df905aa2..e98233eb73951 100644 --- a/sycl/doc/CompilerAndRuntimeDesign.md +++ b/sycl/doc/CompilerAndRuntimeDesign.md @@ -548,15 +548,13 @@ down to the NVPTX Back End. All produced bitcode depends on two libraries, During the "PTX target processing" in the device linking step [Device code post-link step](#device-code-post-link-step), the llvm bitcode -objects for the CUDA target are linked together during the common -`llvm-link` step and then split using the `sycl-post-link` tool. -For each temporary bitcode file, clang is invoked for the temporary file to link -`libspirv-nvptx64--nvidiacl.bc` and `libdevice.bc` and compile the resulting -module to PTX using the NVPTX backend. The resulting PTX file is assembled -into a cubin using the `ptxas` tool (part of the CUDA SDK). The PTX file and -cubin are assembled together using `fatbinary` to produce a CUDA fatbin. -The produced CUDA fatbins then replace the llvm bitcode files in the file table generated -by `sycl-post-link`. The resulting table is passed to the offload wrapper tool. +objects for the CUDA target are linked together alongside +`libspirv-nvptx64--nvidiacl.bc` and `libdevice.bc`, compiled to PTX +using the NVPTX backend and assembled into a cubin using the `ptxas` +tool (part of the CUDA SDK). The PTX file and cubin are assembled +together using `fatbinary` to produce a CUDA fatbin. The CUDA fatbin +then replaces the llvm bitcode file in the file table generated by +`sycl-post-link`. The resulting table is passed to the offload wrapper tool. ![NVPTX AOT build](images/DevicePTXProcessing.svg) diff --git a/sycl/doc/GetStartedGuide.md b/sycl/doc/GetStartedGuide.md index 8eb54324c770e..35ff90a6d87af 100644 --- a/sycl/doc/GetStartedGuide.md +++ b/sycl/doc/GetStartedGuide.md @@ -166,10 +166,10 @@ To enable support for ROCm devices, follow the instructions for the Linux DPC++ toolchain, but add the `--rocm` flag to `configure.py` Enabling this flag requires an installation of -ROCm 4.2.0 on the system, refer to +ROCm 4.1.0 on the system, refer to [AMD ROCm Installation Guide for Linux](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation-Guide.html). -Currently, the only combination tested is Ubuntu 18.04 with ROCm 4.2.0 using a Vega20 gfx906. +Currently, the only combination tested is Ubuntu 18.04 with ROCm 4.1.0 using a Vega20 gfx906. [LLD](https://llvm.org/docs/AMDGPUUsage.html) is necessary for the AMD GPU compilation chain. The AMDGPU backend generates a standard ELF [ELF] relocatable code object that can be linked by lld to @@ -734,7 +734,7 @@ which contains all the symbols required. ### ROCm back-end limitations * For supported Operating Systems, please refer to the [Supported Operating Systems](https://github.com/RadeonOpenCompute/ROCm#supported-operating-systems) -* The only combination tested is Ubuntu 18.04 with ROCm 4.2 using a Vega20 gfx906. +* The only combination tested is Ubuntu 18.04 with ROCm 4.1 using a Vega20 gfx906. * Judging from the current [test](https://github.com/zjin-lcf/oneAPI-DirectProgramming) results, there is still a lot of room for improvement in ROCm back-end support. The current problems include three aspects. The first one is at compile time: the `barrier` and `atomic` keywords are not supported. diff --git a/sycl/doc/images/DeviceLinkAndWrap.svg b/sycl/doc/images/DeviceLinkAndWrap.svg index 1234b368fc18b..10ea7704f79d8 100644 --- a/sycl/doc/images/DeviceLinkAndWrap.svg +++ b/sycl/doc/images/DeviceLinkAndWrap.svg @@ -9,7 +9,7 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="DeviceLinkAndWrap.svg" - inkscape:version="0.92.3 (2405546, 2018-03-11)" + inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)" id="svg8" version="1.1" viewBox="0 0 205.79753 221.03191" @@ -1827,78 +1827,6 @@ x2="517.42999" y2="349.29999" spreadMethod="pad" /> - - - - - - - - - - - - - - - - - - - - - - - - + - Device LLVM IR - + id="tspan897">Device LLVM IR + @@ -2207,7 +2143,7 @@ id="path1013" inkscape:connector-curvature="0" /> @@ -2222,7 +2158,7 @@ id="path1019" inkscape:connector-curvature="0" /> @@ -2237,7 +2173,7 @@ id="path1025" inkscape:connector-curvature="0" /> @@ -2303,12 +2239,12 @@ @@ -2398,13 +2334,11 @@ - file - + id="tspan1119">file - - - + id="tspan1131">- - table - + id="tspan1143">table - - - + id="tspan1155">- - tform - + id="tspan1167">tform - extract “Code” - + id="tspan1179">extract “Code” - AOT backend - + id="tspan1243">AOT backend - @@ -2629,13 +2546,11 @@ - PTX target - + id="tspan1307">PTX target - processing - + id="tspan1319">processing - clang - + id="tspan1383">clang - - - + id="tspan1395">- - offload - + id="tspan1407">offload - - - + id="tspan1419">- - wrapper - + id="tspan1431">wrapper - s - + id="tspan1495">s - ycl - + id="tspan1507">ycl - - - + id="tspan1519">- - post - + id="tspan1531">post - - - + id="tspan1543">- - link - + id="tspan1555">link - file - + id="tspan1619">file - - - + id="tspan1631">- - table - + id="tspan1643">table - - - + id="tspan1655">- - tform - + id="tspan1667">tform - replace “Code” - + id="tspan1679">replace “Code” - llvm - + id="tspan1743">llvm - - - + id="tspan1755">- - spirv - + id="tspan1767">spirv + @@ -3655,13 +3533,11 @@ - Wrapper object - + id="tspan2127">Wrapper object - Device code - + id="tspan2175">Device code - (f r o m l - + id="tspan2191">(f r o m l - l - + id="tspan2203">l - v m - + id="tspan2215">v m - - - + id="tspan2227">- - l i n k) - + id="tspan2239">l i n k) - (t o h o s t l i n k e r) - + id="tspan2251">(t o h o s t l i n k e r) + @@ -3859,13 +3726,11 @@ - TY_tempfiletable - + id="tspan2265">TY_tempfiletable - TY_tempfilelist - + id="tspan2277">TY_tempfilelist + + + + + s + + + + + ingle file + + + + + + PTX target compilation - Split code - + id="tspan2343">Split code - file - + id="tspan1119-5">file - - - + id="tspan1131-3">- - table - + id="tspan1143-6">table - - - + id="tspan1155-0">- - tform - + id="tspan1167-8">tform copy “Code” - All targets - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + y="0">All targets diff --git a/sycl/doc/images/DevicePTXProcessing.svg b/sycl/doc/images/DevicePTXProcessing.svg index df690ec5fb08b..a639d2906a6c8 100644 --- a/sycl/doc/images/DevicePTXProcessing.svg +++ b/sycl/doc/images/DevicePTXProcessing.svg @@ -9,7 +9,7 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="DevicePTXProcessing.svg" - inkscape:version="0.92.3 (2405546, 2018-03-11)" + inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)" id="svg8" version="1.1" viewBox="0 0 205.79753 221.03191" @@ -2204,16 +2204,16 @@ fit-margin-left="0" fit-margin-top="0" inkscape:window-maximized="1" - inkscape:window-y="0" - inkscape:window-x="1920" - inkscape:window-height="1163" + inkscape:window-y="-8" + inkscape:window-x="1912" + inkscape:window-height="1017" inkscape:window-width="1920" showgrid="false" inkscape:document-rotation="0" inkscape:current-layer="layer1" inkscape:document-units="mm" - inkscape:cy="330.42371" - inkscape:cx="228.34098" + inkscape:cy="361.85228" + inkscape:cx="371.91241" inkscape:zoom="1.4" inkscape:pageshadow="2" inkscape:pageopacity="0.0" @@ -2318,16 +2318,14 @@ d="m 125.31238,20.80355 0.32455,-1.291166 1.29117,-0.324556 z" /> - File table - + y="15.401005">File table - Clang - + y="84.249756">Clang @@ -2495,13 +2491,11 @@ - clang - + x="0 7.7220001 15.444 23.166 30.94416">clang - - - + x="0">- - offload - + x="0 7.7922001 15.5142 23.2362 30.9582 38.736359 46.528561">offload - - - + x="0">- - wrapper - + x="0 7.7922001 15.5142 23.2362 30.9582 38.736359 46.458359">wrapper - PTX target processing - + y="60.97049">PTX target processing @@ -2697,13 +2681,11 @@ - Wrapper object - + x="0 12.11652 16.79184 23.517 30.831841 38.146679 45.138599 50.038559 53.141399 60.540482 67.911484 71.267036 78.258957 84.099602">Wrapper object - Device code - + x="0 8.6493597 15.484464 21.841393 25.076113 30.968927 37.930607 41.151264 46.917503 54.329231 61.712833">Device code - (from sycl-post-link) - + y="17.476978">(from sycl-post-link) @@ -2814,13 +2792,11 @@ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.953px;font-family:Calibri;-inkscape-font-specification:'Calibri, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.352778" id="text899-9" x="73.031509" - y="68.195061"> - libspirv.bc - + sodipodi:role="line">libspirv.bc - libdevice.bc - + sodipodi:role="line">libdevice.bc - ptxas - + y="113.47669">ptxas @@ -2964,13 +2936,11 @@ id="text1309-7" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.953px;font-family:Consolas;-inkscape-font-specification:'Consolas, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.352778" x="102.06758" - y="137.37424"> - fatbin - + y="137.37424">fatbin - ptx - + id="tspan3794">ptx - cubin - + id="tspan3916">cubin - LLVM IR - + y="73.327454">LLVM IR - CUDA fatbin - + id="tspan2303">CUDA fatbin - (to host linker) - + y="216.68318">(to host linker) - (nvptx backend) - + y="88.973877">(nvptx backend) + (Single row) - file-table-tform - + y="33.349266">file-table-tform - (Copy "Code") - + y="37.806171">(Copy "Code") - LLVM IR - + y="47.484673">LLVM IR - file-table-tform - + y="161.4454">file-table-tform - (Replace "Code") - + y="165.9023">(Replace "Code") - File table - + id="tspan2303-1">File table > ArgsStorage, - std::vector AccStorage, - std::vector> SharedPtrStorage, - std::vector Requirements, - std::vector Events, - detail::code_location loc = {}) + CG(CGType Type, std::vector> ArgsStorage, + std::vector AccStorage, + std::vector> SharedPtrStorage, + std::vector Requirements, + std::vector Events, detail::code_location loc = {}) : MType(Type), MArgsStorage(std::move(ArgsStorage)), MAccStorage(std::move(AccStorage)), MSharedPtrStorage(std::move(SharedPtrStorage)), @@ -189,7 +188,7 @@ class CommandGroup { MColumn = loc.columnNumber(); } - CommandGroup(CommandGroup &&CG) = default; + CG(CG &&CommandGroup) = default; CGType getType() { return static_cast(getUnversionedCGType(MType)); } @@ -207,7 +206,7 @@ class CommandGroup { return convertToExtendedMembers(MSharedPtrStorage[0]); } - virtual ~CommandGroup() = default; + virtual ~CG() = default; private: CGType MType; @@ -235,7 +234,7 @@ class CommandGroup { }; /// "Execute kernel" command group class. -class CGExecKernel : public CommandGroup { +class CGExecKernel : public CG { public: /// Stores ND-range description. NDRDescT MNDRDesc; @@ -257,9 +256,9 @@ class CGExecKernel : public CommandGroup { detail::OSModuleHandle OSModuleHandle, std::vector> Streams, CGType Type, detail::code_location loc = {}) - : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CG(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MNDRDesc(std::move(NDRDesc)), MHostKernel(std::move(HKernel)), MSyclKernel(std::move(SyclKernel)), MArgs(std::move(Args)), MKernelName(std::move(KernelName)), MOSModuleHandle(OSModuleHandle), @@ -291,7 +290,7 @@ class CGExecKernel : public CommandGroup { }; /// "Copy memory" command group class. -class CGCopy : public CommandGroup { +class CGCopy : public CG { void *MSrc; void *MDst; @@ -303,16 +302,16 @@ class CGCopy : public CommandGroup { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CommandGroup(CopyType, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CG(CopyType, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MSrc(Src), MDst(Dst) {} void *getSrc() { return MSrc; } void *getDst() { return MDst; } }; /// "Fill memory" command group class. -class CGFill : public CommandGroup { +class CGFill : public CG { public: std::vector MPattern; Requirement *MPtr; @@ -324,16 +323,15 @@ class CGFill : public CommandGroup { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CommandGroup(CGType::Fill, std::move(ArgsStorage), - std::move(AccStorage), std::move(SharedPtrStorage), - std::move(Requirements), std::move(Events), - std::move(loc)), + : CG(CGType::Fill, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MPattern(std::move(Pattern)), MPtr((Requirement *)Ptr) {} Requirement *getReqToFill() { return MPtr; } }; /// "Update host" command group class. -class CGUpdateHost : public CommandGroup { +class CGUpdateHost : public CG { Requirement *MPtr; public: @@ -343,17 +341,16 @@ class CGUpdateHost : public CommandGroup { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CommandGroup(CGType::UpdateHost, std::move(ArgsStorage), - std::move(AccStorage), std::move(SharedPtrStorage), - std::move(Requirements), std::move(Events), - std::move(loc)), + : CG(CGType::UpdateHost, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MPtr((Requirement *)Ptr) {} Requirement *getReqToUpdate() { return MPtr; } }; /// "Copy USM" command group class. -class CGCopyUSM : public CommandGroup { +class CGCopyUSM : public CG { void *MSrc; void *MDst; size_t MLength; @@ -366,10 +363,9 @@ class CGCopyUSM : public CommandGroup { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CommandGroup(CGType::CopyUSM, std::move(ArgsStorage), - std::move(AccStorage), std::move(SharedPtrStorage), - std::move(Requirements), std::move(Events), - std::move(loc)), + : CG(CGType::CopyUSM, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MSrc(Src), MDst(Dst), MLength(Length) {} void *getSrc() { return MSrc; } @@ -378,7 +374,7 @@ class CGCopyUSM : public CommandGroup { }; /// "Fill USM" command group class. -class CGFillUSM : public CommandGroup { +class CGFillUSM : public CG { std::vector MPattern; void *MDst; size_t MLength; @@ -391,10 +387,9 @@ class CGFillUSM : public CommandGroup { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CommandGroup(CGType::FillUSM, std::move(ArgsStorage), - std::move(AccStorage), std::move(SharedPtrStorage), - std::move(Requirements), std::move(Events), - std::move(loc)), + : CG(CGType::FillUSM, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MPattern(std::move(Pattern)), MDst(DstPtr), MLength(Length) {} void *getDst() { return MDst; } size_t getLength() { return MLength; } @@ -402,7 +397,7 @@ class CGFillUSM : public CommandGroup { }; /// "Prefetch USM" command group class. -class CGPrefetchUSM : public CommandGroup { +class CGPrefetchUSM : public CG { void *MDst; size_t MLength; @@ -414,17 +409,16 @@ class CGPrefetchUSM : public CommandGroup { std::vector Requirements, std::vector Events, detail::code_location loc = {}) - : CommandGroup(CGType::PrefetchUSM, std::move(ArgsStorage), - std::move(AccStorage), std::move(SharedPtrStorage), - std::move(Requirements), std::move(Events), - std::move(loc)), + : CG(CGType::PrefetchUSM, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MDst(DstPtr), MLength(Length) {} void *getDst() { return MDst; } size_t getLength() { return MLength; } }; /// "Advise USM" command group class. -class CGAdviseUSM : public CommandGroup { +class CGAdviseUSM : public CG { void *MDst; size_t MLength; @@ -436,9 +430,9 @@ class CGAdviseUSM : public CommandGroup { std::vector Requirements, std::vector Events, CGType Type, detail::code_location loc = {}) - : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CG(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MDst(DstPtr), MLength(Length) {} void *getDst() { return MDst; } size_t getLength() { return MLength; } @@ -454,7 +448,7 @@ class CGAdviseUSM : public CommandGroup { } }; -class CGInteropTask : public CommandGroup { +class CGInteropTask : public CG { public: std::unique_ptr MInteropTask; @@ -465,13 +459,13 @@ class CGInteropTask : public CommandGroup { std::vector Requirements, std::vector Events, CGType Type, detail::code_location loc = {}) - : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CG(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MInteropTask(std::move(InteropTask)) {} }; -class CGHostTask : public CommandGroup { +class CGHostTask : public CG { public: std::unique_ptr MHostTask; // queue for host-interop task @@ -490,14 +484,14 @@ class CGHostTask : public CommandGroup { std::vector Requirements, std::vector Events, CGType Type, detail::code_location loc = {}) - : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CG(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MHostTask(std::move(HostTask)), MQueue(Queue), MContext(Context), MArgs(std::move(Args)) {} }; -class CGBarrier : public CommandGroup { +class CGBarrier : public CG { public: std::vector MEventsWaitWithBarrier; @@ -508,9 +502,9 @@ class CGBarrier : public CommandGroup { std::vector Requirements, std::vector Events, CGType Type, detail::code_location loc = {}) - : CommandGroup(Type, std::move(ArgsStorage), std::move(AccStorage), - std::move(SharedPtrStorage), std::move(Requirements), - std::move(Events), std::move(loc)), + : CG(Type, std::move(ArgsStorage), std::move(AccStorage), + std::move(SharedPtrStorage), std::move(Requirements), + std::move(Events), std::move(loc)), MEventsWaitWithBarrier(std::move(EventsWaitWithBarrier)) {} }; diff --git a/sycl/include/CL/sycl/detail/common.hpp b/sycl/include/CL/sycl/detail/common.hpp index 8cb2e3ab384a0..f277f470c2e77 100644 --- a/sycl/include/CL/sycl/detail/common.hpp +++ b/sycl/include/CL/sycl/detail/common.hpp @@ -48,10 +48,8 @@ struct code_location { return code_location(fileName, funcName, lineNo, columnNo); } #else - // FIXME Having a nullptr for fileName here is a short-term solution to - // workaround leak of full paths in builds static constexpr code_location - current(const char *fileName = nullptr, + current(const char *fileName = __builtin_FILE(), const char *funcName = __builtin_FUNCTION(), unsigned long lineNo = __builtin_LINE(), unsigned long columnNo = 0) noexcept { diff --git a/sycl/include/CL/sycl/detail/pi.h b/sycl/include/CL/sycl/detail/pi.h index 8349823df54ba..3f9eedfdfc711 100644 --- a/sycl/include/CL/sycl/detail/pi.h +++ b/sycl/include/CL/sycl/detail/pi.h @@ -1147,7 +1147,7 @@ __SYCL_EXPORT pi_result piclProgramCreateWithSource(pi_context context, /// succesfully or not, for each device in device_list. /// binary_status is ignored if it is null and otherwise /// it must be an array of num_devices elements. -/// \param ret_program is the PI program created from the program binaries. +/// \param program is the PI program created from the program binaries. __SYCL_EXPORT pi_result piProgramCreateWithBinary( pi_context context, pi_uint32 num_devices, const pi_device *device_list, const size_t *lengths, const unsigned char **binaries, diff --git a/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp b/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp index 5d16eb6034bd8..03165fbe68b4e 100644 --- a/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp +++ b/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp @@ -302,8 +302,6 @@ class __SYCL_EXPORT SYCLMemObjT : public SYCLMemObjI { bool hasUserDataPtr() const { return MUserPtr != nullptr; }; - bool isInterop() const; - protected: // An allocateMem helper that determines which host ptr to use void determineHostPtr(const ContextImplPtr &Context, bool InitFromUserData, diff --git a/sycl/include/CL/sycl/handler.hpp b/sycl/include/CL/sycl/handler.hpp index 41f10d532361c..3536b055e6e2a 100644 --- a/sycl/include/CL/sycl/handler.hpp +++ b/sycl/include/CL/sycl/handler.hpp @@ -343,20 +343,18 @@ class __SYCL_EXPORT handler { return Storage; } - void setType(detail::CommandGroup::CGType Type) { - constexpr detail::CommandGroup::CG_VERSION Version = - detail::CommandGroup::CG_VERSION::V1; - MCGType = static_cast( + void setType(detail::CG::CGType Type) { + constexpr detail::CG::CG_VERSION Version = detail::CG::CG_VERSION::V1; + MCGType = static_cast( getVersionedCGType(Type, static_cast(Version))); } - detail::CommandGroup::CGType getType() { - return static_cast( - getUnversionedCGType(MCGType)); + detail::CG::CGType getType() { + return static_cast(getUnversionedCGType(MCGType)); } void throwIfActionIsCreated() { - if (detail::CommandGroup::None != getType()) + if (detail::CG::None != getType()) throw sycl::runtime_error("Attempt to set multiple actions for the " "command group. Command group must consist of " "a single kernel or explicit memory operation.", @@ -852,7 +850,7 @@ class __SYCL_EXPORT handler { MNDRDesc.set(std::move(AdjustedRange)); StoreLambda( std::move(Wrapper)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); #endif } else #endif // !__SYCL_DISABLE_PARALLEL_FOR_RANGE_ROUNDING__ && \ @@ -866,7 +864,7 @@ class __SYCL_EXPORT handler { MNDRDesc.set(std::move(NumWorkItems)); StoreLambda( std::move(KernelFunc)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); #endif } } @@ -885,7 +883,7 @@ class __SYCL_EXPORT handler { MKernel = detail::getSyclObjImpl(std::move(Kernel)); detail::checkValueRange(NumWorkItems); MNDRDesc.set(std::move(NumWorkItems)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); extractArgsAndReqs(); MKernelName = getKernelName(); } @@ -1084,7 +1082,7 @@ class __SYCL_EXPORT handler { MHostTask.reset(new detail::HostTask(std::move(Func))); - setType(detail::CommandGroup::CodeplayHostTask); + setType(detail::CG::CodeplayHostTask); } public: @@ -1231,7 +1229,7 @@ class __SYCL_EXPORT handler { MNDRDesc.set(range<1>{1}); StoreLambda(KernelFunc); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); #endif } @@ -1275,7 +1273,7 @@ class __SYCL_EXPORT handler { MArgs = std::move(MAssociatedAccesors); MHostKernel.reset( new detail::HostKernel(std::move(Func))); - setType(detail::CommandGroup::RunOnHostIntel); + setType(detail::CG::RunOnHostIntel); } template @@ -1338,7 +1336,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NumWorkItems, WorkItemOffset); MNDRDesc.set(std::move(NumWorkItems), std::move(WorkItemOffset)); StoreLambda(std::move(KernelFunc)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); #endif } @@ -1369,7 +1367,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(ExecutionRange); MNDRDesc.set(std::move(ExecutionRange)); StoreLambda(std::move(KernelFunc)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); #endif } @@ -1701,7 +1699,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NumWorkGroups); MNDRDesc.setNumWorkGroups(NumWorkGroups); StoreLambda(std::move(KernelFunc)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); #endif // __SYCL_DEVICE_ONLY__ } @@ -1736,7 +1734,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(ExecRange); MNDRDesc.set(std::move(ExecRange)); StoreLambda(std::move(KernelFunc)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); #endif // __SYCL_DEVICE_ONLY__ } @@ -1753,7 +1751,7 @@ class __SYCL_EXPORT handler { // known constant MNDRDesc.set(range<1>{1}); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); extractArgsAndReqs(); MKernelName = getKernelName(); } @@ -1787,7 +1785,7 @@ class __SYCL_EXPORT handler { MKernel = detail::getSyclObjImpl(std::move(Kernel)); detail::checkValueRange(NumWorkItems, WorkItemOffset); MNDRDesc.set(std::move(NumWorkItems), std::move(WorkItemOffset)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); extractArgsAndReqs(); MKernelName = getKernelName(); } @@ -1806,7 +1804,7 @@ class __SYCL_EXPORT handler { MKernel = detail::getSyclObjImpl(std::move(Kernel)); detail::checkValueRange(NDRange); MNDRDesc.set(std::move(NDRange)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); extractArgsAndReqs(); MKernelName = getKernelName(); } @@ -1829,7 +1827,7 @@ class __SYCL_EXPORT handler { // known constant MNDRDesc.set(range<1>{1}); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); if (!MIsHost && !lambdaAndKernelHaveEqualName()) { extractArgsAndReqs(); MKernelName = getKernelName(); @@ -1846,7 +1844,7 @@ class __SYCL_EXPORT handler { template void interop_task(FuncT Func) { MInteropTask.reset(new detail::InteropTask(std::move(Func))); - setType(detail::CommandGroup::CodeplayInteropTask); + setType(detail::CG::CodeplayInteropTask); } /// Defines and invokes a SYCL kernel function for the specified range. @@ -1871,7 +1869,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NumWorkItems); MNDRDesc.set(std::move(NumWorkItems)); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); if (!MIsHost && !lambdaAndKernelHaveEqualName()) { extractArgsAndReqs(); MKernelName = getKernelName(); @@ -1907,7 +1905,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NumWorkItems, WorkItemOffset); MNDRDesc.set(std::move(NumWorkItems), std::move(WorkItemOffset)); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); if (!MIsHost && !lambdaAndKernelHaveEqualName()) { extractArgsAndReqs(); MKernelName = getKernelName(); @@ -1942,7 +1940,7 @@ class __SYCL_EXPORT handler { detail::checkValueRange(NDRange); MNDRDesc.set(std::move(NDRange)); MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); if (!MIsHost && !lambdaAndKernelHaveEqualName()) { extractArgsAndReqs(); MKernelName = getKernelName(); @@ -1982,7 +1980,7 @@ class __SYCL_EXPORT handler { MNDRDesc.setNumWorkGroups(NumWorkGroups); MKernel = detail::getSyclObjImpl(std::move(Kernel)); StoreLambda(std::move(KernelFunc)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); #endif // __SYCL_DEVICE_ONLY__ } @@ -2022,7 +2020,7 @@ class __SYCL_EXPORT handler { MNDRDesc.set(std::move(ExecRange)); MKernel = detail::getSyclObjImpl(std::move(Kernel)); StoreLambda(std::move(KernelFunc)); - setType(detail::CommandGroup::Kernel); + setType(detail::CG::Kernel); #endif // __SYCL_DEVICE_ONLY__ } @@ -2105,7 +2103,7 @@ class __SYCL_EXPORT handler { return; } #endif - setType(detail::CommandGroup::CopyAccToPtr); + setType(detail::CG::CopyAccToPtr); detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Src; detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl(*AccBase); @@ -2144,7 +2142,7 @@ class __SYCL_EXPORT handler { return; } #endif - setType(detail::CommandGroup::CopyPtrToAcc); + setType(detail::CG::CopyPtrToAcc); detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Dst; detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl(*AccBase); @@ -2189,7 +2187,7 @@ class __SYCL_EXPORT handler { "The destination accessor does not fit the copied memory."); if (copyAccToAccHelper(Src, Dst)) return; - setType(detail::CommandGroup::CopyAccToAcc); + setType(detail::CG::CopyAccToAcc); detail::AccessorBaseHost *AccBaseSrc = (detail::AccessorBaseHost *)&Src; detail::AccessorImplPtr AccImplSrc = detail::getSyclObjImpl(*AccBaseSrc); @@ -2219,7 +2217,7 @@ class __SYCL_EXPORT handler { throwIfActionIsCreated(); static_assert(isValidTargetForExplicitOp(AccessTarget), "Invalid accessor target for the update_host method."); - setType(detail::CommandGroup::UpdateHost); + setType(detail::CG::UpdateHost); detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Acc; detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl(*AccBase); @@ -2251,7 +2249,7 @@ class __SYCL_EXPORT handler { "Invalid accessor target for the fill method."); if (!MIsHost && (((Dims == 1) && isConstOrGlobal(AccessTarget)) || isImageOrImageArray(AccessTarget))) { - setType(detail::CommandGroup::Fill); + setType(detail::CG::Fill); detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Dst; detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl(*AccBase); @@ -2296,7 +2294,7 @@ class __SYCL_EXPORT handler { /// complete state. void barrier() { throwIfActionIsCreated(); - setType(detail::CommandGroup::Barrier); + setType(detail::CG::Barrier); } /// Prevents any commands submitted afterward to this queue from executing @@ -2384,7 +2382,7 @@ class __SYCL_EXPORT handler { /// Type of the command group, e.g. kernel, fill. Can also encode version. /// Use getType and setType methods to access this variable unless /// manipulations with version are required - detail::CommandGroup::CGType MCGType = detail::CommandGroup::None; + detail::CG::CGType MCGType = detail::CG::None; /// Pointer to the source host memory or accessor(depending on command type). void *MSrcPtr = nullptr; /// Pointer to the dest host memory or accessor(depends on command type). diff --git a/sycl/include/sycl/ext/intel/fpga_lsu.hpp b/sycl/include/sycl/ext/intel/fpga_lsu.hpp index 4c40c58a671f2..3e7c5caee1803 100644 --- a/sycl/include/sycl/ext/intel/fpga_lsu.hpp +++ b/sycl/include/sycl/ext/intel/fpga_lsu.hpp @@ -90,7 +90,7 @@ template class lsu final { static constexpr uint8_t _cache = (_cache_val > 0) ? CACHE : 0; static constexpr int32_t _statically_coalesce_val = - _GetValue, _mem_access_params...>::value; + _GetValue, _mem_access_params...>::value; static constexpr uint8_t _dont_statically_coalesce = _statically_coalesce_val == 0 ? STATICALLY_COALESCE : 0; diff --git a/sycl/plugins/cuda/pi_cuda.cpp b/sycl/plugins/cuda/pi_cuda.cpp index 6673c5a407fd1..8797ae95b026f 100644 --- a/sycl/plugins/cuda/pi_cuda.cpp +++ b/sycl/plugins/cuda/pi_cuda.cpp @@ -4654,7 +4654,7 @@ pi_result cuda_piextUSMEnqueueMemAdvise(pi_queue queue, const void *ptr, /// \param param_name is the type of query to perform /// \param param_value_size is the size of the result in bytes /// \param param_value is the result -/// \param param_value_size_ret is how many bytes were written +/// \param param_value_ret is how many bytes were written pi_result cuda_piextUSMGetMemAllocInfo(pi_context context, const void *ptr, pi_mem_info param_name, size_t param_value_size, diff --git a/sycl/source/detail/program_impl.hpp b/sycl/source/detail/program_impl.hpp index 83e36eded6e14..9f35fe4814caa 100644 --- a/sycl/source/detail/program_impl.hpp +++ b/sycl/source/detail/program_impl.hpp @@ -45,7 +45,6 @@ class program_impl { /// with the context. /// /// \param Context is a pointer to SYCL context impl. - /// \param PropList is an instance of property_list. explicit program_impl(ContextImplPtr Context, const property_list &PropList); /// Constructs an instance of SYCL program for the provided DeviceList. @@ -56,7 +55,6 @@ class program_impl { /// /// \param Context is a pointer to SYCL context impl. /// \param DeviceList is a list of SYCL devices. - /// \param PropList is an instance of property_list. program_impl(ContextImplPtr Context, std::vector DeviceList, const property_list &PropList); @@ -74,7 +72,6 @@ class program_impl { /// /// \param ProgramList is a list of program_impl instances. /// \param LinkOptions is a string containing valid OpenCL link options. - /// \param PropList is an instance of property_list. program_impl(std::vector> ProgramList, std::string LinkOptions, const property_list &PropList); diff --git a/sycl/source/detail/scheduler/commands.cpp b/sycl/source/detail/scheduler/commands.cpp index 74b0655567a9e..5bdf616c9c33b 100644 --- a/sycl/source/detail/scheduler/commands.cpp +++ b/sycl/source/detail/scheduler/commands.cpp @@ -203,8 +203,7 @@ class DispatchHostTask { void operator()() const { waitForEvents(); - assert(MThisCmd->getCG().getType() == - CommandGroup::CGType::CodeplayHostTask); + assert(MThisCmd->getCG().getType() == CG::CGType::CodeplayHostTask); CGHostTask &HostTask = static_cast(MThisCmd->getCG()); @@ -1218,13 +1217,13 @@ AllocaCommandBase *ExecCGCommand::getAllocaForReq(Requirement *Req) { } std::vector ExecCGCommand::getStreams() const { - if (MCommandGroup->getType() == CommandGroup::Kernel) + if (MCommandGroup->getType() == CG::Kernel) return ((CGExecKernel *)MCommandGroup.get())->getStreams(); return {}; } void ExecCGCommand::clearStreams() { - if (MCommandGroup->getType() == CommandGroup::Kernel) + if (MCommandGroup->getType() == CG::Kernel) ((CGExecKernel *)MCommandGroup.get())->clearStreams(); } @@ -1450,36 +1449,36 @@ void UpdateHostRequirementCommand::emitInstrumentationData() { #endif } -static std::string cgTypeToString(detail::CommandGroup::CGType Type) { +static std::string cgTypeToString(detail::CG::CGType Type) { switch (Type) { - case detail::CommandGroup::Kernel: + case detail::CG::Kernel: return "Kernel"; break; - case detail::CommandGroup::UpdateHost: + case detail::CG::UpdateHost: return "update_host"; break; - case detail::CommandGroup::Fill: + case detail::CG::Fill: return "fill"; break; - case detail::CommandGroup::CopyAccToAcc: + case detail::CG::CopyAccToAcc: return "copy acc to acc"; break; - case detail::CommandGroup::CopyAccToPtr: + case detail::CG::CopyAccToPtr: return "copy acc to ptr"; break; - case detail::CommandGroup::CopyPtrToAcc: + case detail::CG::CopyPtrToAcc: return "copy ptr to acc"; break; - case detail::CommandGroup::CopyUSM: + case detail::CG::CopyUSM: return "copy usm"; break; - case detail::CommandGroup::FillUSM: + case detail::CG::FillUSM: return "fill usm"; break; - case detail::CommandGroup::PrefetchUSM: + case detail::CG::PrefetchUSM: return "prefetch usm"; break; - case detail::CommandGroup::CodeplayHostTask: + case detail::CG::CodeplayHostTask: return "host task"; break; default: @@ -1488,7 +1487,7 @@ static std::string cgTypeToString(detail::CommandGroup::CGType Type) { } } -ExecCGCommand::ExecCGCommand(std::unique_ptr CommandGroup, +ExecCGCommand::ExecCGCommand(std::unique_ptr CommandGroup, QueueImplPtr Queue) : Command(CommandType::RUN_CG, std::move(Queue)), MCommandGroup(std::move(CommandGroup)) { @@ -1505,7 +1504,7 @@ void ExecCGCommand::emitInstrumentationData() { bool HasSourceInfo = false; std::string KernelName, FromSource; switch (MCommandGroup->getType()) { - case detail::CommandGroup::Kernel: { + case detail::CG::Kernel: { auto KernelCG = reinterpret_cast(MCommandGroup.get()); @@ -1592,7 +1591,7 @@ void ExecCGCommand::printDot(std::ostream &Stream) const { Stream << "EXEC CG ON " << deviceToString(MQueue->get_device()) << "\\n"; switch (MCommandGroup->getType()) { - case detail::CommandGroup::Kernel: { + case detail::CG::Kernel: { auto KernelCG = reinterpret_cast(MCommandGroup.get()); Stream << "Kernel name: "; @@ -1799,7 +1798,7 @@ void DispatchNativeKernel(void *Blob) { } cl_int ExecCGCommand::enqueueImp() { - if (getCG().getType() != CommandGroup::CGType::CodeplayHostTask) + if (getCG().getType() != CG::CGType::CodeplayHostTask) waitForPreparedHostEvents(); std::vector EventImpls = MPreparedDepsEvents; auto RawEvents = getPiEvents(EventImpls); @@ -1808,11 +1807,11 @@ cl_int ExecCGCommand::enqueueImp() { switch (MCommandGroup->getType()) { - case CommandGroup::CGType::UpdateHost: { + case CG::CGType::UpdateHost: { throw runtime_error("Update host should be handled by the Scheduler.", PI_INVALID_OPERATION); } - case CommandGroup::CGType::CopyAccToPtr: { + case CG::CGType::CopyAccToPtr: { CGCopy *Copy = (CGCopy *)MCommandGroup.get(); Requirement *Req = (Requirement *)Copy->getSrc(); AllocaCommandBase *AllocaCmd = getAllocaForReq(Req); @@ -1827,7 +1826,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CommandGroup::CGType::CopyPtrToAcc: { + case CG::CGType::CopyPtrToAcc: { CGCopy *Copy = (CGCopy *)MCommandGroup.get(); Requirement *Req = (Requirement *)(Copy->getDst()); AllocaCommandBase *AllocaCmd = getAllocaForReq(Req); @@ -1844,7 +1843,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CommandGroup::CGType::CopyAccToAcc: { + case CG::CGType::CopyAccToAcc: { CGCopy *Copy = (CGCopy *)MCommandGroup.get(); Requirement *ReqSrc = (Requirement *)(Copy->getSrc()); Requirement *ReqDst = (Requirement *)(Copy->getDst()); @@ -1861,7 +1860,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CommandGroup::CGType::Fill: { + case CG::CGType::Fill: { CGFill *Fill = (CGFill *)MCommandGroup.get(); Requirement *Req = (Requirement *)(Fill->getReqToFill()); AllocaCommandBase *AllocaCmd = getAllocaForReq(Req); @@ -1874,7 +1873,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CommandGroup::CGType::RunOnHostIntel: { + case CG::CGType::RunOnHostIntel: { CGExecKernel *HostTask = (CGExecKernel *)MCommandGroup.get(); // piEnqueueNativeKernel takes arguments blob which is passes to user @@ -1945,7 +1944,7 @@ cl_int ExecCGCommand::enqueueImp() { "Enqueueing run_on_host_intel task has failed.", Error); } } - case CommandGroup::CGType::Kernel: { + case CG::CGType::Kernel: { CGExecKernel *ExecKernel = (CGExecKernel *)MCommandGroup.get(); NDRDescT &NDRDesc = ExecKernel->MNDRDesc; @@ -2062,21 +2061,21 @@ cl_int ExecCGCommand::enqueueImp() { return PI_SUCCESS; } - case CommandGroup::CGType::CopyUSM: { + case CG::CGType::CopyUSM: { CGCopyUSM *Copy = (CGCopyUSM *)MCommandGroup.get(); MemoryManager::copy_usm(Copy->getSrc(), MQueue, Copy->getLength(), Copy->getDst(), std::move(RawEvents), Event); return CL_SUCCESS; } - case CommandGroup::CGType::FillUSM: { + case CG::CGType::FillUSM: { CGFillUSM *Fill = (CGFillUSM *)MCommandGroup.get(); MemoryManager::fill_usm(Fill->getDst(), MQueue, Fill->getLength(), Fill->getFill(), std::move(RawEvents), Event); return CL_SUCCESS; } - case CommandGroup::CGType::PrefetchUSM: { + case CG::CGType::PrefetchUSM: { CGPrefetchUSM *Prefetch = (CGPrefetchUSM *)MCommandGroup.get(); MemoryManager::prefetch_usm(Prefetch->getDst(), MQueue, Prefetch->getLength(), std::move(RawEvents), @@ -2084,14 +2083,14 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CommandGroup::CGType::AdviseUSM: { + case CG::CGType::AdviseUSM: { CGAdviseUSM *Advise = (CGAdviseUSM *)MCommandGroup.get(); MemoryManager::advise_usm(Advise->getDst(), MQueue, Advise->getLength(), Advise->getAdvice(), std::move(RawEvents), Event); return CL_SUCCESS; } - case CommandGroup::CGType::CodeplayInteropTask: { + case CG::CGType::CodeplayInteropTask: { const detail::plugin &Plugin = MQueue->getPlugin(); CGInteropTask *ExecInterop = (CGInteropTask *)MCommandGroup.get(); // Wait for dependencies to complete before dispatching work on the host @@ -2119,7 +2118,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CommandGroup::CGType::CodeplayHostTask: { + case CG::CGType::CodeplayHostTask: { CGHostTask *HostTask = static_cast(MCommandGroup.get()); for (ArgDesc &Arg : HostTask->MArgs) { @@ -2174,7 +2173,7 @@ cl_int ExecCGCommand::enqueueImp() { return CL_SUCCESS; } - case CommandGroup::CGType::Barrier: { + case CG::CGType::Barrier: { if (MQueue->get_device().is_host()) { // NOP for host device. return PI_SUCCESS; @@ -2185,7 +2184,7 @@ cl_int ExecCGCommand::enqueueImp() { return PI_SUCCESS; } - case CommandGroup::CGType::BarrierWaitlist: { + case CG::CGType::BarrierWaitlist: { CGBarrier *Barrier = static_cast(MCommandGroup.get()); std::vector Events = Barrier->MEventsWaitWithBarrier; if (MQueue->get_device().is_host() || Events.empty()) { @@ -2200,14 +2199,14 @@ cl_int ExecCGCommand::enqueueImp() { return PI_SUCCESS; } - case CommandGroup::CGType::None: + case CG::CGType::None: throw runtime_error("CG type not implemented.", PI_INVALID_OPERATION); } return PI_INVALID_OPERATION; } bool ExecCGCommand::producesPiEvent() const { - return MCommandGroup->getType() != CommandGroup::CGType::CodeplayHostTask; + return MCommandGroup->getType() != CG::CGType::CodeplayHostTask; } } // namespace detail diff --git a/sycl/source/detail/scheduler/commands.hpp b/sycl/source/detail/scheduler/commands.hpp index d4e874b32e495..d976577821ebb 100644 --- a/sycl/source/detail/scheduler/commands.hpp +++ b/sycl/source/detail/scheduler/commands.hpp @@ -502,8 +502,7 @@ class MemCpyCommandHost : public Command { /// operation. class ExecCGCommand : public Command { public: - ExecCGCommand(std::unique_ptr CommandGroup, - QueueImplPtr Queue); + ExecCGCommand(std::unique_ptr CommandGroup, QueueImplPtr Queue); std::vector getStreams() const; @@ -512,7 +511,7 @@ class ExecCGCommand : public Command { void printDot(std::ostream &Stream) const final; void emitInstrumentationData() final; - detail::CommandGroup &getCG() const { return *MCommandGroup; } + detail::CG &getCG() const { return *MCommandGroup; } // MEmptyCmd is only employed if this command refers to host-task. // The mechanism of lookup for single EmptyCommand amongst users of @@ -540,7 +539,7 @@ class ExecCGCommand : public Command { NDRDescT &NDRDesc, std::vector &RawEvents, RT::PiEvent &Event, ProgramManager::KernelArgMask EliminatedArgMask); - std::unique_ptr MCommandGroup; + std::unique_ptr MCommandGroup; friend class Command; }; diff --git a/sycl/source/detail/scheduler/graph_builder.cpp b/sycl/source/detail/scheduler/graph_builder.cpp index 7f8c9d4f4b884..8fc4aa8b936a8 100644 --- a/sycl/source/detail/scheduler/graph_builder.cpp +++ b/sycl/source/detail/scheduler/graph_builder.cpp @@ -516,7 +516,7 @@ Scheduler::GraphBuilder::addHostAccessor(Requirement *Req, } Command *Scheduler::GraphBuilder::addCGUpdateHost( - std::unique_ptr CommandGroup, QueueImplPtr HostQueue, + std::unique_ptr CommandGroup, QueueImplPtr HostQueue, std::vector &ToEnqueue) { auto UpdateHost = static_cast(CommandGroup.get()); @@ -677,12 +677,12 @@ AllocaCommandBase *Scheduler::GraphBuilder::getOrCreateAllocaForReq( // unnecessary copy on devices with unified host memory support. const bool HostUnifiedMemory = checkHostUnifiedMemory(Queue->getContextImplPtr()); + const bool InitFromUserData = + Record->MAllocaCommands.empty() && HostUnifiedMemory; + AllocaCommandBase *LinkedAllocaCmd = nullptr; // TODO casting is required here to get the necessary information // without breaking ABI, replace with the next major version. auto *MemObj = static_cast(Req->MSYCLMemObj); - const bool InitFromUserData = Record->MAllocaCommands.empty() && - (HostUnifiedMemory || MemObj->isInterop()); - AllocaCommandBase *LinkedAllocaCmd = nullptr; // For the first allocation on a device without host unified memory we // might need to also create a host alloca right away in order to perform @@ -849,7 +849,7 @@ Scheduler::GraphBuilder::addEmptyCmd(Command *Cmd, const std::vector &Reqs, } static bool isInteropHostTask(const std::unique_ptr &Cmd) { - if (Cmd->getCG().getType() != CommandGroup::CGType::CodeplayHostTask) + if (Cmd->getCG().getType() != CG::CGType::CodeplayHostTask) return false; const detail::CGHostTask &HT = @@ -878,12 +878,13 @@ static void combineAccessModesOfReqs(std::vector &Reqs) { } } -Command *Scheduler::GraphBuilder::addCG( - std::unique_ptr CommandGroup, QueueImplPtr Queue, - std::vector &ToEnqueue) { +Command * +Scheduler::GraphBuilder::addCG(std::unique_ptr CommandGroup, + QueueImplPtr Queue, + std::vector &ToEnqueue) { std::vector &Reqs = CommandGroup->MRequirements; const std::vector &Events = CommandGroup->MEvents; - const CommandGroup::CGType CGType = CommandGroup->getType(); + const CG::CGType CGType = CommandGroup->getType(); std::unique_ptr NewCmd( new ExecCGCommand(std::move(CommandGroup), Queue)); @@ -977,7 +978,7 @@ Command *Scheduler::GraphBuilder::addCG( ToEnqueue.push_back(ConnCmd); } - if (CGType == CommandGroup::CGType::CodeplayHostTask) + if (CGType == CG::CGType::CodeplayHostTask) NewCmd->MEmptyCmd = addEmptyCmd(NewCmd.get(), NewCmd->getCG().MRequirements, Queue, Command::BlockReason::HostTask, ToEnqueue); @@ -1184,11 +1185,11 @@ Command *Scheduler::GraphBuilder::connectDepEvent(Command *const Cmd, { std::unique_ptr HT(new detail::HostTask); - std::unique_ptr ConnectCG(new detail::CGHostTask( + std::unique_ptr ConnectCG(new detail::CGHostTask( std::move(HT), /* Queue = */ {}, /* Context = */ {}, /* Args = */ {}, /* ArgsStorage = */ {}, /* AccStorage = */ {}, /* SharedPtrStorage = */ {}, /* Requirements = */ {}, - /* DepEvents = */ {DepEvent}, CommandGroup::CodeplayHostTask, + /* DepEvents = */ {DepEvent}, CG::CodeplayHostTask, /* Payload */ {})); ConnectCmd = new ExecCGCommand( std::move(ConnectCG), Scheduler::getInstance().getDefaultHostQueue()); diff --git a/sycl/source/detail/scheduler/scheduler.cpp b/sycl/source/detail/scheduler/scheduler.cpp index 7424b6cf7cbed..e26b068fdc0c6 100644 --- a/sycl/source/detail/scheduler/scheduler.cpp +++ b/sycl/source/detail/scheduler/scheduler.cpp @@ -68,14 +68,12 @@ void Scheduler::waitForRecordToFinish(MemObjRecord *Record, } } -EventImplPtr -Scheduler::addCG(std::unique_ptr CommandGroup, - QueueImplPtr Queue) { +EventImplPtr Scheduler::addCG(std::unique_ptr CommandGroup, + QueueImplPtr Queue) { EventImplPtr NewEvent = nullptr; - const bool IsKernel = CommandGroup->getType() == CommandGroup::Kernel; + const bool IsKernel = CommandGroup->getType() == CG::Kernel; std::vector AuxiliaryCmds; - const bool IsHostKernel = - CommandGroup->getType() == CommandGroup::RunOnHostIntel; + const bool IsHostKernel = CommandGroup->getType() == CG::RunOnHostIntel; std::vector Streams; if (IsKernel) { @@ -96,11 +94,11 @@ Scheduler::addCG(std::unique_ptr CommandGroup, Command *NewCmd = nullptr; switch (CommandGroup->getType()) { - case CommandGroup::UpdateHost: + case CG::UpdateHost: NewCmd = MGraphBuilder.addCGUpdateHost(std::move(CommandGroup), DefaultHostQueue, AuxiliaryCmds); break; - case CommandGroup::CodeplayHostTask: + case CG::CodeplayHostTask: NewCmd = MGraphBuilder.addCG(std::move(CommandGroup), DefaultHostQueue, AuxiliaryCmds); break; diff --git a/sycl/source/detail/scheduler/scheduler.hpp b/sycl/source/detail/scheduler/scheduler.hpp index dc89bb8033911..30df58c089234 100644 --- a/sycl/source/detail/scheduler/scheduler.hpp +++ b/sycl/source/detail/scheduler/scheduler.hpp @@ -363,7 +363,7 @@ class Scheduler { /// /// \param CommandGroup is a unique_ptr to a command group to be added. /// \return an event object to wait on for command group completion. - EventImplPtr addCG(std::unique_ptr CommandGroup, + EventImplPtr addCG(std::unique_ptr CommandGroup, QueueImplPtr Queue); /// Registers a command group, that copies most recent memory to the memory @@ -479,14 +479,14 @@ class Scheduler { /// \sa queue::submit, Scheduler::addCG /// /// \return a command that represents command group execution. - Command *addCG(std::unique_ptr CommandGroup, - QueueImplPtr Queue, std::vector &ToEnqueue); + Command *addCG(std::unique_ptr CommandGroup, QueueImplPtr Queue, + std::vector &ToEnqueue); /// Registers a \ref CG "command group" that updates host memory to the /// latest state. /// /// \return a command that represents command group execution. - Command *addCGUpdateHost(std::unique_ptr CommandGroup, + Command *addCGUpdateHost(std::unique_ptr CommandGroup, QueueImplPtr HostQueue, std::vector &ToEnqueue); diff --git a/sycl/source/detail/sycl_mem_obj_t.cpp b/sycl/source/detail/sycl_mem_obj_t.cpp index 8a43345738216..f54e5c5d61624 100644 --- a/sycl/source/detail/sycl_mem_obj_t.cpp +++ b/sycl/source/detail/sycl_mem_obj_t.cpp @@ -100,8 +100,6 @@ size_t SYCLMemObjT::getBufSizeForContext(const ContextImplPtr &Context, return BufSize; } -bool SYCLMemObjT::isInterop() const { return MOpenCLInterop; } - void SYCLMemObjT::determineHostPtr(const ContextImplPtr &Context, bool InitFromUserData, void *&HostPtr, bool &HostPtrReadOnly) { diff --git a/sycl/source/detail/usm/usm_impl.cpp b/sycl/source/detail/usm/usm_impl.cpp index 54d530c5ca3cd..bb485c919a5cf 100644 --- a/sycl/source/detail/usm/usm_impl.cpp +++ b/sycl/source/detail/usm/usm_impl.cpp @@ -325,8 +325,8 @@ void *aligned_alloc(size_t Alignment, size_t Size, const queue &Q, alloc Kind, /// Query the allocation type from a USM pointer /// Returns alloc::host for all pointers in a host context. /// -/// \param Ptr is the USM pointer to query -/// \param Ctxt is the sycl context the ptr was allocated in +/// \param ptr is the USM pointer to query +/// \param ctxt is the sycl context the ptr was allocated in alloc get_pointer_type(const void *Ptr, const context &Ctxt) { if (!Ptr) return alloc::unknown; @@ -375,8 +375,8 @@ alloc get_pointer_type(const void *Ptr, const context &Ctxt) { /// Queries the device against which the pointer was allocated /// -/// \param Ptr is the USM pointer to query -/// \param Ctxt is the sycl context the ptr was allocated in +/// \param ptr is the USM pointer to query +/// \param ctxt is the sycl context the ptr was allocated in device get_pointer_device(const void *Ptr, const context &Ctxt) { // Check if ptr is a valid USM pointer if (get_pointer_type(Ptr, Ctxt) == alloc::unknown) diff --git a/sycl/source/handler.cpp b/sycl/source/handler.cpp index b5ad1fdbb2ae4..1ae7238703e4f 100644 --- a/sycl/source/handler.cpp +++ b/sycl/source/handler.cpp @@ -106,7 +106,7 @@ event handler::finalize() { // Kernel_bundles could not be used before CGType version 1 if (getCGTypeVersion(MCGType) > - static_cast(detail::CommandGroup::CG_VERSION::V0)) { + static_cast(detail::CG::CG_VERSION::V0)) { // If there were uses of set_specialization_constant build the kernel_bundle std::shared_ptr KernelBundleImpPtr = getOrInsertHandlerKernelBundle(/*Insert=*/false); @@ -131,10 +131,10 @@ event handler::finalize() { } } - std::unique_ptr CommandGroup; + std::unique_ptr CommandGroup; switch (getType()) { - case detail::CommandGroup::Kernel: - case detail::CommandGroup::RunOnHostIntel: { + case detail::CG::Kernel: + case detail::CG::RunOnHostIntel: { CommandGroup.reset(new detail::CGExecKernel( std::move(MNDRDesc), std::move(MHostKernel), std::move(MKernel), std::move(MArgsStorage), std::move(MAccStorage), @@ -144,71 +144,71 @@ event handler::finalize() { MCodeLoc)); break; } - case detail::CommandGroup::CodeplayInteropTask: + case detail::CG::CodeplayInteropTask: CommandGroup.reset(new detail::CGInteropTask( std::move(MInteropTask), std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCGType, MCodeLoc)); break; - case detail::CommandGroup::CopyAccToPtr: - case detail::CommandGroup::CopyPtrToAcc: - case detail::CommandGroup::CopyAccToAcc: + case detail::CG::CopyAccToPtr: + case detail::CG::CopyPtrToAcc: + case detail::CG::CopyAccToAcc: CommandGroup.reset(new detail::CGCopy( MCGType, MSrcPtr, MDstPtr, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CommandGroup::Fill: + case detail::CG::Fill: CommandGroup.reset(new detail::CGFill( std::move(MPattern), MDstPtr, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CommandGroup::UpdateHost: + case detail::CG::UpdateHost: CommandGroup.reset(new detail::CGUpdateHost( MDstPtr, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CommandGroup::CopyUSM: + case detail::CG::CopyUSM: CommandGroup.reset(new detail::CGCopyUSM( MSrcPtr, MDstPtr, MLength, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CommandGroup::FillUSM: + case detail::CG::FillUSM: CommandGroup.reset(new detail::CGFillUSM( std::move(MPattern), MDstPtr, MLength, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CommandGroup::PrefetchUSM: + case detail::CG::PrefetchUSM: CommandGroup.reset(new detail::CGPrefetchUSM( MDstPtr, MLength, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCodeLoc)); break; - case detail::CommandGroup::AdviseUSM: + case detail::CG::AdviseUSM: CommandGroup.reset(new detail::CGAdviseUSM( MDstPtr, MLength, std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCGType, MCodeLoc)); break; - case detail::CommandGroup::CodeplayHostTask: + case detail::CG::CodeplayHostTask: CommandGroup.reset(new detail::CGHostTask( std::move(MHostTask), MQueue, MQueue->getContextImplPtr(), std::move(MArgs), std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCGType, MCodeLoc)); break; - case detail::CommandGroup::Barrier: - case detail::CommandGroup::BarrierWaitlist: + case detail::CG::Barrier: + case detail::CG::BarrierWaitlist: CommandGroup.reset(new detail::CGBarrier( std::move(MEventsWaitWithBarrier), std::move(MArgsStorage), std::move(MAccStorage), std::move(MSharedPtrStorage), std::move(MRequirements), std::move(MEvents), MCGType, MCodeLoc)); break; - case detail::CommandGroup::None: + case detail::CG::None: if (detail::pi::trace(detail::pi::TraceLevel::PI_TRACE_ALL)) { std::cout << "WARNING: An empty command group is submitted." << std::endl; } @@ -476,7 +476,7 @@ std::string handler::getKernelName() { void handler::barrier(const std::vector &WaitList) { throwIfActionIsCreated(); - MCGType = detail::CommandGroup::BarrierWaitlist; + MCGType = detail::CG::BarrierWaitlist; MEventsWaitWithBarrier.resize(WaitList.size()); std::transform( WaitList.begin(), WaitList.end(), MEventsWaitWithBarrier.begin(), @@ -488,7 +488,7 @@ void handler::memcpy(void *Dest, const void *Src, size_t Count) { MSrcPtr = const_cast(Src); MDstPtr = Dest; MLength = Count; - setType(detail::CommandGroup::CopyUSM); + setType(detail::CG::CopyUSM); } void handler::memset(void *Dest, int Value, size_t Count) { @@ -496,21 +496,21 @@ void handler::memset(void *Dest, int Value, size_t Count) { MDstPtr = Dest; MPattern.push_back(static_cast(Value)); MLength = Count; - setType(detail::CommandGroup::FillUSM); + setType(detail::CG::FillUSM); } void handler::prefetch(const void *Ptr, size_t Count) { throwIfActionIsCreated(); MDstPtr = const_cast(Ptr); MLength = Count; - setType(detail::CommandGroup::PrefetchUSM); + setType(detail::CG::PrefetchUSM); } void handler::mem_advise(const void *Ptr, size_t Count, int Advice) { throwIfActionIsCreated(); MDstPtr = const_cast(Ptr); MLength = Count; - setType(detail::CommandGroup::AdviseUSM); + setType(detail::CG::AdviseUSM); assert(!MSharedPtrStorage.empty()); diff --git a/sycl/test/abi/layout_handler.cpp b/sycl/test/abi/layout_handler.cpp index 4b74095dcc765..278884f86fc92 100644 --- a/sycl/test/abi/layout_handler.cpp +++ b/sycl/test/abi/layout_handler.cpp @@ -116,7 +116,7 @@ void foo() { // CHECK-NEXT: 344 | std::__shared_ptr::element_type * _M_ptr // CHECK-NEXT: 352 | class std::__shared_count<__gnu_cxx::_S_atomic> _M_refcount // CHECK-NEXT: 352 | _Sp_counted_base<(enum __gnu_cxx::_Lock_policy)2U> * _M_pi -// CHECK-NEXT: 360 | detail::class CommandGroup::CGType MCGType +// CHECK-NEXT: 360 | detail::class CG::CGType MCGType // CHECK-NEXT: 368 | void * MSrcPtr // CHECK-NEXT: 376 | void * MDstPtr // CHECK-NEXT: 384 | size_t MLength diff --git a/sycl/test/abi/sycl_symbols_linux.dump b/sycl/test/abi/sycl_symbols_linux.dump index 56bda0b5e7a6b..eed93b8ca86f2 100644 --- a/sycl/test/abi/sycl_symbols_linux.dump +++ b/sycl/test/abi/sycl_symbols_linux.dump @@ -4041,7 +4041,6 @@ _ZNK2cl4sycl6detail10image_implILi3EE7getTypeEv _ZNK2cl4sycl6detail10image_implILi3EE9get_countEv _ZNK2cl4sycl6detail10image_implILi3EE9get_rangeEv _ZNK2cl4sycl6detail11SYCLMemObjT9getPluginEv -_ZNK2cl4sycl6detail11SYCLMemObjT9isInteropEv _ZNK2cl4sycl6detail11stream_impl22get_max_statement_sizeEv _ZNK2cl4sycl6detail11stream_impl8get_sizeEv _ZNK2cl4sycl6detail12sampler_impl18get_filtering_modeEv diff --git a/sycl/test/abi/vtable.cpp b/sycl/test/abi/vtable.cpp index ac2460c6fdf4d..44aa731cf5823 100644 --- a/sycl/test/abi/vtable.cpp +++ b/sycl/test/abi/vtable.cpp @@ -49,13 +49,13 @@ void foo(sycl::detail::pi::DeviceBinaryImage &Img) { Img.print(); } // CHECK-NEXT: 4 | sycl::detail::pi::DeviceBinaryImage::~DeviceBinaryImage() [complete] // CHECK-NEXT: 5 | sycl::detail::pi::DeviceBinaryImage::~DeviceBinaryImage() [deleting] -void foo(sycl::detail::CommandGroup *CG) { delete CG; } -// CHECK: Vtable for 'sycl::detail::CommandGroup' (4 entries). +void foo(sycl::detail::CG *CG) { delete CG; } +// CHECK: Vtable for 'sycl::detail::CG' (4 entries). // CHECK-NEXT: 0 | offset_to_top (0) -// CHECK-NEXT: 1 | sycl::detail::CommandGroup RTTI -// CHECK-NEXT: -- (sycl::detail::CommandGroup, 0) vtable address -- -// CHECK-NEXT: 2 | sycl::detail::CommandGroup::~CommandGroup() [complete] -// CHECK-NEXT: 3 | sycl::detail::CommandGroup::~CommandGroup() [deleting] +// CHECK-NEXT: 1 | sycl::detail::CG RTTI +// CHECK-NEXT: -- (sycl::detail::CG, 0) vtable address -- +// CHECK-NEXT: 2 | sycl::detail::CG::~CG() [complete] +// CHECK-NEXT: 3 | sycl::detail::CG::~CG() [deleting] void foo(sycl::detail::PropertyWithDataBase *Prop) { delete Prop; } // CHECK: Vtable for 'sycl::detail::PropertyWithDataBase' (4 entries). diff --git a/sycl/test/on-device/lit.cfg.py b/sycl/test/on-device/lit.cfg.py index ada28d7c51728..f42d713ea57eb 100644 --- a/sycl/test/on-device/lit.cfg.py +++ b/sycl/test/on-device/lit.cfg.py @@ -191,8 +191,8 @@ def getDeviceCount(device_type): found_at_least_one_device = False -cpu_run_substitute = "echo " -cpu_run_on_linux_substitute = "echo " +cpu_run_substitute = "true" +cpu_run_on_linux_substitute = "true " cpu_check_substitute = "" cpu_check_on_linux_substitute = "" @@ -213,8 +213,8 @@ def getDeviceCount(device_type): config.substitutions.append( ('%CPU_CHECK_PLACEHOLDER', cpu_check_substitute) ) config.substitutions.append( ('%CPU_CHECK_ON_LINUX_PLACEHOLDER', cpu_check_on_linux_substitute) ) -gpu_run_substitute = "echo " -gpu_run_on_linux_substitute = "echo " +gpu_run_substitute = "true" +gpu_run_on_linux_substitute = "true " gpu_check_substitute = "" gpu_check_on_linux_substitute = "" @@ -244,7 +244,7 @@ def getDeviceCount(device_type): config.substitutions.append( ('%GPU_CHECK_PLACEHOLDER', gpu_check_substitute) ) config.substitutions.append( ('%GPU_CHECK_ON_LINUX_PLACEHOLDER', gpu_check_on_linux_substitute) ) -acc_run_substitute = "echo " +acc_run_substitute = "true" acc_check_substitute = "" if getDeviceCount("accelerator")[0]: found_at_least_one_device = True diff --git a/sycl/test/regression/check_simple_name_collisions.cpp b/sycl/test/regression/check_simple_name_collisions.cpp index fbc0d7655fa9d..0db83613a47e8 100644 --- a/sycl/test/regression/check_simple_name_collisions.cpp +++ b/sycl/test/regression/check_simple_name_collisions.cpp @@ -20,7 +20,6 @@ #define BUFFER #define IMAGE #define UNDEFINED -#define CG #include diff --git a/sycl/unittests/kernel-and-program/DeviceInfo.cpp b/sycl/unittests/kernel-and-program/DeviceInfo.cpp index 207334114e73a..57139b368cb41 100644 --- a/sycl/unittests/kernel-and-program/DeviceInfo.cpp +++ b/sycl/unittests/kernel-and-program/DeviceInfo.cpp @@ -64,7 +64,7 @@ TEST_F(DeviceInfoTest, GetDeviceUUID) { return; } - context Ctx{Plt.get_devices()[0]}; + context Ctx{Plt}; TestContext.reset(new TestCtx(Ctx)); device Dev = Ctx.get_devices()[0]; diff --git a/sycl/unittests/kernel-and-program/KernelInfo.cpp b/sycl/unittests/kernel-and-program/KernelInfo.cpp index 278710557b0a2..7290ae606e1b1 100644 --- a/sycl/unittests/kernel-and-program/KernelInfo.cpp +++ b/sycl/unittests/kernel-and-program/KernelInfo.cpp @@ -123,7 +123,7 @@ TEST_F(KernelInfoTest, GetPrivateMemUsage) { return; } - context Ctx{Plt.get_devices()[0]}; + context Ctx{Plt}; program Prg{Ctx}; TestContext.reset(new TestCtx(Ctx)); diff --git a/sycl/unittests/kernel-and-program/KernelRelease.cpp b/sycl/unittests/kernel-and-program/KernelRelease.cpp index 95fb4b3e1b714..8d11d20b83380 100644 --- a/sycl/unittests/kernel-and-program/KernelRelease.cpp +++ b/sycl/unittests/kernel-and-program/KernelRelease.cpp @@ -103,7 +103,7 @@ TEST(KernelReleaseTest, GetKernelRelease) { Mock.redefine( redefinedKernelSetExecInfo); - context Ctx{Plt.get_devices()[0]}; + context Ctx{Plt}; TestContext.reset(new TestCtx(Ctx)); program Prg{Ctx}; diff --git a/sycl/unittests/queue/EventClear.cpp b/sycl/unittests/queue/EventClear.cpp index 28d5c045a8a4a..bc4310ddd0f6f 100644 --- a/sycl/unittests/queue/EventClear.cpp +++ b/sycl/unittests/queue/EventClear.cpp @@ -108,7 +108,7 @@ TEST(QueueEventClear, ClearOnQueueWait) { if (!preparePiMock(Plt)) return; - context Ctx{Plt.get_devices()[0]}; + context Ctx{Plt}; TestContext.reset(new TestCtx(Ctx)); queue Q{Ctx, default_selector()}; @@ -129,7 +129,7 @@ TEST(QueueEventClear, CleanupOnThreshold) { if (!preparePiMock(Plt)) return; - context Ctx{Plt.get_devices()[0]}; + context Ctx{Plt}; TestContext.reset(new TestCtx(Ctx)); queue Q{Ctx, default_selector()}; diff --git a/sycl/unittests/queue/Wait.cpp b/sycl/unittests/queue/Wait.cpp index b04e85633a343..8592b5cd8d8a7 100644 --- a/sycl/unittests/queue/Wait.cpp +++ b/sycl/unittests/queue/Wait.cpp @@ -120,7 +120,7 @@ TEST(QueueWait, QueueWaitTest) { platform Plt{default_selector()}; if (!preparePiMock(Plt)) return; - context Ctx{Plt.get_devices()[0]}; + context Ctx{Plt}; queue Q{Ctx, default_selector()}; unsigned char *HostAlloc = (unsigned char *)malloc_host(1, Ctx); diff --git a/sycl/unittests/scheduler/CommandsWaitForEvents.cpp b/sycl/unittests/scheduler/CommandsWaitForEvents.cpp index 07eba4ad6a37f..225db9301ce28 100644 --- a/sycl/unittests/scheduler/CommandsWaitForEvents.cpp +++ b/sycl/unittests/scheduler/CommandsWaitForEvents.cpp @@ -79,9 +79,9 @@ TEST_F(SchedulerTest, CommandsWaitForEvents) { Mock.redefine(retainReleaseFunc); Mock.redefine(getEventInfoFunc); - context Ctx1{Plt.get_devices()[0]}; + context Ctx1{Plt}; queue Q1{Ctx1, Selector}; - context Ctx2{Plt.get_devices()[0]}; + context Ctx2{Plt}; queue Q2{Ctx2, Selector}; TestContext.reset(new TestCtx(Q1, Q2)); diff --git a/sycl/unittests/scheduler/InOrderQueueDeps.cpp b/sycl/unittests/scheduler/InOrderQueueDeps.cpp index d5263cdf42497..14c8a802d1772 100644 --- a/sycl/unittests/scheduler/InOrderQueueDeps.cpp +++ b/sycl/unittests/scheduler/InOrderQueueDeps.cpp @@ -97,7 +97,7 @@ TEST_F(SchedulerTest, InOrderQueueDeps) { Mock.redefine(redefinedEventsWait); Mock.redefine(redefinedEventRelease); - context Ctx{Plt.get_devices()[0]}; + context Ctx{Plt}; queue InOrderQueue{Ctx, Selector, property::queue::in_order()}; cl::sycl::detail::QueueImplPtr InOrderQueueImpl = detail::getSyclObjImpl(InOrderQueue); diff --git a/sycl/unittests/scheduler/NoHostUnifiedMemory.cpp b/sycl/unittests/scheduler/NoHostUnifiedMemory.cpp index d46b3cff9862b..ed66cc0c9f60f 100644 --- a/sycl/unittests/scheduler/NoHostUnifiedMemory.cpp +++ b/sycl/unittests/scheduler/NoHostUnifiedMemory.cpp @@ -58,19 +58,8 @@ static pi_result redefinedEnqueueMemBufferWriteRect( return PI_SUCCESS; } -static pi_result redefinedMemRetain(pi_mem mem) { return PI_SUCCESS; } static pi_result redefinedMemRelease(pi_mem mem) { return PI_SUCCESS; } -static pi_context InteropPiContext = nullptr; -static pi_result redefinedMemGetInfo(pi_mem mem, cl_mem_info param_name, - size_t param_value_size, void *param_value, - size_t *param_value_size_ret) { - EXPECT_EQ(param_name, static_cast(CL_MEM_CONTEXT)); - auto *Result = reinterpret_cast(param_value); - *Result = InteropPiContext; - return PI_SUCCESS; -} - TEST_F(SchedulerTest, NoHostUnifiedMemory) { platform Plt{default_selector()}; if (Plt.is_host()) { @@ -86,9 +75,7 @@ TEST_F(SchedulerTest, NoHostUnifiedMemory) { redefinedEnqueueMemBufferReadRect); Mock.redefine( redefinedEnqueueMemBufferWriteRect); - Mock.redefine(redefinedMemRetain); Mock.redefine(redefinedMemRelease); - Mock.redefine(redefinedMemGetInfo); cl::sycl::detail::QueueImplPtr QImpl = detail::getSyclObjImpl(Q); device HostDevice; @@ -198,28 +185,4 @@ TEST_F(SchedulerTest, NoHostUnifiedMemory) { // The current context for the record should still be modified. EXPECT_EQ(Record->MCurContext, DefaultHostQueue->getContextImplPtr()); } - // Check that interoperability memory objects are initialized. - { - cl_mem MockInteropBuffer = reinterpret_cast(1); - context InteropContext = Q.get_context(); - InteropPiContext = detail::getSyclObjImpl(InteropContext)->getHandleRef(); - std::shared_ptr BufI = std::make_shared< - detail::buffer_impl>( - MockInteropBuffer, Q.get_context(), /*BufSize*/ 8, - make_unique_ptr>(), - event()); - - detail::Requirement Req = getMockRequirement(); - Req.MSYCLMemObj = BufI.get(); - std::vector AuxCmds; - detail::MemObjRecord *Record = - MS.getOrInsertMemObjRecord(QImpl, &Req, AuxCmds); - detail::AllocaCommandBase *InteropAlloca = - MS.getOrCreateAllocaForReq(Record, &Req, QImpl, AuxCmds); - detail::EnqueueResultT Res; - MockScheduler::enqueueCommand(InteropAlloca, Res, detail::BLOCKING); - - EXPECT_EQ(Record->MAllocaCommands.size(), 1U); - EXPECT_EQ(InteropAlloca->MMemAllocation, MockInteropBuffer); - } } diff --git a/sycl/unittests/scheduler/SchedulerTestUtils.hpp b/sycl/unittests/scheduler/SchedulerTestUtils.hpp index 28ed925fbdfbb..e918951108488 100644 --- a/sycl/unittests/scheduler/SchedulerTestUtils.hpp +++ b/sycl/unittests/scheduler/SchedulerTestUtils.hpp @@ -146,7 +146,7 @@ class MockScheduler : public cl::sycl::detail::Scheduler { } cl::sycl::detail::Command * - addCG(std::unique_ptr CommandGroup, + addCG(std::unique_ptr CommandGroup, cl::sycl::detail::QueueImplPtr Queue, std::vector &ToEnqueue) { return MGraphBuilder.addCG(std::move(CommandGroup), Queue, ToEnqueue); diff --git a/sycl/unittests/scheduler/StreamInitDependencyOnHost.cpp b/sycl/unittests/scheduler/StreamInitDependencyOnHost.cpp index 156589b3899f9..ae4820944170f 100644 --- a/sycl/unittests/scheduler/StreamInitDependencyOnHost.cpp +++ b/sycl/unittests/scheduler/StreamInitDependencyOnHost.cpp @@ -18,7 +18,7 @@ class MockHandler : public sycl::handler { MockHandler(shared_ptr_class Queue, bool IsHost) : sycl::handler(Queue, IsHost) {} - void setType(detail::CommandGroup::CGType Type) { + void setType(detail::CG::CGType Type) { static_cast(this)->MCGType = Type; } @@ -38,12 +38,12 @@ class MockHandler : public sycl::handler { sycl::handler::addStream(Stream); } - unique_ptr_class finalize() { + unique_ptr_class finalize() { auto CGH = static_cast(this); - unique_ptr_class CommandGroup; + unique_ptr_class CommandGroup; switch (CGH->MCGType) { - case detail::CommandGroup::Kernel: - case detail::CommandGroup::RunOnHostIntel: { + case detail::CG::Kernel: + case detail::CG::RunOnHostIntel: { CommandGroup.reset(new detail::CGExecKernel( std::move(CGH->MNDRDesc), std::move(CGH->MHostKernel), std::move(CGH->MKernel), std::move(CGH->MArgsStorage), @@ -97,7 +97,7 @@ TEST_F(SchedulerTest, StreamInitDependencyOnHost) { // Emulating processing of command group function MockHandler MockCGH(HQueueImpl, true); - MockCGH.setType(detail::CommandGroup::Kernel); + MockCGH.setType(detail::CG::Kernel); auto EmptyKernel = [](sycl::nd_item<1>) {}; MockCGH @@ -118,7 +118,7 @@ TEST_F(SchedulerTest, StreamInitDependencyOnHost) { ASSERT_TRUE(!!FlushBufMemObjPtr) << "Memory object for stream flush buffer not initialized"; - unique_ptr_class MainCG = MockCGH.finalize(); + unique_ptr_class MainCG = MockCGH.finalize(); // Emulate call of Scheduler::addCG vector_class Streams = From 9aa5193af09fa44db3dad21725638d5a5a5c5a16 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 2 Aug 2021 11:35:56 -0700 Subject: [PATCH 43/82] Fix SyclOptReport::handleSpecialType Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 9ddf27948e503..6b6a9517a0717 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -2415,12 +2415,10 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { : SyclKernelFieldHandler(S), DC(DC), KernelInvocationLoc(Loc) {} bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { - const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); - FieldTy.getAsString(); KernelArgDescription Desc = - isCXXRecordWithInitMember(RecordDecl, FinalizeMethodName) + strstr(FieldTy.getAsString().c_str(), "sycl::stream") ? KernelArgDescription::Stream - : dyn_cast(FieldTy->getAsRecordDecl()) + : strstr(FieldTy.getAsString().c_str(), "sycl::accessor") ? KernelArgDescription::Accessor : KernelArgDescription::Sampler; for (const auto *Param : DC.getParamVarDeclsForCurrentField()) From 81e7a4ffc18ae61244893c8571dfb6d4e7b91ee7 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 2 Aug 2021 11:40:47 -0700 Subject: [PATCH 44/82] Fix indentation Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 6b6a9517a0717..be7909701b274 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -2418,9 +2418,9 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { KernelArgDescription Desc = strstr(FieldTy.getAsString().c_str(), "sycl::stream") ? KernelArgDescription::Stream - : strstr(FieldTy.getAsString().c_str(), "sycl::accessor") - ? KernelArgDescription::Accessor - : KernelArgDescription::Sampler; + : strstr(FieldTy.getAsString().c_str(), "sycl::accessor") + ? KernelArgDescription::Accessor + : KernelArgDescription::Sampler; for (const auto *Param : DC.getParamVarDeclsForCurrentField()) addParam(FD, Param->getType(), Desc); return true; From 4bd54d7294812ffade2864df65d9a9c45a1a2b37 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Mon, 2 Aug 2021 11:49:32 -0700 Subject: [PATCH 45/82] Remove unrelated changes Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/detail/pi.h | 14 +++++++------- sycl/source/detail/scheduler/scheduler.hpp | 9 +++++---- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/sycl/include/CL/sycl/detail/pi.h b/sycl/include/CL/sycl/detail/pi.h index 3f9eedfdfc711..eefb68e94a97b 100644 --- a/sycl/include/CL/sycl/detail/pi.h +++ b/sycl/include/CL/sycl/detail/pi.h @@ -1565,8 +1565,8 @@ using pi_usm_migration_flags = _pi_usm_migration_flags; /// /// \param result_ptr contains the allocated memory /// \param context is the pi_context -/// \param properties are optional allocation properties -/// \param size is the size of the allocation +/// \param pi_usm_mem_properties are optional allocation properties +/// \param size_t is the size of the allocation /// \param alignment is the desired alignment of the allocation __SYCL_EXPORT pi_result piextUSMHostAlloc(void **result_ptr, pi_context context, pi_usm_mem_properties *properties, @@ -1577,8 +1577,8 @@ __SYCL_EXPORT pi_result piextUSMHostAlloc(void **result_ptr, pi_context context, /// \param result_ptr contains the allocated memory /// \param context is the pi_context /// \param device is the device the memory will be allocated on -/// \param properties are optional allocation properties -/// \param size is the size of the allocation +/// \param pi_usm_mem_properties are optional allocation properties +/// \param size_t is the size of the allocation /// \param alignment is the desired alignment of the allocation __SYCL_EXPORT pi_result piextUSMDeviceAlloc(void **result_ptr, pi_context context, @@ -1591,8 +1591,8 @@ __SYCL_EXPORT pi_result piextUSMDeviceAlloc(void **result_ptr, /// \param result_ptr contains the allocated memory /// \param context is the pi_context /// \param device is the device the memory will be allocated on -/// \param properties are optional allocation properties -/// \param size is the size of the allocation +/// \param pi_usm_mem_properties are optional allocation properties +/// \param size_t is the size of the allocation /// \param alignment is the desired alignment of the allocation __SYCL_EXPORT pi_result piextUSMSharedAlloc(void **result_ptr, pi_context context, @@ -1682,7 +1682,7 @@ __SYCL_EXPORT pi_result piextUSMEnqueueMemAdvise(pi_queue queue, /// \param param_name is the type of query to perform /// \param param_value_size is the size of the result in bytes /// \param param_value is the result -/// \param param_value_size_ret is how many bytes were written +/// \param param_value_ret is how many bytes were written __SYCL_EXPORT pi_result piextUSMGetMemAllocInfo( pi_context context, const void *ptr, pi_mem_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); diff --git a/sycl/source/detail/scheduler/scheduler.hpp b/sycl/source/detail/scheduler/scheduler.hpp index 30df58c089234..5193d61858849 100644 --- a/sycl/source/detail/scheduler/scheduler.hpp +++ b/sycl/source/detail/scheduler/scheduler.hpp @@ -432,14 +432,14 @@ class Scheduler { /// Allocate buffers in the pool for a provided stream /// - /// \param Impl to the stream object - /// \param StreamBufferSize of the stream buffer - /// \param FlushBufferSize of the flush buffer for a single work item + /// \param Pointer to the stream object + /// \param Size of the stream buffer + /// \param Size of the flush buffer for a single work item void allocateStreamBuffers(stream_impl *, size_t, size_t); /// Deallocate all stream buffers in the pool /// - /// \param Impl to the stream object + /// \param Pointer to the stream object void deallocateStreamBuffers(stream_impl *); QueueImplPtr getDefaultHostQueue() { return DefaultHostQueue; } @@ -737,6 +737,7 @@ class Scheduler { /// Enqueues the command and all its dependencies. /// /// \param EnqueueResult is set to specific status if enqueue failed. + /// \param GraphReadLock read-lock which is already acquired for reading /// \return true if the command is successfully enqueued. /// /// The function may unlock and lock GraphReadLock as needed. Upon return From b912ab3721c7ed52bc4d08c755b1c6d029c3ffeb Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Sun, 8 Aug 2021 09:56:28 -0700 Subject: [PATCH 46/82] Fix for ESIMD failures Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index d34de815658e9..be65380fb0fd2 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1961,8 +1961,7 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The accessor/sampler must be a RecordDecl"); llvm::StringLiteral MethodName = - KernelDecl->hasAttr() && - RecordDecl->hasAttr() + KernelDecl->hasAttr() ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = From 92375e4d3c78af0d8badbaa2ccb2839272f0e658 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Sun, 8 Aug 2021 11:00:30 -0700 Subject: [PATCH 47/82] Fix indentation Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index be65380fb0fd2..227b66b64c963 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1960,10 +1960,9 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { bool handleSpecialType(FieldDecl *FD, QualType FieldTy) { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The accessor/sampler must be a RecordDecl"); - llvm::StringLiteral MethodName = - KernelDecl->hasAttr() - ? InitESIMDMethodName - : InitMethodName; + llvm::StringLiteral MethodName = KernelDecl->hasAttr() + ? InitESIMDMethodName + : InitMethodName; CXXMethodDecl *InitMethod = isCXXRecordWithInitMember(RecordDecl, MethodName); assert(InitMethod && "The accessor/sampler must have the __init method"); From 999fea87c31e63f8e38e8fcfb00eb003caac7622 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 11 Aug 2021 09:16:07 -0700 Subject: [PATCH 48/82] Fix conflics Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index c108a0e956aeb..7ff8ce905d531 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1649,15 +1649,11 @@ class SyclKernelFieldChecker : public SyclKernelFieldHandler { } void checkAccessorType(QualType Ty, SourceRange Loc) { - assert(Util::isSyclAccessorType(Ty) && - "Should only be called on SYCL accessor types."); - const RecordDecl *RecD = Ty->getAsRecordDecl(); if (const ClassTemplateSpecializationDecl *CTSD = dyn_cast(RecD)) { const TemplateArgumentList &TAL = CTSD->getTemplateArgs(); TemplateArgument TA = TAL.get(0); - llvm::DenseSet Visited; const QualType TemplateArgTy = TA.getAsType(); if (TAL.size() > 5) From 1da2b1073b7b017da4af7ff6d354598f7ce4a2a1 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 11 Aug 2021 11:22:08 -0700 Subject: [PATCH 49/82] Fix conflics Signed-off-by: Zahira Ammarguellat --- clang/test/SemaSYCL/special-classes.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/clang/test/SemaSYCL/special-classes.cpp b/clang/test/SemaSYCL/special-classes.cpp index 0d5458cddc22f..1c9c7fc73d08b 100644 --- a/clang/test/SemaSYCL/special-classes.cpp +++ b/clang/test/SemaSYCL/special-classes.cpp @@ -1,16 +1,14 @@ -// RUN: %clang_cc1 -S -fsycl-is-device -internal-isystem %S/Inputs -triple spir64 -ast-dump -sycl-std=2020 %s | FileCheck %s +// RUN: %clang_cc1 -fsycl-is-device -internal-isystem %S/Inputs -ast-dump %s | FileCheck %s #include "sycl.hpp" -sycl::queue myQueue; -sycl::handler H; - class AccessorBase { int A; + public: sycl::accessor - acc; + acc; }; class accessor { @@ -26,10 +24,12 @@ class stream { class sampler { public: int field; - }; +}; int main() { + sycl::queue myQueue; + sycl::handler H; AccessorBase Accessor1; accessor Accessor2 = {1}; sycl::stream Stream1{0, 0, H}; @@ -59,7 +59,6 @@ int main() { h.single_task([=] { int a = Sampler2.field; }); - }); return 0; From 5e4cdbc47a410e1b06b67933a5fc94a56893578a Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 18 Aug 2021 11:16:07 -0700 Subject: [PATCH 50/82] Removed checkSyclAccessorType Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 37002bff44635..5f262f6e50776 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1648,7 +1648,7 @@ class SyclKernelFieldChecker : public SyclKernelFieldHandler { return false; } - void checkAccessorType(QualType Ty, SourceRange Loc) { + void checkSyclSpecialType(QualType Ty, SourceRange Loc) { const RecordDecl *RecD = Ty->getAsRecordDecl(); if (const ClassTemplateSpecializationDecl *CTSD = dyn_cast(RecD)) { @@ -1682,12 +1682,12 @@ class SyclKernelFieldChecker : public SyclKernelFieldHandler { bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, QualType FieldTy) final { - checkAccessorType(FieldTy, BS.getBeginLoc()); + checkSyclSpecialType(FieldTy, BS.getBeginLoc()); return isValid(); } bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { - checkAccessorType(FieldTy, FD->getLocation()); + checkSyclSpecialType(FieldTy, FD->getLocation()); return isValid(); } From 3be4eefb68ff833a4c80c3d20632b8091edacf52 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 25 Aug 2021 11:41:09 -0700 Subject: [PATCH 51/82] OptReport is now taking the type of the class Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 102 ++++++------------ clang/test/SemaSYCL/kernel-arg-opt-report.cpp | 36 +++---- 2 files changed, 50 insertions(+), 88 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 51464ce567776..2ab49007fb46a 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -2310,44 +2310,10 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { using SyclKernelFieldHandler::handleSyclHalfType; }; -enum class KernelArgDescription { - BaseClass, - DecomposedMember, - WrappedPointer, - WrappedArray, - Accessor, - AccessorBase, - Sampler, - Stream, - KernelHandler, - None -}; - -StringRef getKernelArgDesc(KernelArgDescription Desc) { - switch (Desc) { - case KernelArgDescription::BaseClass: - return "Compiler generated argument for base class,"; - case KernelArgDescription::DecomposedMember: - return "Compiler generated argument for decomposed struct/class,"; - case KernelArgDescription::WrappedPointer: - return "Compiler generated argument for nested pointer,"; - case KernelArgDescription::WrappedArray: - return "Compiler generated argument for array,"; - case KernelArgDescription::Accessor: - return "Compiler generated argument for accessor,"; - case KernelArgDescription::AccessorBase: - return "Compiler generated argument for accessor base class,"; - case KernelArgDescription::Sampler: - return "Compiler generated argument for sampler,"; - case KernelArgDescription::Stream: - return "Compiler generated argument for stream,"; - case KernelArgDescription::KernelHandler: - return "Compiler generated argument for SYCL2020 specialization constant"; - case KernelArgDescription::None: +std::string getKernelArgDesc(std::string KernelArgDescription) { + if (KernelArgDescription == ":") return ""; - } - llvm_unreachable( - "switch should cover all possible values for KernelArgDescription"); + return ("Compiler generated argument for " + KernelArgDescription + ","); } class SyclOptReportCreator : public SyclKernelFieldHandler { @@ -2355,17 +2321,21 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { SourceLocation KernelInvocationLoc; void addParam(const FieldDecl *KernelArg, QualType KernelArgType, - KernelArgDescription KernelArgDesc) { + std::string KernelArgDescription) { StringRef NameToEmitInDescription = KernelArg->getName(); const RecordDecl *KernelArgParent = KernelArg->getParent(); - if (KernelArgParent && - KernelArgDesc == KernelArgDescription::DecomposedMember) { + if (KernelArgParent && KernelArgDescription == "DecomposedMember") { NameToEmitInDescription = KernelArgParent->getName(); } - bool isWrappedField = - KernelArgDesc == KernelArgDescription::WrappedPointer || - KernelArgDesc == KernelArgDescription::WrappedArray; + bool isWrappedField = KernelArgDescription == "WrappedPointer" || + KernelArgDescription == "WrappedArray"; + + KernelArgDescription = + (KernelArgDescription == "WrappedPointer" + ? "nested pointer" + : (KernelArgDescription == "WrappedArray" ? "array" + : KernelArgDescription)); unsigned KernelArgSize = SemaRef.getASTContext().getTypeSizeInChars(KernelArgType).getQuantity(); @@ -2373,40 +2343,41 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { SemaRef.getDiagnostics().getSYCLOptReport().AddKernelArgs( DC.getKernelDecl(), NameToEmitInDescription, isWrappedField ? "Compiler generated" : KernelArgType.getAsString(), - KernelInvocationLoc, KernelArgSize, getKernelArgDesc(KernelArgDesc), - (KernelArgDesc == KernelArgDescription::DecomposedMember) + KernelInvocationLoc, KernelArgSize, + getKernelArgDesc(KernelArgDescription), + (KernelArgDescription == "DecomposedMember") ? ("Field:" + KernelArg->getName().str() + ", ") : ""); } void addParam(const FieldDecl *FD, QualType FieldTy) { - KernelArgDescription Desc = KernelArgDescription::None; + std::string KernelArgDescription = FieldTy.getAsString(); const RecordDecl *RD = FD->getParent(); if (RD && RD->hasAttr()) - Desc = KernelArgDescription::DecomposedMember; + KernelArgDescription = "DecomposedMember"; - addParam(FD, FieldTy, Desc); + addParam(FD, FieldTy, KernelArgDescription); } // Handles base classes. void addParam(const CXXBaseSpecifier &, QualType KernelArgType, - KernelArgDescription KernelArgDesc) { + std::string KernelArgDescription) { unsigned KernelArgSize = SemaRef.getASTContext().getTypeSizeInChars(KernelArgType).getQuantity(); SemaRef.getDiagnostics().getSYCLOptReport().AddKernelArgs( DC.getKernelDecl(), KernelArgType.getAsString(), KernelArgType.getAsString(), KernelInvocationLoc, KernelArgSize, - getKernelArgDesc(KernelArgDesc), ""); + getKernelArgDesc(KernelArgDescription), ""); } // Handles specialization constants. - void addParam(QualType KernelArgType, KernelArgDescription KernelArgDesc) { + void addParam(QualType KernelArgType, std::string KernelArgDescription) { unsigned KernelArgSize = SemaRef.getASTContext().getTypeSizeInChars(KernelArgType).getQuantity(); SemaRef.getDiagnostics().getSYCLOptReport().AddKernelArgs( DC.getKernelDecl(), "", KernelArgType.getAsString(), - KernelInvocationLoc, KernelArgSize, getKernelArgDesc(KernelArgDesc), - ""); + KernelInvocationLoc, KernelArgSize, + getKernelArgDesc(KernelArgDescription), ""); } public: @@ -2415,14 +2386,8 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { : SyclKernelFieldHandler(S), DC(DC), KernelInvocationLoc(Loc) {} bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { - KernelArgDescription Desc = - strstr(FieldTy.getAsString().c_str(), "sycl::stream") - ? KernelArgDescription::Stream - : strstr(FieldTy.getAsString().c_str(), "sycl::accessor") - ? KernelArgDescription::Accessor - : KernelArgDescription::Sampler; for (const auto *Param : DC.getParamVarDeclsForCurrentField()) - addParam(FD, Param->getType(), Desc); + addParam(FD, Param->getType(), FieldTy.getAsString()); return true; } @@ -2436,23 +2401,21 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { SemaRef.getDiagnostics().getSYCLOptReport().AddKernelArgs( DC.getKernelDecl(), FieldTy.getAsString(), KernelArgType.getAsString(), KernelInvocationLoc, KernelArgSize, - getKernelArgDesc( - KernelArgDescription(KernelArgDescription::AccessorBase)), - ""); + getKernelArgDesc(FieldTy.getAsString()), ""); } return true; } bool handlePointerType(FieldDecl *FD, QualType FieldTy) final { - KernelArgDescription Desc = KernelArgDescription::None; + std::string KernelArgDescription = ":"; ParmVarDecl *KernelParameter = DC.getParamVarDeclsForCurrentField()[0]; // Compiler generated openCL kernel argument for current pointer field // is not a pointer. This means we are processing a nested pointer and // the openCL kernel argument is of type __wrapper_class. if (!KernelParameter->getType()->isPointerType()) - Desc = KernelArgDescription::WrappedPointer; + KernelArgDescription = "WrappedPointer"; for (const auto *Param : DC.getParamVarDeclsForCurrentField()) - addParam(FD, Param->getType(), Desc); + addParam(FD, Param->getType(), KernelArgDescription); return true; } @@ -2464,8 +2427,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { bool handleSimpleArrayType(FieldDecl *FD, QualType FieldTy) final { // Simple arrays are always wrapped. for (const auto *Param : DC.getParamVarDeclsForCurrentField()) - addParam(FD, Param->getType(), - KernelArgDescription(KernelArgDescription::WrappedArray)); + addParam(FD, Param->getType(), "WrappedArray"); return true; } @@ -2477,7 +2439,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { bool handleNonDecompStruct(const CXXRecordDecl *Base, const CXXBaseSpecifier &BS, QualType Ty) final { - addParam(BS, Ty, KernelArgDescription(KernelArgDescription::BaseClass)); + addParam(BS, Ty, "BaseClass"); return true; } @@ -2495,7 +2457,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { if (isDefaultSPIRArch(Context)) return; addParam(DC.getParamVarDeclsForCurrentField()[0]->getType(), - KernelArgDescription(KernelArgDescription::KernelHandler)); + "SYCL2020 specialization constant"); } using SyclKernelFieldHandler::handleSyclHalfType; }; diff --git a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp index 46e780f2379c6..bb959998f0991 100644 --- a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp +++ b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp @@ -69,7 +69,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '0' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for base class, +// SPIR-NEXT: String: Compiler generated argument for BaseClass, // SPIR-NEXT: String: struct NotDecomposedBase // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -90,7 +90,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '1' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: 'Compiler generated argument for decomposed struct/class,' +// SPIR-NEXT: String: Compiler generated argument for DecomposedMember, // SPIR-NEXT: String: DecomposedBase // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: 'Field:DecompVar, ' @@ -132,7 +132,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '3' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' // SPIR-NEXT: String: decompAcc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -153,7 +153,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '4' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' // SPIR-NEXT: String: decompAcc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -174,7 +174,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '5' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' // SPIR-NEXT: String: decompAcc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -195,7 +195,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '6' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' // SPIR-NEXT: String: decompAcc // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -216,7 +216,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '7' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::stream,' // SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -237,7 +237,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '8' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::stream,' // SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -258,7 +258,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '9' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::stream,' // SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -279,7 +279,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '10' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::stream,' // SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -300,7 +300,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '11' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for stream, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::stream,' // SPIR-NEXT: String: DecompStream // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -321,7 +321,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '12' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: '' +// SPIR-NEXT: String: Compiler generated argument for int, // SPIR-NEXT: String: A // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -384,7 +384,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '15' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for sampler, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::sampler,' // SPIR-NEXT: String: Sampl // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -407,7 +407,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '0' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor base class, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' // SPIR-NEXT: String: 'sycl::accessor' // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -428,7 +428,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '1' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor base class, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' // SPIR-NEXT: String: 'sycl::accessor' // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -449,7 +449,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '2' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor base class, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' // SPIR-NEXT: String: 'sycl::accessor' // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -470,7 +470,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '3' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for accessor base class, +// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' // SPIR-NEXT: String: 'sycl::accessor' // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -491,7 +491,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '4' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: 'Compiler generated argument for decomposed struct/class,' +// SPIR-NEXT: String: Compiler generated argument for DecomposedMember, // SPIR-NEXT: String: AccessorDerived // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: 'Field:B, ' From bdd04d7654611cfeccd1e06767147ceb42f91fd2 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 7 Sep 2021 13:49:25 -0700 Subject: [PATCH 52/82] Corrected the assert comments, fixed the string generated in the opt report Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 24 ++++++++----------- clang/test/SemaSYCL/kernel-arg-opt-report.cpp | 6 ++--- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 354aa4ecdc9c6..bf9fe5b18dcb9 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -91,10 +91,6 @@ class Util { static bool isSyclSpecialType(QualType Ty); - /// Checks whether given clang type is a full specialization of the SYCL - /// accessor class. - static bool isSyclAccessorType(QualType Ty); - /// Checks whether given clang type is a full specialization of the SYCL /// half class. static bool isSyclHalfType(QualType Ty); @@ -1961,13 +1957,13 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { // the kernel body. bool handleSpecialType(FieldDecl *FD, QualType FieldTy) { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); - assert(RecordDecl && "The accessor/sampler must be a RecordDecl"); + assert(RecordDecl && "The type must be a RecordDecl"); llvm::StringLiteral MethodName = KernelDecl->hasAttr() ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = isCXXRecordWithInitMember(RecordDecl, MethodName); - assert(InitMethod && "The accessor/sampler must have the __init method"); + assert(InitMethod && "The type must have the __init method"); // Don't do -1 here because we count on this to be the first parameter added // (if any). @@ -2086,13 +2082,13 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, QualType FieldTy) final { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); - assert(RecordDecl && "The accessor/sampler must be a RecordDecl"); + assert(RecordDecl && "The type must be a RecordDecl"); llvm::StringLiteral MethodName = KernelDecl->hasAttr() ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = isCXXRecordWithInitMember(RecordDecl, MethodName); - assert(InitMethod && "The accessor/sampler must have the __init method"); + assert(InitMethod && "The type must have the __init method"); // Get access mode of accessor. const auto *AccessorSpecializationDecl = @@ -2241,12 +2237,12 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { bool handleSpecialType(QualType FieldTy) { const CXXRecordDecl *RecordDecl = FieldTy->getAsCXXRecordDecl(); - assert(RecordDecl && "The accessor/sampler must be a RecordDecl"); + assert(RecordDecl && "The type must be a RecordDecl"); llvm::StringLiteral MethodName = IsSIMD ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = isCXXRecordWithInitMember(RecordDecl, MethodName); - assert(InitMethod && "The accessor/sampler must have the __init method"); + assert(InitMethod && "The type must have the __init method"); for (const ParmVarDecl *Param : InitMethod->parameters()) addParam(Param->getType()); return true; @@ -2324,7 +2320,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { std::string KernelArgDescription) { StringRef NameToEmitInDescription = KernelArg->getName(); const RecordDecl *KernelArgParent = KernelArg->getParent(); - if (KernelArgParent && KernelArgDescription == "DecomposedMember") { + if (KernelArgParent && KernelArgDescription == "decomposed struct/class") { NameToEmitInDescription = KernelArgParent->getName(); } @@ -2345,7 +2341,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { isWrappedField ? "Compiler generated" : KernelArgType.getAsString(), KernelInvocationLoc, KernelArgSize, getKernelArgDesc(KernelArgDescription), - (KernelArgDescription == "DecomposedMember") + (KernelArgDescription == "decomposed struct/class") ? ("Field:" + KernelArg->getName().str() + ", ") : ""); } @@ -2354,7 +2350,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { std::string KernelArgDescription = FieldTy.getAsString(); const RecordDecl *RD = FD->getParent(); if (RD && RD->hasAttr()) - KernelArgDescription = "DecomposedMember"; + KernelArgDescription = "decomposed struct/class"; addParam(FD, FieldTy, KernelArgDescription); } @@ -2439,7 +2435,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { bool handleNonDecompStruct(const CXXRecordDecl *Base, const CXXBaseSpecifier &BS, QualType Ty) final { - addParam(BS, Ty, "BaseClass"); + addParam(BS, Ty, "base class"); return true; } diff --git a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp index e2d2b88590ec3..c58b85d22bcde 100644 --- a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp +++ b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp @@ -69,7 +69,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '0' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for BaseClass, +// SPIR-NEXT: String: Compiler generated argument for base class, // SPIR-NEXT: String: struct NotDecomposedBase // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -90,7 +90,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '1' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for DecomposedMember, +// SPIR-NEXT: String: 'Compiler generated argument for decomposed struct/class,' // SPIR-NEXT: String: DecomposedBase // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: 'Field:DecompVar, ' @@ -491,7 +491,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '4' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for DecomposedMember, +// SPIR-NEXT: String: 'Compiler generated argument for decomposed struct/class,' // SPIR-NEXT: String: AccessorDerived // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: 'Field:B, ' From bf22398aa633e406ed088c7d687d7c556ddcbcec Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 8 Sep 2021 10:13:22 -0700 Subject: [PATCH 53/82] Addressed Elizabeth's review comments Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 93 ++++++++++--------- clang/test/SemaSYCL/kernel-arg-opt-report.cpp | 10 +- clang/test/SemaSYCL/sampler.cpp | 12 --- clang/test/SemaSYCL/special-classes.cpp | 86 ----------------- 4 files changed, 55 insertions(+), 146 deletions(-) delete mode 100644 clang/test/SemaSYCL/special-classes.cpp diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index bf9fe5b18dcb9..5d6696c8d8b82 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -996,8 +996,9 @@ static void addScopeAttrToLocalVars(CXXMethodDecl &F) { } /// Return method by name -static CXXMethodDecl *isCXXRecordWithInitMember(const CXXRecordDecl *CRD, - StringRef MethodName) { +static CXXMethodDecl * +isCXXRecordWithInitOrFinalizeMember(const CXXRecordDecl *CRD, + StringRef MethodName) { CXXMethodDecl *Method; auto It = std::find_if(CRD->methods().begin(), CRD->methods().end(), [MethodName](const CXXMethodDecl *Method) { @@ -1646,19 +1647,21 @@ class SyclKernelFieldChecker : public SyclKernelFieldHandler { return false; } - void checkSyclSpecialType(QualType Ty, SourceRange Loc) { + bool checkSyclSpecialType(QualType Ty, SourceRange Loc) { + assert(Util::isSyclSpecialType(Ty) && + "Should only be called on sycl special class types."); const RecordDecl *RecD = Ty->getAsRecordDecl(); if (const ClassTemplateSpecializationDecl *CTSD = dyn_cast(RecD)) { const TemplateArgumentList &TAL = CTSD->getTemplateArgs(); TemplateArgument TA = TAL.get(0); - const QualType TemplateArgTy = TA.getAsType(); + llvm::DenseSet Visited; + checkSYCLType(SemaRef, TA.getAsType(), Loc, Visited); if (TAL.size() > 5) - checkPropertyListType(TAL.get(5), Loc.getBegin()); - llvm::DenseSet Visited; - checkSYCLType(SemaRef, TemplateArgTy, Loc, Visited); + return checkPropertyListType(TAL.get(5), Loc.getBegin()); } + return false; } public: @@ -1680,12 +1683,12 @@ class SyclKernelFieldChecker : public SyclKernelFieldHandler { bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, QualType FieldTy) final { - checkSyclSpecialType(FieldTy, BS.getBeginLoc()); + IsInvalid |= checkSyclSpecialType(FieldTy, BS.getBeginLoc()); return isValid(); } bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { - checkSyclSpecialType(FieldTy, FD->getLocation()); + IsInvalid |= checkSyclSpecialType(FieldTy, FD->getLocation()); return isValid(); } @@ -1951,6 +1954,26 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { SYCLIntelBufferLocationAttr::CreateImplicit(Ctx, LocationID)); } + // There is a discrepancy in how inherited accessors are handled. + void handleInheritedAccessor(const CXXRecordDecl *RecordDecl, FieldDecl *FD) { + handleAccessorPropertyList(Params.back(), RecordDecl, FD->getLocation()); + if (KernelDecl->hasAttr()) + // In ESIMD kernels accessor's pointer argument needs to be marked + Params.back()->addAttr( + SYCLSimdAccessorPtrAttr::CreateImplicit(SemaRef.getASTContext())); + // Get access mode of accessor. + const auto *AccessorSpecializationDecl = + cast(RecordDecl); + const TemplateArgument &AccessModeArg = + AccessorSpecializationDecl->getTemplateArgs().get(2); + + // Add implicit attribute to parameter decl when it is a read only + // SYCL accessor. + if (isReadOnlyAccessor(AccessModeArg)) + Params.back()->addAttr( + SYCLAccessorReadonlyAttr::CreateImplicit(SemaRef.getASTContext())); + } + // All special SYCL objects must have __init method. We extract types for // kernel parameters from __init method parameters. We will use __init method // and kernel parameters which we build here to initialize special objects in @@ -1962,7 +1985,7 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = - isCXXRecordWithInitMember(RecordDecl, MethodName); + isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); // Don't do -1 here because we count on this to be the first parameter added @@ -1972,25 +1995,8 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { QualType ParamTy = Param->getType(); addParam(FD, ParamTy.getCanonicalType()); if (ParamTy.getTypePtr()->isPointerType() && - !isCXXRecordWithInitMember(RecordDecl, FinalizeMethodName)) { - handleAccessorPropertyList(Params.back(), RecordDecl, - FD->getLocation()); - if (KernelDecl->hasAttr()) - // In ESIMD kernels accessor's pointer argument needs to be marked - Params.back()->addAttr( - SYCLSimdAccessorPtrAttr::CreateImplicit(SemaRef.getASTContext())); - // Get access mode of accessor. - const auto *AccessorSpecializationDecl = - cast(RecordDecl); - const TemplateArgument &AccessModeArg = - AccessorSpecializationDecl->getTemplateArgs().get(2); - - // Add implicit attribute to parameter decl when it is a read only - // SYCL accessor. - if (isReadOnlyAccessor(AccessModeArg)) - Params.back()->addAttr(SYCLAccessorReadonlyAttr::CreateImplicit( - SemaRef.getASTContext())); - } + !isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName)) + handleInheritedAccessor(RecordDecl, FD); } LastParamIndex = ParamIndex; return true; @@ -2087,7 +2093,7 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = - isCXXRecordWithInitMember(RecordDecl, MethodName); + isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); // Get access mode of accessor. @@ -2241,7 +2247,7 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { llvm::StringLiteral MethodName = IsSIMD ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = - isCXXRecordWithInitMember(RecordDecl, MethodName); + isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); for (const ParmVarDecl *Param : InitMethod->parameters()) addParam(Param->getType()); @@ -2307,7 +2313,7 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { }; std::string getKernelArgDesc(std::string KernelArgDescription) { - if (KernelArgDescription == ":") + if (KernelArgDescription == ":" || KernelArgDescription == "") return ""; return ("Compiler generated argument for " + KernelArgDescription + ","); } @@ -2349,6 +2355,8 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { void addParam(const FieldDecl *FD, QualType FieldTy) { std::string KernelArgDescription = FieldTy.getAsString(); const RecordDecl *RD = FD->getParent(); + if (FieldTy->isScalarType()) + KernelArgDescription = ""; if (RD && RD->hasAttr()) KernelArgDescription = "decomposed struct/class"; @@ -2389,6 +2397,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, QualType FieldTy) final { + std::string KernelArgDescription = "base class " + FieldTy.getAsString(); for (const auto *Param : DC.getParamVarDeclsForCurrentField()) { QualType KernelArgType = Param->getType(); unsigned KernelArgSize = SemaRef.getASTContext() @@ -2397,7 +2406,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { SemaRef.getDiagnostics().getSYCLOptReport().AddKernelArgs( DC.getKernelDecl(), FieldTy.getAsString(), KernelArgType.getAsString(), KernelInvocationLoc, KernelArgSize, - getKernelArgDesc(FieldTy.getAsString()), ""); + getKernelArgDesc(KernelArgDescription), ""); } return true; } @@ -2724,7 +2733,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { void createSpecialMethodCall(const CXXRecordDecl *RD, StringRef MethodName, SmallVectorImpl &AddTo) { - CXXMethodDecl *Method = isCXXRecordWithInitMember(RD, MethodName); + CXXMethodDecl *Method = isCXXRecordWithInitOrFinalizeMember(RD, MethodName); if (!Method) return; @@ -2820,11 +2829,9 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { const auto *RecordDecl = Ty->getAsCXXRecordDecl(); createSpecialMethodCall(RecordDecl, getInitMethodName(), BodyStmts); CXXMethodDecl *FinalizeMethod = - isCXXRecordWithInitMember(RecordDecl, FinalizeMethodName); - // A finalize-method is expected for stream class. - if (!FinalizeMethod && isCXXRecordWithInitMember(RecordDecl, "__finalize")) - SemaRef.Diag(FD->getLocation(), diag::err_sycl_expected_finalize_method); - else + isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName); + // A finalize-method is expected for special type such as stream. + if (FinalizeMethod) createSpecialMethodCall(RecordDecl, FinalizeMethodName, FinalizeStmts); removeFieldMemberExpr(FD, Ty); @@ -3218,7 +3225,7 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { const auto *ClassTy = FieldTy->getAsCXXRecordDecl(); - assert(ClassTy && "Sampler type must be a C++ record type"); + assert(ClassTy && "Type must be a C++ record type"); if (const auto *AccTy = dyn_cast( FieldTy->getAsRecordDecl())) { assert(AccTy->getTemplateArgs().size() >= 2 && @@ -3230,11 +3237,11 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset + offsetOf(FD, FieldTy)); } else { - if (isCXXRecordWithInitMember(ClassTy, FinalizeMethodName)) + if (isCXXRecordWithInitOrFinalizeMember(ClassTy, FinalizeMethodName)) addParam(FD, FieldTy, SYCLIntegrationHeader::kind_stream); else { CXXMethodDecl *InitMethod = - isCXXRecordWithInitMember(ClassTy, InitMethodName); + isCXXRecordWithInitOrFinalizeMember(ClassTy, InitMethodName); assert(InitMethod && "sampler must have __init method"); const ParmVarDecl *SamplerArg = InitMethod->getParamDecl(0); addParam(SamplerArg->getType(), SYCLIntegrationHeader::kind_sampler, @@ -5000,7 +5007,7 @@ bool Util::isSyclSpecialType(const QualType Ty) { const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); if (!RecTy) return false; - return isCXXRecordWithInitMember(RecTy, "__init"); + return isCXXRecordWithInitOrFinalizeMember(RecTy, "__init"); } bool Util::isSyclHalfType(QualType Ty) { diff --git a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp index c58b85d22bcde..624f17900ac8a 100644 --- a/clang/test/SemaSYCL/kernel-arg-opt-report.cpp +++ b/clang/test/SemaSYCL/kernel-arg-opt-report.cpp @@ -321,7 +321,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '12' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: Compiler generated argument for int, +// SPIR-NEXT: String: '' // SPIR-NEXT: String: A // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -407,7 +407,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '0' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' +// SPIR-NEXT: String: 'Compiler generated argument for base class sycl::accessor,' // SPIR-NEXT: String: 'sycl::accessor' // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -428,7 +428,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '1' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' +// SPIR-NEXT: String: 'Compiler generated argument for base class sycl::accessor,' // SPIR-NEXT: String: 'sycl::accessor' // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -449,7 +449,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '2' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' +// SPIR-NEXT: String: 'Compiler generated argument for base class sycl::accessor,' // SPIR-NEXT: String: 'sycl::accessor' // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' @@ -470,7 +470,7 @@ int main() { // SPIR-NEXT: String: 'Arg ' // SPIR-NEXT: Argument: '3' // SPIR-NEXT: String: ':' -// SPIR-NEXT: String: 'Compiler generated argument for sycl::accessor,' +// SPIR-NEXT: String: 'Compiler generated argument for base class sycl::accessor,' // SPIR-NEXT: String: 'sycl::accessor' // SPIR-NEXT: String: ' (' // SPIR-NEXT: String: '' diff --git a/clang/test/SemaSYCL/sampler.cpp b/clang/test/SemaSYCL/sampler.cpp index 34c287b2dd82f..40506f800bf99 100644 --- a/clang/test/SemaSYCL/sampler.cpp +++ b/clang/test/SemaSYCL/sampler.cpp @@ -19,18 +19,6 @@ int main() { return 0; } -// CHECK: ClassTemplateDecl {{.*}} accessor -// CHECK: SYCLSpecialClassAttr {{.*}} -// CHECK: CXXRecordDecl {{.*}} implicit class accessor -// CHECK: AccessSpecDecl {{.*}} public -// CHECK: CXXMethodDecl {{.*}} use 'void () const' -// CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr {{.*}} -// CHECK: CXXRecordDecl {{.*}} implicit class accessor -// CHECK: AccessSpecDecl {{.*}} public -// CHECK: CXXMethodDecl {{.*}} use 'void () const' -// CHECK: CXXMethodDecl {{.*}} use 'void (void *) const' - // Check declaration of the test kernel // CHECK: FunctionDecl {{.*}}SamplerLambda{{.*}} 'void (sampler_t)' // diff --git a/clang/test/SemaSYCL/special-classes.cpp b/clang/test/SemaSYCL/special-classes.cpp deleted file mode 100644 index 1c9c7fc73d08b..0000000000000 --- a/clang/test/SemaSYCL/special-classes.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// RUN: %clang_cc1 -fsycl-is-device -internal-isystem %S/Inputs -ast-dump %s | FileCheck %s - -#include "sycl.hpp" - -class AccessorBase { - int A; - -public: - sycl::accessor - acc; -}; - -class accessor { -public: - int field; -}; - -class stream { -public: - int field; -}; - -class sampler { -public: - int field; -}; - -int main() { - - sycl::queue myQueue; - sycl::handler H; - AccessorBase Accessor1; - accessor Accessor2 = {1}; - sycl::stream Stream1{0, 0, H}; - stream Stream2; - sycl::sampler Sampler1; - sampler Sampler2; - - myQueue.submit([&](sycl::handler &h) { - h.single_task([=]() { - Accessor1.acc.use(); - }); - h.single_task([=]() { - int a = Accessor2.field; - }); - - h.single_task([=]() { - Stream1.use(); - }); - h.single_task([=]() { - int a = Stream2.field; - }); - - h.single_task([=] { - Sampler1.use(); - }); - - h.single_task([=] { - int a = Sampler2.field; - }); - }); - - return 0; -} - -// CHECK: ClassTemplateDecl {{.*}} accessor -// CHECK: CXXRecordDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr {{.*}} -// CHECK: CXXRecordDecl {{.*}} implicit class accessor - -// CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr{{.*}} -// CHECK: CXXRecordDecl {{.*}} prev {{.*}} implicit class accessor - -// CHECK: ClassTemplateSpecializationDecl {{.*}} class accessor definition -// CHECK: SYCLSpecialClassAttr{{.*}} -// CHECK: CXXRecordDecl {{.*}} prev {{.*}} implicit class accessor - -// CHECK: CXXRecordDecl {{.*}} referenced class sampler definition -// CHECK: SYCLSpecialClassAttr {{.*}} -// CHECK: CXXRecordDecl {{.*}} implicit class sampler - -// CHECK: CXXRecordDecl {{.*}} prev {{.*}} referenced class stream definition -// CHECK: SYCLSpecialClassAttr {{.*}} -// CHECK: CXXRecordDecl {{.*}} implicit referenced class stream From 364fb9935adbb53cc4e59275bf6e6714b874cb70 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 8 Sep 2021 10:23:36 -0700 Subject: [PATCH 54/82] Fixed comment referring to 'sample' Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 5d6696c8d8b82..6196730b0f830 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -3242,7 +3242,7 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { else { CXXMethodDecl *InitMethod = isCXXRecordWithInitOrFinalizeMember(ClassTy, InitMethodName); - assert(InitMethod && "sampler must have __init method"); + assert(InitMethod && "type must have __init method"); const ParmVarDecl *SamplerArg = InitMethod->getParamDecl(0); addParam(SamplerArg->getType(), SYCLIntegrationHeader::kind_sampler, offsetOf(FD, FieldTy)); From e4d66fc460b57fd5df69931868160b29640c7380 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 8 Sep 2021 13:56:25 -0700 Subject: [PATCH 55/82] Remove unrelated change Signed-off-by: Zahira Ammarguellat --- .../tools/llvm-foreach/llvm-foreach-win.ll | 38 ++++--------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/llvm/test/tools/llvm-foreach/llvm-foreach-win.ll b/llvm/test/tools/llvm-foreach/llvm-foreach-win.ll index 0072ab71956f4..9053e13c74a64 100644 --- a/llvm/test/tools/llvm-foreach/llvm-foreach-win.ll +++ b/llvm/test/tools/llvm-foreach/llvm-foreach-win.ll @@ -4,26 +4,17 @@ ; RUN: echo 'Content of second file' > %t2.tgt ; RUN: echo "%t1.tgt" > %t.list ; RUN: echo "%t2.tgt" >> %t.list -; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res -; RUN: FileCheck < %t.res %s -; CHECK-DAG: [[FIRST:.+1.tgt]] -; CHECK-DAG: [[SECOND:.+2.tgt]] - ; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res -; RUN: FileCheck < %t.res %s --check-prefix=CHECK-ORDER -; CHECK-ORDER: [[FIRST:.+1.tgt]] -; CHECK-ORDER: [[SECOND:.+2.tgt]] - +; RUN: FileCheck < %t.res %s +; CHECK: [[FIRST:.+1.tgt]] +; CHECK: [[SECOND:.+2.tgt]] +; ; RUN: llvm-foreach --in-replace="{}" --out-replace=%t --out-ext=out --in-file-list=%t.list --out-file-list=%t.out.list -- xcopy /y "{}" %t ; RUN: FileCheck < %t.out.list %s --check-prefix=CHECK-LIST -; RUN: llvm-foreach --jobs=2 --in-replace="{}" --out-replace=%t --out-ext=out --in-file-list=%t.list --out-file-list=%t.out.list -- xcopy /y "{}" %t -; RUN: FileCheck < %t.out.list %s --check-prefix=CHECK-LIST ; CHECK-LIST: [[FIRST:.+\.out]] ; CHECK-LIST: [[SECOND:.+\.out]] -; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.out.list -- cat "{}" > %t.order -; RUN: FileCheck < %t.order %s --check-prefix=CHECK-CONTENT -; CHECK-CONTENT: Content of first file -; CHECK-CONTENT-NEXT: Content of second file +; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.out.list -- FileCheck --input-file="{}" %s --check-prefix=CHECK-CONTENT +; CHECK-CONTENT: Content of ; RUN: echo 'something' > %t3.tgt ; RUN: echo 'something again' > %t4.tgt @@ -31,18 +22,5 @@ ; RUN: echo "%t4.tgt" >> %t1.list ; RUN: llvm-foreach --in-replace="{}" --in-replace="inrep" --in-file-list=%t.list --in-file-list=%t1.list --out-increment=%t_out.prj -- echo -first-part-of-arg={}.out -first-part-of-arg=inrep.out -another-arg=%t_out.prj > %t1.res ; RUN: FileCheck < %t1.res %s --check-prefix=CHECK-DOUBLE-LISTS -; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-replace="inrep" --in-file-list=%t.list --in-file-list=%t1.list --out-increment=%t_out.prj -- echo -first-part-of-arg={}.out -first-part-of-arg=inrep.out -another-arg=%t_out.prj > %t1.res -; RUN: FileCheck < %t1.res %s --check-prefix=CHECK-DOUBLE-LISTS -; CHECK-DOUBLE-LISTS-DAG: -first-part-of-arg=[[FIRST:.+1.tgt.out]] -first-part-of-arg=[[THIRD:.+3.tgt.out]] -another-arg={{.+}}_out.prj -; CHECK-DOUBLE-LISTS-DAG: -first-part-of-arg=[[SECOND:.+2.tgt.out]] -first-part-of-arg=[[FOURTH:.+4.tgt.out]] -another-arg={{.+}}_out.prj_1 - -; RUN: echo "%t1.tgt" > %t2.list -; RUN: echo "%t2.tgt" >> %t2.list -; RUN: echo "%t3.tgt" >> %t2.list -; RUN: echo "%t4.tgt" >> %t2.list -; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-file-list=%t2.list -- echo "{}" > %t2.res -; RUN: FileCheck < %t2.res %s --check-prefix=CHECK-PARALLEL-JOBS -; CHECK-PARALLEL-JOBS-DAG: [[FIRST:.+1.tgt]] -; CHECK-PARALLEL-JOBS-DAG: [[SECOND:.+2.tgt]] -; CHECK-PARALLEL-JOBS-DAG: [[THIRD:.+3.tgt]] -; CHECK-PARALLEL-JOBS-DAG: [[FOURTH:.+4.tgt]] +; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[FIRST:.+1.tgt.out]] -first-part-of-arg=[[THIRD:.+3.tgt.out]] -another-arg={{.+}}_out.prj +; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[SECOND:.+2.tgt.out]] -first-part-of-arg=[[FOURTH:.+4.tgt.out]] -another-arg={{.+}}_out.prj_1 From e97af83e184d77dd4978b8f82897f6943cda7c41 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 8 Sep 2021 14:10:14 -0700 Subject: [PATCH 56/82] Deleted CodeGenSYCL/special-classes.cpp Signed-off-by: Zahira Ammarguellat --- clang/test/CodeGenSYCL/special-classes.cpp | 103 --------------------- 1 file changed, 103 deletions(-) delete mode 100644 clang/test/CodeGenSYCL/special-classes.cpp diff --git a/clang/test/CodeGenSYCL/special-classes.cpp b/clang/test/CodeGenSYCL/special-classes.cpp deleted file mode 100644 index 7b00662b0e39e..0000000000000 --- a/clang/test/CodeGenSYCL/special-classes.cpp +++ /dev/null @@ -1,103 +0,0 @@ -// RUN: %clang_cc1 -S -fsycl-is-device -triple spir64-unknown-unknown-sycldevice -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s - -#include "Inputs/sycl.hpp" - -cl::sycl::queue myQueue; -cl::sycl::handler SH; - -class AccessorBase { - int A; - -public: - cl::sycl::accessor - acc; -}; - -class accessor { -public: - int field; -}; - -class stream { -public: - int field; -}; - -class sampler { -public: - int field; -}; - -int main() { - - AccessorBase Accessor1; - accessor Accessor2 = {1}; - stream Stream2; - cl::sycl::sampler Sampler1; - sampler Sampler2; - - myQueue.submit([&](cl::sycl::handler &h) { - h.single_task([=]() { - Accessor1.acc.use(); - }); - h.single_task([=]() { - int a = Accessor2.field; - }); - - cl::sycl::stream Stream1{0, 0, SH}; - h.single_task([=]() { - int a = Stream2.field; - }); - - h.single_task([=] { - Sampler1.use(); - }); - - h.single_task([=] { - int a = Sampler2.field; - }); - }); - - return 0; -} - -// CHECK: %[[RANGE_TYPE:"struct.*cl::sycl::range"]] -// CHECK: %[[ID_TYPE:"struct.*cl::sycl::id"]] -// CHECK: define dso_local spir_kernel void @{{.*}}kernel_function1 -// CHECK-SAME: i32 [[ARG_A:%[a-zA-Z0-9_]+]], -// CHECK-SAME: i32 addrspace(1)* [[ACC1_DATA:%[a-zA-Z0-9_]+]], -// CHECK-SAME: %[[RANGE_TYPE]]* byval(%[[RANGE_TYPE]]) align 4 [[ACC1_DATA:%[a-zA-Z0-9_]+]], -// CHECK-SAME: %[[RANGE_TYPE]]* byval(%[[RANGE_TYPE]]) align 4 [[ACC2_DATA:%[a-zA-Z0-9_]+]], -// CHECK-SAME: %[[ID_TYPE]]* byval(%[[ID_TYPE]]) align 4 [[ACC3_DATA:%[a-zA-Z0-9_]+]]) - -// CHECK: [[ACC_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class.{{.*}}.AccessorBase, %class.{{.*}}.AccessorBase addrspace(4)* %3, i32 0, i32 1 -// CHECK: call spir_func void @_ZN2cl4sycl8accessorIiLi1ELNS0_6access4modeE1026ELNS2_6targetE2016ELNS2_11placeholderE0ENS0_3ext6oneapi22accessor_property_listIJEEEEC1Ev(%"class.{{.*}}.cl::sycl::accessor" addrspace(4)* align 4 dereferenceable_or_null(12) [[ACC_FIELD]]) - -// CHECK: [[ACC1_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.AccessorBase, %class{{.*}}.AccessorBase addrspace(4)* %5, i32 0, i32 1 -// CHECK: [[ACC1_DATA_LOAD:%[a-zA-Z0-9_]+]] = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* %_arg_acc.addr.ascast, align 8 -// CHECK: call spir_func void @{{.*}}__init{{.*}}(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{.*}} [[ACC1_FIELD]], i32 addrspace(1)* [[ACC1_DATA_LOAD]] - -// CHECK: define dso_local spir_kernel void @{{.*}}kernel_function2(%class.{{.*}}.accessor* byval(%class.{{.*}}.accessor) align 4 [[ARG_F2:%[a-zA-Z0-9_]+]]) -// CHECK: [[KERNEL_F2:%[a-zA-Z0-9_]+]] = alloca %class.{{.*}}.anon -// CHECK: [[KERNEL_OBJ_F2:%[a-zA-Z0-9_]+]] = addrspacecast %class.{{.*}}.anon* [[KERNEL_F2]] to %class.{{.*}}.anon addrspace(4)* -// CHECK: call spir_func void @_ZZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_ENKUlvE0_clEv(%class.{{.*}}.anon addrspace(4)* align 4 dereferenceable_or_null(4) [[KERNEL_OBJ_F2]] - -// CHECK: define dso_local spir_kernel void @{{.*}}kernel_function3(%class.{{.*}}.stream* byval(%class.{{.*}}.stream) align 4 [[ARG_F3:%[a-zA-Z0-9_]+]]) -// CHECK: [[KERNEL_F3:%[a-zA-Z0-9_]+]] = alloca %class.{{.*}}.anon -// CHECK: [[KERNEL_OBJ_F3:%[a-zA-Z0-9_]+]] = addrspacecast %class.{{.*}}.anon* [[KERNEL_F3]] to %class.{{.*}}.anon addrspace(4)* -// CHECK: call spir_func void @_ZZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_ENKUlvE1_clEv(%class.{{.*}}.anon addrspace(4)* align 4 dereferenceable_or_null(4) [[KERNEL_OBJ_F3]]) - -// CHECK: define dso_local spir_kernel void @_{{.*}}kernel_function4(%opencl.sampler_t addrspace(2)* [[ARG_F3:%[a-zA-Z0-9_]+]]) -// CHECK: [[ARG_F3]].addr = alloca %opencl.sampler_t addrspace(2)*, align 8 -// CHECK: [[ARG_F3]].addr.ascast = addrspacecast %opencl.sampler_t addrspace(2)** [[ARG_F3]].addr to %opencl.sampler_t addrspace(2)* addrspace(4)* -// CHECK: [[ANON_F4:%[0-9]+]] = alloca %class.{{.*}}.anon, align 8 -// CHECK: [[ANON_CAST_F4:%[0-9]+]] = addrspacecast %class.{{.*}}.anon* [[ANON_F4]] to %class.{{.*}}.anon addrspace(4)* -// CHECK: [[GEP_F3:%[0-9]+]] = getelementptr inbounds %class.{{.*}}.anon, %class.{{.*}}.anon addrspace(4)* [[ANON_CAST_F4]], i32 0, i32 0 -// CHECK: [[LOAD_ARG_F4:%[0-9]+]] = load %opencl.sampler_t addrspace(2)*, %opencl.sampler_t addrspace(2)* addrspace(4)* [[ARG_F3]].addr.ascast, align 8 -// CHECK: call spir_func void @_ZN2cl4sycl7sampler6__initE11ocl_sampler(%"class.{{.*}}.cl::sycl::sampler" addrspace(4)* align 8 dereferenceable_or_null(8) [[GEP_F3]], %opencl.sampler_t addrspace(2)* [[LOAD_ARG_F4]]) - -// CHECK: define dso_local spir_kernel void @_{{.*}}kernel_function5(%class.{{.*}}.sampler* byval(%class.{{.*}}.sampler) align 4 [[ARG_F5:%[a-zA-Z0-9_]+]]) -// CHECK: [[KERNEL_F5:%[0-9]+]] = alloca %class.{{.*}}.anon, align 4 -// CHECK: [[KERNEL_OBJ_F5:%[0-9]+]] = addrspacecast %class.{{.*}}.anon* [[KERNEL_F5]] to %class.{{.*}}.anon addrspace(4)* -// CHECK: call spir_func void @_ZZZ4mainENKUlRN2cl4sycl7handlerEE_clES2_ENKUlvE3_clEv(%class.{{.*}}.anon addrspace(4)* align 4 dereferenceable_or_null(4) [[KERNEL_OBJ_F5]]) From 281e337b7a093743b46ea1bcb9060a6ad1ca2905 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 8 Sep 2021 14:20:05 -0700 Subject: [PATCH 57/82] Remove unrelated change Signed-off-by: Zahira Ammarguellat --- .../tools/llvm-foreach/llvm-foreach-lin.ll | 37 ++++--------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll b/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll index 7aeaa800db13b..add22d9081674 100644 --- a/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll +++ b/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll @@ -4,26 +4,17 @@ ; RUN: echo 'Content of second file' > %t2.tgt ; RUN: echo "%t1.tgt" > %t.list ; RUN: echo "%t2.tgt" >> %t.list -; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res -; RUN: FileCheck < %t.res %s -; CHECK-DAG: [[FIRST:.+1.tgt]] -; CHECK-DAG: [[SECOND:.+2.tgt]] - ; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res -; RUN: FileCheck < %t.res %s --check-prefix=CHECK-ORDER -; CHECK-ORDER: [[FIRST:.+1.tgt]] -; CHECK-ORDER: [[SECOND:.+2.tgt]] - +; RUN: FileCheck < %t.res %s +; CHECK: [[FIRST:.+1.tgt]] +; CHECK: [[SECOND:.+2.tgt]] +; ; RUN: llvm-foreach --in-replace="{}" --out-replace=%t --out-ext=out --in-file-list=%t.list --out-file-list=%t.out.list -- cp "{}" %t ; RUN: FileCheck < %t.out.list %s --check-prefix=CHECK-LIST -; RUN: llvm-foreach --jobs=2 --in-replace="{}" --out-replace=%t --out-ext=out --in-file-list=%t.list --out-file-list=%t.out.list -- cp "{}" %t -; RUN: FileCheck < %t.out.list %s --check-prefix=CHECK-LIST ; CHECK-LIST: [[FIRST:.+\.out]] ; CHECK-LIST: [[SECOND:.+\.out]] -; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.out.list -- cat "{}" > %t.order -; RUN: FileCheck < %t.order %s --check-prefix=CHECK-CONTENT -; CHECK-CONTENT: Content of first file -; CHECK-CONTENT-NEXT: Content of second file +; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.out.list -- FileCheck --input-file="{}" %s --check-prefix=CHECK-CONTENT +; CHECK-CONTENT: Content of ; RUN: echo 'something' > %t3.tgt ; RUN: echo 'something again' > %t4.tgt @@ -31,18 +22,6 @@ ; RUN: echo "%t4.tgt" >> %t1.list ; RUN: llvm-foreach --in-replace="{}" --in-replace="inrep" --in-file-list=%t.list --in-file-list=%t1.list --out-increment="%t_out.prj" -- echo -first-part-of-arg={}.out -first-part-of-arg=inrep.out -another-arg=%t_out.prj > %t1.res ; RUN: FileCheck < %t1.res %s --check-prefix=CHECK-DOUBLE-LISTS -; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-replace="inrep" --in-file-list=%t.list --in-file-list=%t1.list --out-increment="%t_out.prj" -- echo -first-part-of-arg={}.out -first-part-of-arg=inrep.out -another-arg=%t_out.prj > %t1.res -; RUN: FileCheck < %t1.res %s --check-prefix=CHECK-DOUBLE-LISTS -; CHECK-DOUBLE-LISTS-DAG: -first-part-of-arg=[[FIRST:.+1.tgt.out]] -first-part-of-arg=[[THIRD:.+3.tgt.out]] -another-arg={{.+}}_out.prj -; CHECK-DOUBLE-LISTS-DAG: -first-part-of-arg=[[SECOND:.+2.tgt.out]] -first-part-of-arg=[[FOURTH:.+4.tgt.out]] -another-arg={{.+}}_out.prj_1 +; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[FIRST:.+1.tgt.out]] -first-part-of-arg=[[THIRD:.+3.tgt.out]] -another-arg={{.+}}_out.prj +; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[SECOND:.+2.tgt.out]] -first-part-of-arg=[[FOURTH:.+4.tgt.out]] -another-arg={{.+}}_out.prj_1 -; RUN: echo "%t1.tgt" > %t2.list -; RUN: echo "%t2.tgt" >> %t2.list -; RUN: echo "%t3.tgt" >> %t2.list -; RUN: echo "%t4.tgt" >> %t2.list -; RUN: llvm-foreach -j 2 --in-replace="{}" --in-file-list=%t2.list -- echo "{}" > %t2.res -; RUN: FileCheck < %t2.res %s --check-prefix=CHECK-PARALLEL-JOBS -; CHECK-PARALLEL-JOBS-DAG: [[FIRST:.+1.tgt]] -; CHECK-PARALLEL-JOBS-DAG: [[SECOND:.+2.tgt]] -; CHECK-PARALLEL-JOBS-DAG: [[THIRD:.+3.tgt]] -; CHECK-PARALLEL-JOBS-DAG: [[FOURTH:.+4.tgt]] From 497b6ac9e7793b821e071370fa3a1668e6890756 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 8 Sep 2021 14:20:56 -0700 Subject: [PATCH 58/82] Remove unrelated change Signed-off-by: Zahira Ammarguellat --- llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll b/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll index add22d9081674..2fa674bf1d8e3 100644 --- a/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll +++ b/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll @@ -24,4 +24,3 @@ ; RUN: FileCheck < %t1.res %s --check-prefix=CHECK-DOUBLE-LISTS ; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[FIRST:.+1.tgt.out]] -first-part-of-arg=[[THIRD:.+3.tgt.out]] -another-arg={{.+}}_out.prj ; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[SECOND:.+2.tgt.out]] -first-part-of-arg=[[FOURTH:.+4.tgt.out]] -another-arg={{.+}}_out.prj_1 - From ddf8394ebdd997bf736a8b533ddd7b6a0452f660 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 8 Sep 2021 14:29:56 -0700 Subject: [PATCH 59/82] Remove unrelated change Signed-off-by: Zahira Ammarguellat --- llvm/test/tools/llvm-foreach/llvm-foreach.cpp | 240 ++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 llvm/test/tools/llvm-foreach/llvm-foreach.cpp diff --git a/llvm/test/tools/llvm-foreach/llvm-foreach.cpp b/llvm/test/tools/llvm-foreach/llvm-foreach.cpp new file mode 100644 index 0000000000000..9a7f1a6031860 --- /dev/null +++ b/llvm/test/tools/llvm-foreach/llvm-foreach.cpp @@ -0,0 +1,240 @@ +//===- llvm-foreach.cpp - Command lines execution ---------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This source is utility to execute command lines. The specified command will +// be invoked as many times as necessary to use up the list of input items. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/LineIterator.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" +#include "llvm/Support/SystemUtils.h" + +#include + +using namespace llvm; + +static cl::list InputFileLists{ + "in-file-list", cl::OneOrMore, + cl::desc("Input list of file names, file names must be delimited by a " + "newline character."), + cl::value_desc("filename")}; + +static cl::list InputCommandArgs{ + cl::Positional, cl::OneOrMore, cl::desc(""), + cl::value_desc("command")}; + +static cl::list Replaces{ + "in-replace", cl::OneOrMore, + cl::desc("Specify input path in input command, this will be replaced with " + "names read from corresponding input list of files."), + cl::value_desc("R")}; + +static cl::opt OutReplace{ + "out-replace", + cl::desc("Specify output path in input command, this will be replaced with " + "name of temporary file created for writing command's outputs."), + cl::init(""), cl::value_desc("R")}; + +static cl::opt OutDirectory{ + "out-dir", + cl::desc("Specify directory for output files; If unspecified, assume " + "system temporary directory."), + cl::init(""), cl::value_desc("R")}; + +static cl::opt OutFilesExt{ + "out-ext", + cl::desc("Specify extension for output files; If unspecified, assume " + ".out"), + cl::init("out"), cl::value_desc("R")}; + +// Emit list of produced files for better integration with other tools. +static cl::opt OutputFileList{ + "out-file-list", cl::desc("Specify filename for list of outputs."), + cl::value_desc("filename"), cl::init("")}; + +static cl::opt OutIncrement{ + "out-increment", + cl::desc( + "Specify output file which should be incrementally named with each " + "pass."), + cl::init(""), cl::value_desc("R")}; + +static void error(const Twine &Msg) { + errs() << "llvm-foreach: " << Msg << '\n'; + exit(1); +} + +static void error(std::error_code EC, const Twine &Prefix) { + if (EC) + error(Prefix + ": " + EC.message()); +} + +int main(int argc, char **argv) { + cl::ParseCommandLineOptions( + argc, argv, + "llvm-foreach: Execute specified command as many times as\n" + "necessary to use up the list of input items.\n" + "Usage:\n" + "llvm-foreach --in-file-list=a.list --in-replace='{}' -- echo '{}'\n" + "NOTE: commands containig redirects are not supported by llvm-foreach\n" + "yet.\n"); + + ExitOnError ExitOnErr("llvm-foreach: "); + + if (InputFileLists.size() != Replaces.size()) + error("Number of input file lists and input path replaces don't match."); + + std::vector> MBs; + std::vector LineIterators; + for (auto &InputFileList : InputFileLists) { + std::unique_ptr MB = ExitOnErr( + errorOrToExpected(MemoryBuffer::getFileOrSTDIN(InputFileList))); + LineIterators.push_back(line_iterator(*MB)); + MBs.push_back(std::move(MB)); + } + + SmallVector Args(InputCommandArgs.begin(), + InputCommandArgs.end()); + + if (Args.empty()) + error("No command?"); + + struct ArgumentReplace { + size_t ArgNum = 0; + // Index in argument string where replace length starts. + size_t Start = 0; + size_t ReplaceLen = 0; + }; + + // Find args to replace with filenames from input list. + std::vector InReplaceArgs; + ArgumentReplace OutReplaceArg; + ArgumentReplace OutIncrementArg; + for (size_t i = 1; i < Args.size(); ++i) { + for (auto &Replace : Replaces) { + size_t ReplaceStart = Args[i].find(Replace); + if (ReplaceStart != StringRef::npos) + InReplaceArgs.push_back({i, ReplaceStart, Replace.size()}); + } + + if (!OutReplace.empty() && Args[i].contains(OutReplace)) { + size_t ReplaceStart = Args[i].find(OutReplace); + if (ReplaceStart != StringRef::npos) + OutReplaceArg = {i, ReplaceStart, OutReplace.size()}; + } + + if (!OutIncrement.empty() && Args[i].contains(OutIncrement)) { + size_t IncrementStart = Args[i].find(OutIncrement); + if (IncrementStart != StringRef::npos) + OutIncrementArg = {i, IncrementStart, OutIncrement.size()}; + } + } + + // Emit an error if user requested replace output file in the command but + // replace string is not found. + if (!OutReplace.empty() && OutReplaceArg.ArgNum == 0) + error("Couldn't find replace string for output in the command."); + + // Make sure that specified program exists, emit an error if not. + std::string Prog = + ExitOnErr(errorOrToExpected(sys::findProgramByName(Args[0]))); + + std::vector> FileLists(LineIterators.size()); + size_t PrevNumOfLines = 0; + for (size_t i = 0; i < FileLists.size(); ++i) { + for (; !LineIterators[i].is_at_eof(); ++LineIterators[i]) { + FileLists[i].push_back(LineIterators[i]->str()); + } + if (i != 0 && FileLists[i].size() != PrevNumOfLines) + error("All input file lists must have same number of lines!"); + PrevNumOfLines = FileLists[i].size(); + } + + std::error_code EC; + raw_fd_ostream OS{OutputFileList, EC, sys::fs::OpenFlags::OF_None}; + if (!OutputFileList.empty()) + error(EC, "error opening the file '" + OutputFileList + "'"); + + int Res = 0; + std::string ResOutArg; + std::string IncOutArg; + std::vector ResInArgs(InReplaceArgs.size()); + std::string ResFileList = ""; + for (size_t j = 0; j != FileLists[0].size(); ++j) { + for (size_t i = 0; i < InReplaceArgs.size(); ++i) { + ArgumentReplace CurReplace = InReplaceArgs[i]; + std::string OriginalString = InputCommandArgs[CurReplace.ArgNum]; + ResInArgs[i] = (Twine(OriginalString.substr(0, CurReplace.Start)) + + Twine(FileLists[i][j]) + + Twine(OriginalString.substr(CurReplace.Start + + CurReplace.ReplaceLen))) + .str(); + Args[CurReplace.ArgNum] = ResInArgs[i]; + } + + SmallString<128> Path; + if (!OutReplace.empty()) { + // Create a file for command result. Add file name to output + // file list if needed. + std::string TempFileNameBase = std::string(sys::path::stem(OutReplace)); + if (OutDirectory.empty()) + EC = sys::fs::createTemporaryFile(TempFileNameBase, OutFilesExt, Path); + else { + SmallString<128> PathPrefix(OutDirectory); + // "CreateUniqueFile" functions accepts "Model" - special string with + // substring containing sequence of "%" symbols. In the resulting + // filename "%" symbols sequence from "Model" string will be replaced + // with random chars to make it unique. + llvm::sys::path::append(PathPrefix, + TempFileNameBase + "-%%%%%%." + OutFilesExt); + EC = sys::fs::createUniqueFile(PathPrefix, Path); + } + error(EC, "Could not create a file for command output."); + + std::string OriginalString = InputCommandArgs[OutReplaceArg.ArgNum]; + ResOutArg = + (Twine(OriginalString.substr(0, OutReplaceArg.Start)) + Twine(Path) + + Twine(OriginalString.substr(OutReplaceArg.Start + + OutReplaceArg.ReplaceLen))) + .str(); + Args[OutReplaceArg.ArgNum] = ResOutArg; + + if (!OutputFileList.empty()) + OS << Path << "\n"; + } + + if (!OutIncrement.empty()) { + // Name the file by adding the current file list index to the name. + IncOutArg = InputCommandArgs[OutIncrementArg.ArgNum]; + if (j > 0) + IncOutArg += ("_" + Twine(j)).str(); + Args[OutIncrementArg.ArgNum] = IncOutArg; + } + + std::string ErrMsg; + // TODO: Add possibility to execute commands in parallel. + int Result = + sys::ExecuteAndWait(Prog, Args, /*Env=*/None, /*Redirects=*/None, + /*SecondsToWait=*/0, /*MemoryLimit=*/0, &ErrMsg); + if (Result != 0) { + errs() << "llvm-foreach: " << ErrMsg << '\n'; + Res = Result; + } + } + + if (!OutputFileList.empty()) { + OS.close(); + } + + return Res; +} From 1896639dc95ac512e04d63d17b0625f65520da96 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 8 Sep 2021 14:32:05 -0700 Subject: [PATCH 60/82] Remove unrelated change Signed-off-by: Zahira Ammarguellat --- llvm/test/tools/llvm-foreach/llvm-foreach.cpp | 240 ------------------ llvm/tools/llvm-foreach/llvm-foreach.cpp | 74 +----- 2 files changed, 9 insertions(+), 305 deletions(-) delete mode 100644 llvm/test/tools/llvm-foreach/llvm-foreach.cpp diff --git a/llvm/test/tools/llvm-foreach/llvm-foreach.cpp b/llvm/test/tools/llvm-foreach/llvm-foreach.cpp deleted file mode 100644 index 9a7f1a6031860..0000000000000 --- a/llvm/test/tools/llvm-foreach/llvm-foreach.cpp +++ /dev/null @@ -1,240 +0,0 @@ -//===- llvm-foreach.cpp - Command lines execution ---------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This source is utility to execute command lines. The specified command will -// be invoked as many times as necessary to use up the list of input items. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/FileSystem.h" -#include "llvm/Support/LineIterator.h" -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/Path.h" -#include "llvm/Support/Program.h" -#include "llvm/Support/SystemUtils.h" - -#include - -using namespace llvm; - -static cl::list InputFileLists{ - "in-file-list", cl::OneOrMore, - cl::desc("Input list of file names, file names must be delimited by a " - "newline character."), - cl::value_desc("filename")}; - -static cl::list InputCommandArgs{ - cl::Positional, cl::OneOrMore, cl::desc(""), - cl::value_desc("command")}; - -static cl::list Replaces{ - "in-replace", cl::OneOrMore, - cl::desc("Specify input path in input command, this will be replaced with " - "names read from corresponding input list of files."), - cl::value_desc("R")}; - -static cl::opt OutReplace{ - "out-replace", - cl::desc("Specify output path in input command, this will be replaced with " - "name of temporary file created for writing command's outputs."), - cl::init(""), cl::value_desc("R")}; - -static cl::opt OutDirectory{ - "out-dir", - cl::desc("Specify directory for output files; If unspecified, assume " - "system temporary directory."), - cl::init(""), cl::value_desc("R")}; - -static cl::opt OutFilesExt{ - "out-ext", - cl::desc("Specify extension for output files; If unspecified, assume " - ".out"), - cl::init("out"), cl::value_desc("R")}; - -// Emit list of produced files for better integration with other tools. -static cl::opt OutputFileList{ - "out-file-list", cl::desc("Specify filename for list of outputs."), - cl::value_desc("filename"), cl::init("")}; - -static cl::opt OutIncrement{ - "out-increment", - cl::desc( - "Specify output file which should be incrementally named with each " - "pass."), - cl::init(""), cl::value_desc("R")}; - -static void error(const Twine &Msg) { - errs() << "llvm-foreach: " << Msg << '\n'; - exit(1); -} - -static void error(std::error_code EC, const Twine &Prefix) { - if (EC) - error(Prefix + ": " + EC.message()); -} - -int main(int argc, char **argv) { - cl::ParseCommandLineOptions( - argc, argv, - "llvm-foreach: Execute specified command as many times as\n" - "necessary to use up the list of input items.\n" - "Usage:\n" - "llvm-foreach --in-file-list=a.list --in-replace='{}' -- echo '{}'\n" - "NOTE: commands containig redirects are not supported by llvm-foreach\n" - "yet.\n"); - - ExitOnError ExitOnErr("llvm-foreach: "); - - if (InputFileLists.size() != Replaces.size()) - error("Number of input file lists and input path replaces don't match."); - - std::vector> MBs; - std::vector LineIterators; - for (auto &InputFileList : InputFileLists) { - std::unique_ptr MB = ExitOnErr( - errorOrToExpected(MemoryBuffer::getFileOrSTDIN(InputFileList))); - LineIterators.push_back(line_iterator(*MB)); - MBs.push_back(std::move(MB)); - } - - SmallVector Args(InputCommandArgs.begin(), - InputCommandArgs.end()); - - if (Args.empty()) - error("No command?"); - - struct ArgumentReplace { - size_t ArgNum = 0; - // Index in argument string where replace length starts. - size_t Start = 0; - size_t ReplaceLen = 0; - }; - - // Find args to replace with filenames from input list. - std::vector InReplaceArgs; - ArgumentReplace OutReplaceArg; - ArgumentReplace OutIncrementArg; - for (size_t i = 1; i < Args.size(); ++i) { - for (auto &Replace : Replaces) { - size_t ReplaceStart = Args[i].find(Replace); - if (ReplaceStart != StringRef::npos) - InReplaceArgs.push_back({i, ReplaceStart, Replace.size()}); - } - - if (!OutReplace.empty() && Args[i].contains(OutReplace)) { - size_t ReplaceStart = Args[i].find(OutReplace); - if (ReplaceStart != StringRef::npos) - OutReplaceArg = {i, ReplaceStart, OutReplace.size()}; - } - - if (!OutIncrement.empty() && Args[i].contains(OutIncrement)) { - size_t IncrementStart = Args[i].find(OutIncrement); - if (IncrementStart != StringRef::npos) - OutIncrementArg = {i, IncrementStart, OutIncrement.size()}; - } - } - - // Emit an error if user requested replace output file in the command but - // replace string is not found. - if (!OutReplace.empty() && OutReplaceArg.ArgNum == 0) - error("Couldn't find replace string for output in the command."); - - // Make sure that specified program exists, emit an error if not. - std::string Prog = - ExitOnErr(errorOrToExpected(sys::findProgramByName(Args[0]))); - - std::vector> FileLists(LineIterators.size()); - size_t PrevNumOfLines = 0; - for (size_t i = 0; i < FileLists.size(); ++i) { - for (; !LineIterators[i].is_at_eof(); ++LineIterators[i]) { - FileLists[i].push_back(LineIterators[i]->str()); - } - if (i != 0 && FileLists[i].size() != PrevNumOfLines) - error("All input file lists must have same number of lines!"); - PrevNumOfLines = FileLists[i].size(); - } - - std::error_code EC; - raw_fd_ostream OS{OutputFileList, EC, sys::fs::OpenFlags::OF_None}; - if (!OutputFileList.empty()) - error(EC, "error opening the file '" + OutputFileList + "'"); - - int Res = 0; - std::string ResOutArg; - std::string IncOutArg; - std::vector ResInArgs(InReplaceArgs.size()); - std::string ResFileList = ""; - for (size_t j = 0; j != FileLists[0].size(); ++j) { - for (size_t i = 0; i < InReplaceArgs.size(); ++i) { - ArgumentReplace CurReplace = InReplaceArgs[i]; - std::string OriginalString = InputCommandArgs[CurReplace.ArgNum]; - ResInArgs[i] = (Twine(OriginalString.substr(0, CurReplace.Start)) + - Twine(FileLists[i][j]) + - Twine(OriginalString.substr(CurReplace.Start + - CurReplace.ReplaceLen))) - .str(); - Args[CurReplace.ArgNum] = ResInArgs[i]; - } - - SmallString<128> Path; - if (!OutReplace.empty()) { - // Create a file for command result. Add file name to output - // file list if needed. - std::string TempFileNameBase = std::string(sys::path::stem(OutReplace)); - if (OutDirectory.empty()) - EC = sys::fs::createTemporaryFile(TempFileNameBase, OutFilesExt, Path); - else { - SmallString<128> PathPrefix(OutDirectory); - // "CreateUniqueFile" functions accepts "Model" - special string with - // substring containing sequence of "%" symbols. In the resulting - // filename "%" symbols sequence from "Model" string will be replaced - // with random chars to make it unique. - llvm::sys::path::append(PathPrefix, - TempFileNameBase + "-%%%%%%." + OutFilesExt); - EC = sys::fs::createUniqueFile(PathPrefix, Path); - } - error(EC, "Could not create a file for command output."); - - std::string OriginalString = InputCommandArgs[OutReplaceArg.ArgNum]; - ResOutArg = - (Twine(OriginalString.substr(0, OutReplaceArg.Start)) + Twine(Path) + - Twine(OriginalString.substr(OutReplaceArg.Start + - OutReplaceArg.ReplaceLen))) - .str(); - Args[OutReplaceArg.ArgNum] = ResOutArg; - - if (!OutputFileList.empty()) - OS << Path << "\n"; - } - - if (!OutIncrement.empty()) { - // Name the file by adding the current file list index to the name. - IncOutArg = InputCommandArgs[OutIncrementArg.ArgNum]; - if (j > 0) - IncOutArg += ("_" + Twine(j)).str(); - Args[OutIncrementArg.ArgNum] = IncOutArg; - } - - std::string ErrMsg; - // TODO: Add possibility to execute commands in parallel. - int Result = - sys::ExecuteAndWait(Prog, Args, /*Env=*/None, /*Redirects=*/None, - /*SecondsToWait=*/0, /*MemoryLimit=*/0, &ErrMsg); - if (Result != 0) { - errs() << "llvm-foreach: " << ErrMsg << '\n'; - Res = Result; - } - } - - if (!OutputFileList.empty()) { - OS.close(); - } - - return Res; -} diff --git a/llvm/tools/llvm-foreach/llvm-foreach.cpp b/llvm/tools/llvm-foreach/llvm-foreach.cpp index 11d6b24af693e..9a7f1a6031860 100644 --- a/llvm/tools/llvm-foreach/llvm-foreach.cpp +++ b/llvm/tools/llvm-foreach/llvm-foreach.cpp @@ -18,9 +18,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" #include "llvm/Support/SystemUtils.h" -#include "llvm/Support/Threading.h" -#include #include using namespace llvm; @@ -71,17 +69,6 @@ static cl::opt OutIncrement{ "pass."), cl::init(""), cl::value_desc("R")}; -static cl::opt JobsInParallel{ - "jobs", - cl::Optional, - cl::init(1), - cl::desc("Specify the number of threads for launching input commands in " - "parallel mode"), -}; - -static cl::alias JobsInParallelShort{"j", cl::desc("Alias for --jobs"), - cl::aliasopt(JobsInParallel)}; - static void error(const Twine &Msg) { errs() << "llvm-foreach: " << Msg << '\n'; exit(1); @@ -92,32 +79,6 @@ static void error(std::error_code EC, const Twine &Prefix) { error(Prefix + ": " + EC.message()); } -// With BlockingWait=false this function just goes through the all -// submitted jobs to check if some of them have finished. -int checkIfJobsAreFinished(std::list &JobsSubmitted, - bool BlockingWait = true) { - std::string ErrMsg; - auto It = JobsSubmitted.begin(); - while (It != JobsSubmitted.end()) { - sys::ProcessInfo WaitResult = - sys::Wait(*It, 0, /*WaitUntilTerminates*/ BlockingWait, &ErrMsg); - - // Check if the job has finished (PID will be 0 if it's not). - if (!BlockingWait && !WaitResult.Pid) { - It++; - continue; - } - assert(BlockingWait || WaitResult.Pid); - It = JobsSubmitted.erase(It); - - if (WaitResult.ReturnCode != 0) { - errs() << "llvm-foreach: " << ErrMsg << '\n'; - return WaitResult.ReturnCode; - } - } - return 0; -} - int main(int argc, char **argv) { cl::ParseCommandLineOptions( argc, argv, @@ -199,16 +160,6 @@ int main(int argc, char **argv) { PrevNumOfLines = FileLists[i].size(); } - if (!JobsInParallel) - error("Number of parallel threads should be a positive integer"); - - size_t MaxSafeNumThreads = optimal_concurrency().compute_thread_count(); - if (JobsInParallel > MaxSafeNumThreads) { - JobsInParallel = MaxSafeNumThreads; - outs() << "llvm-foreach: adjusted number of threads to " - << MaxSafeNumThreads << " (max safe available).\n"; - } - std::error_code EC; raw_fd_ostream OS{OutputFileList, EC, sys::fs::OpenFlags::OF_None}; if (!OutputFileList.empty()) @@ -219,7 +170,6 @@ int main(int argc, char **argv) { std::string IncOutArg; std::vector ResInArgs(InReplaceArgs.size()); std::string ResFileList = ""; - std::list JobsSubmitted; for (size_t j = 0; j != FileLists[0].size(); ++j) { for (size_t i = 0; i < InReplaceArgs.size(); ++i) { ArgumentReplace CurReplace = InReplaceArgs[i]; @@ -271,22 +221,16 @@ int main(int argc, char **argv) { Args[OutIncrementArg.ArgNum] = IncOutArg; } - // Do not start execution of a new job until previous one(s) are finished, - // if the maximum number of parallel workers is reached. - while (JobsSubmitted.size() == JobsInParallel) - if (int Result = - checkIfJobsAreFinished(JobsSubmitted, /*BlockingWait*/ false)) - Res = Result; - - JobsSubmitted.emplace_back(sys::ExecuteNoWait( - Prog, Args, /*Env=*/None, /*Redirects=*/None, /*MemoryLimit=*/0)); - } - - // Wait for all commands to be executed. - while (!JobsSubmitted.empty()) - if (int Result = - checkIfJobsAreFinished(JobsSubmitted, /*BlockingWait*/ true)) + std::string ErrMsg; + // TODO: Add possibility to execute commands in parallel. + int Result = + sys::ExecuteAndWait(Prog, Args, /*Env=*/None, /*Redirects=*/None, + /*SecondsToWait=*/0, /*MemoryLimit=*/0, &ErrMsg); + if (Result != 0) { + errs() << "llvm-foreach: " << ErrMsg << '\n'; Res = Result; + } + } if (!OutputFileList.empty()) { OS.close(); From 2efd65dee3af46349d8fa69f87ff0ebd5ce004f6 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Thu, 9 Sep 2021 05:53:01 -0700 Subject: [PATCH 61/82] Remove unrelated change Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 6196730b0f830..b5a821c9959e0 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -2269,7 +2269,7 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { return handleSpecialType(FieldTy); } - bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &, + bool handleSyclSpecialType(const CXXRecordDecl *, const CXXBaseSpecifier &BS, QualType FieldTy) final { return handleSpecialType(FieldTy); } From ecbb2be32c322d877f657404b4c0dc301ce96545 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Thu, 9 Sep 2021 06:08:57 -0700 Subject: [PATCH 62/82] Remove unrelated change Signed-off-by: Zahira Ammarguellat --- .../tools/llvm-foreach/llvm-foreach-lin.ll | 38 ++++++++-- .../tools/llvm-foreach/llvm-foreach-win.ll | 38 ++++++++-- llvm/tools/llvm-foreach/llvm-foreach.cpp | 74 ++++++++++++++++--- 3 files changed, 125 insertions(+), 25 deletions(-) diff --git a/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll b/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll index 2fa674bf1d8e3..7aeaa800db13b 100644 --- a/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll +++ b/llvm/test/tools/llvm-foreach/llvm-foreach-lin.ll @@ -4,17 +4,26 @@ ; RUN: echo 'Content of second file' > %t2.tgt ; RUN: echo "%t1.tgt" > %t.list ; RUN: echo "%t2.tgt" >> %t.list -; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res +; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res ; RUN: FileCheck < %t.res %s -; CHECK: [[FIRST:.+1.tgt]] -; CHECK: [[SECOND:.+2.tgt]] -; +; CHECK-DAG: [[FIRST:.+1.tgt]] +; CHECK-DAG: [[SECOND:.+2.tgt]] + +; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res +; RUN: FileCheck < %t.res %s --check-prefix=CHECK-ORDER +; CHECK-ORDER: [[FIRST:.+1.tgt]] +; CHECK-ORDER: [[SECOND:.+2.tgt]] + ; RUN: llvm-foreach --in-replace="{}" --out-replace=%t --out-ext=out --in-file-list=%t.list --out-file-list=%t.out.list -- cp "{}" %t ; RUN: FileCheck < %t.out.list %s --check-prefix=CHECK-LIST +; RUN: llvm-foreach --jobs=2 --in-replace="{}" --out-replace=%t --out-ext=out --in-file-list=%t.list --out-file-list=%t.out.list -- cp "{}" %t +; RUN: FileCheck < %t.out.list %s --check-prefix=CHECK-LIST ; CHECK-LIST: [[FIRST:.+\.out]] ; CHECK-LIST: [[SECOND:.+\.out]] -; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.out.list -- FileCheck --input-file="{}" %s --check-prefix=CHECK-CONTENT -; CHECK-CONTENT: Content of +; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.out.list -- cat "{}" > %t.order +; RUN: FileCheck < %t.order %s --check-prefix=CHECK-CONTENT +; CHECK-CONTENT: Content of first file +; CHECK-CONTENT-NEXT: Content of second file ; RUN: echo 'something' > %t3.tgt ; RUN: echo 'something again' > %t4.tgt @@ -22,5 +31,18 @@ ; RUN: echo "%t4.tgt" >> %t1.list ; RUN: llvm-foreach --in-replace="{}" --in-replace="inrep" --in-file-list=%t.list --in-file-list=%t1.list --out-increment="%t_out.prj" -- echo -first-part-of-arg={}.out -first-part-of-arg=inrep.out -another-arg=%t_out.prj > %t1.res ; RUN: FileCheck < %t1.res %s --check-prefix=CHECK-DOUBLE-LISTS -; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[FIRST:.+1.tgt.out]] -first-part-of-arg=[[THIRD:.+3.tgt.out]] -another-arg={{.+}}_out.prj -; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[SECOND:.+2.tgt.out]] -first-part-of-arg=[[FOURTH:.+4.tgt.out]] -another-arg={{.+}}_out.prj_1 +; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-replace="inrep" --in-file-list=%t.list --in-file-list=%t1.list --out-increment="%t_out.prj" -- echo -first-part-of-arg={}.out -first-part-of-arg=inrep.out -another-arg=%t_out.prj > %t1.res +; RUN: FileCheck < %t1.res %s --check-prefix=CHECK-DOUBLE-LISTS +; CHECK-DOUBLE-LISTS-DAG: -first-part-of-arg=[[FIRST:.+1.tgt.out]] -first-part-of-arg=[[THIRD:.+3.tgt.out]] -another-arg={{.+}}_out.prj +; CHECK-DOUBLE-LISTS-DAG: -first-part-of-arg=[[SECOND:.+2.tgt.out]] -first-part-of-arg=[[FOURTH:.+4.tgt.out]] -another-arg={{.+}}_out.prj_1 + +; RUN: echo "%t1.tgt" > %t2.list +; RUN: echo "%t2.tgt" >> %t2.list +; RUN: echo "%t3.tgt" >> %t2.list +; RUN: echo "%t4.tgt" >> %t2.list +; RUN: llvm-foreach -j 2 --in-replace="{}" --in-file-list=%t2.list -- echo "{}" > %t2.res +; RUN: FileCheck < %t2.res %s --check-prefix=CHECK-PARALLEL-JOBS +; CHECK-PARALLEL-JOBS-DAG: [[FIRST:.+1.tgt]] +; CHECK-PARALLEL-JOBS-DAG: [[SECOND:.+2.tgt]] +; CHECK-PARALLEL-JOBS-DAG: [[THIRD:.+3.tgt]] +; CHECK-PARALLEL-JOBS-DAG: [[FOURTH:.+4.tgt]] diff --git a/llvm/test/tools/llvm-foreach/llvm-foreach-win.ll b/llvm/test/tools/llvm-foreach/llvm-foreach-win.ll index 9053e13c74a64..0072ab71956f4 100644 --- a/llvm/test/tools/llvm-foreach/llvm-foreach-win.ll +++ b/llvm/test/tools/llvm-foreach/llvm-foreach-win.ll @@ -4,17 +4,26 @@ ; RUN: echo 'Content of second file' > %t2.tgt ; RUN: echo "%t1.tgt" > %t.list ; RUN: echo "%t2.tgt" >> %t.list -; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res +; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res ; RUN: FileCheck < %t.res %s -; CHECK: [[FIRST:.+1.tgt]] -; CHECK: [[SECOND:.+2.tgt]] -; +; CHECK-DAG: [[FIRST:.+1.tgt]] +; CHECK-DAG: [[SECOND:.+2.tgt]] + +; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.list -- echo "{}" > %t.res +; RUN: FileCheck < %t.res %s --check-prefix=CHECK-ORDER +; CHECK-ORDER: [[FIRST:.+1.tgt]] +; CHECK-ORDER: [[SECOND:.+2.tgt]] + ; RUN: llvm-foreach --in-replace="{}" --out-replace=%t --out-ext=out --in-file-list=%t.list --out-file-list=%t.out.list -- xcopy /y "{}" %t ; RUN: FileCheck < %t.out.list %s --check-prefix=CHECK-LIST +; RUN: llvm-foreach --jobs=2 --in-replace="{}" --out-replace=%t --out-ext=out --in-file-list=%t.list --out-file-list=%t.out.list -- xcopy /y "{}" %t +; RUN: FileCheck < %t.out.list %s --check-prefix=CHECK-LIST ; CHECK-LIST: [[FIRST:.+\.out]] ; CHECK-LIST: [[SECOND:.+\.out]] -; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.out.list -- FileCheck --input-file="{}" %s --check-prefix=CHECK-CONTENT -; CHECK-CONTENT: Content of +; RUN: llvm-foreach --in-replace="{}" --in-file-list=%t.out.list -- cat "{}" > %t.order +; RUN: FileCheck < %t.order %s --check-prefix=CHECK-CONTENT +; CHECK-CONTENT: Content of first file +; CHECK-CONTENT-NEXT: Content of second file ; RUN: echo 'something' > %t3.tgt ; RUN: echo 'something again' > %t4.tgt @@ -22,5 +31,18 @@ ; RUN: echo "%t4.tgt" >> %t1.list ; RUN: llvm-foreach --in-replace="{}" --in-replace="inrep" --in-file-list=%t.list --in-file-list=%t1.list --out-increment=%t_out.prj -- echo -first-part-of-arg={}.out -first-part-of-arg=inrep.out -another-arg=%t_out.prj > %t1.res ; RUN: FileCheck < %t1.res %s --check-prefix=CHECK-DOUBLE-LISTS -; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[FIRST:.+1.tgt.out]] -first-part-of-arg=[[THIRD:.+3.tgt.out]] -another-arg={{.+}}_out.prj -; CHECK-DOUBLE-LISTS: -first-part-of-arg=[[SECOND:.+2.tgt.out]] -first-part-of-arg=[[FOURTH:.+4.tgt.out]] -another-arg={{.+}}_out.prj_1 +; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-replace="inrep" --in-file-list=%t.list --in-file-list=%t1.list --out-increment=%t_out.prj -- echo -first-part-of-arg={}.out -first-part-of-arg=inrep.out -another-arg=%t_out.prj > %t1.res +; RUN: FileCheck < %t1.res %s --check-prefix=CHECK-DOUBLE-LISTS +; CHECK-DOUBLE-LISTS-DAG: -first-part-of-arg=[[FIRST:.+1.tgt.out]] -first-part-of-arg=[[THIRD:.+3.tgt.out]] -another-arg={{.+}}_out.prj +; CHECK-DOUBLE-LISTS-DAG: -first-part-of-arg=[[SECOND:.+2.tgt.out]] -first-part-of-arg=[[FOURTH:.+4.tgt.out]] -another-arg={{.+}}_out.prj_1 + +; RUN: echo "%t1.tgt" > %t2.list +; RUN: echo "%t2.tgt" >> %t2.list +; RUN: echo "%t3.tgt" >> %t2.list +; RUN: echo "%t4.tgt" >> %t2.list +; RUN: llvm-foreach --jobs=2 --in-replace="{}" --in-file-list=%t2.list -- echo "{}" > %t2.res +; RUN: FileCheck < %t2.res %s --check-prefix=CHECK-PARALLEL-JOBS +; CHECK-PARALLEL-JOBS-DAG: [[FIRST:.+1.tgt]] +; CHECK-PARALLEL-JOBS-DAG: [[SECOND:.+2.tgt]] +; CHECK-PARALLEL-JOBS-DAG: [[THIRD:.+3.tgt]] +; CHECK-PARALLEL-JOBS-DAG: [[FOURTH:.+4.tgt]] diff --git a/llvm/tools/llvm-foreach/llvm-foreach.cpp b/llvm/tools/llvm-foreach/llvm-foreach.cpp index 9a7f1a6031860..11d6b24af693e 100644 --- a/llvm/tools/llvm-foreach/llvm-foreach.cpp +++ b/llvm/tools/llvm-foreach/llvm-foreach.cpp @@ -18,7 +18,9 @@ #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" #include "llvm/Support/SystemUtils.h" +#include "llvm/Support/Threading.h" +#include #include using namespace llvm; @@ -69,6 +71,17 @@ static cl::opt OutIncrement{ "pass."), cl::init(""), cl::value_desc("R")}; +static cl::opt JobsInParallel{ + "jobs", + cl::Optional, + cl::init(1), + cl::desc("Specify the number of threads for launching input commands in " + "parallel mode"), +}; + +static cl::alias JobsInParallelShort{"j", cl::desc("Alias for --jobs"), + cl::aliasopt(JobsInParallel)}; + static void error(const Twine &Msg) { errs() << "llvm-foreach: " << Msg << '\n'; exit(1); @@ -79,6 +92,32 @@ static void error(std::error_code EC, const Twine &Prefix) { error(Prefix + ": " + EC.message()); } +// With BlockingWait=false this function just goes through the all +// submitted jobs to check if some of them have finished. +int checkIfJobsAreFinished(std::list &JobsSubmitted, + bool BlockingWait = true) { + std::string ErrMsg; + auto It = JobsSubmitted.begin(); + while (It != JobsSubmitted.end()) { + sys::ProcessInfo WaitResult = + sys::Wait(*It, 0, /*WaitUntilTerminates*/ BlockingWait, &ErrMsg); + + // Check if the job has finished (PID will be 0 if it's not). + if (!BlockingWait && !WaitResult.Pid) { + It++; + continue; + } + assert(BlockingWait || WaitResult.Pid); + It = JobsSubmitted.erase(It); + + if (WaitResult.ReturnCode != 0) { + errs() << "llvm-foreach: " << ErrMsg << '\n'; + return WaitResult.ReturnCode; + } + } + return 0; +} + int main(int argc, char **argv) { cl::ParseCommandLineOptions( argc, argv, @@ -160,6 +199,16 @@ int main(int argc, char **argv) { PrevNumOfLines = FileLists[i].size(); } + if (!JobsInParallel) + error("Number of parallel threads should be a positive integer"); + + size_t MaxSafeNumThreads = optimal_concurrency().compute_thread_count(); + if (JobsInParallel > MaxSafeNumThreads) { + JobsInParallel = MaxSafeNumThreads; + outs() << "llvm-foreach: adjusted number of threads to " + << MaxSafeNumThreads << " (max safe available).\n"; + } + std::error_code EC; raw_fd_ostream OS{OutputFileList, EC, sys::fs::OpenFlags::OF_None}; if (!OutputFileList.empty()) @@ -170,6 +219,7 @@ int main(int argc, char **argv) { std::string IncOutArg; std::vector ResInArgs(InReplaceArgs.size()); std::string ResFileList = ""; + std::list JobsSubmitted; for (size_t j = 0; j != FileLists[0].size(); ++j) { for (size_t i = 0; i < InReplaceArgs.size(); ++i) { ArgumentReplace CurReplace = InReplaceArgs[i]; @@ -221,17 +271,23 @@ int main(int argc, char **argv) { Args[OutIncrementArg.ArgNum] = IncOutArg; } - std::string ErrMsg; - // TODO: Add possibility to execute commands in parallel. - int Result = - sys::ExecuteAndWait(Prog, Args, /*Env=*/None, /*Redirects=*/None, - /*SecondsToWait=*/0, /*MemoryLimit=*/0, &ErrMsg); - if (Result != 0) { - errs() << "llvm-foreach: " << ErrMsg << '\n'; - Res = Result; - } + // Do not start execution of a new job until previous one(s) are finished, + // if the maximum number of parallel workers is reached. + while (JobsSubmitted.size() == JobsInParallel) + if (int Result = + checkIfJobsAreFinished(JobsSubmitted, /*BlockingWait*/ false)) + Res = Result; + + JobsSubmitted.emplace_back(sys::ExecuteNoWait( + Prog, Args, /*Env=*/None, /*Redirects=*/None, /*MemoryLimit=*/0)); } + // Wait for all commands to be executed. + while (!JobsSubmitted.empty()) + if (int Result = + checkIfJobsAreFinished(JobsSubmitted, /*BlockingWait*/ true)) + Res = Result; + if (!OutputFileList.empty()) { OS.close(); } From 72c2b17d04d9aff207b6bf8d26972a2f14abcb2d Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 14 Sep 2021 12:40:59 -0700 Subject: [PATCH 63/82] Removed the __init_esimd method Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 24 ++++--------------- clang/test/CodeGenSYCL/Inputs/sycl.hpp | 1 - .../CodeGenSYCL/esimd-accessor-ptr-md.cpp | 6 ----- sycl/include/CL/sycl/accessor.hpp | 11 --------- 4 files changed, 5 insertions(+), 37 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index b5a821c9959e0..ae4691a5a9bff 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -58,7 +58,6 @@ enum KernelInvocationKind { }; static constexpr llvm::StringLiteral InitMethodName = "__init"; -static constexpr llvm::StringLiteral InitESIMDMethodName = "__init_esimd"; static constexpr llvm::StringLiteral InitSpecConstantsBuffer = "__init_specialization_constants_buffer"; static constexpr llvm::StringLiteral FinalizeMethodName = "__finalize"; @@ -1981,11 +1980,8 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { bool handleSpecialType(FieldDecl *FD, QualType FieldTy) { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); - llvm::StringLiteral MethodName = KernelDecl->hasAttr() - ? InitESIMDMethodName - : InitMethodName; CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); + isCXXRecordWithInitOrFinalizeMember(RecordDecl, InitMethodName); assert(InitMethod && "The type must have the __init method"); // Don't do -1 here because we count on this to be the first parameter added @@ -2089,11 +2085,8 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { QualType FieldTy) final { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); - llvm::StringLiteral MethodName = KernelDecl->hasAttr() - ? InitESIMDMethodName - : InitMethodName; CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); + isCXXRecordWithInitOrFinalizeMember(RecordDecl, InitMethodName); assert(InitMethod && "The type must have the __init method"); // Get access mode of accessor. @@ -2244,10 +2237,8 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { bool handleSpecialType(QualType FieldTy) { const CXXRecordDecl *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); - llvm::StringLiteral MethodName = - IsSIMD ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); + isCXXRecordWithInitOrFinalizeMember(RecordDecl, InitMethodName); assert(InitMethod && "The type must have the __init method"); for (const ParmVarDecl *Param : InitMethod->parameters()) addParam(Param->getType()); @@ -2814,11 +2805,6 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { return VD; } - const llvm::StringLiteral getInitMethodName() const { - bool IsSIMDKernel = isESIMDKernelType(KernelObj); - return IsSIMDKernel ? InitESIMDMethodName : InitMethodName; - } - // Default inits the type, then calls the init-method in the body. bool handleSpecialType(FieldDecl *FD, QualType Ty) { addFieldInit(FD, Ty, None, @@ -2827,7 +2813,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { addFieldMemberExpr(FD, Ty); const auto *RecordDecl = Ty->getAsCXXRecordDecl(); - createSpecialMethodCall(RecordDecl, getInitMethodName(), BodyStmts); + createSpecialMethodCall(RecordDecl, InitMethodName, BodyStmts); CXXMethodDecl *FinalizeMethod = isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName); // A finalize-method is expected for special type such as stream. @@ -2842,7 +2828,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { bool handleSpecialType(const CXXBaseSpecifier &BS, QualType Ty) { const auto *RecordDecl = Ty->getAsCXXRecordDecl(); addBaseInit(BS, Ty, InitializationKind::CreateDefault(KernelCallerSrcLoc)); - createSpecialMethodCall(RecordDecl, getInitMethodName(), BodyStmts); + createSpecialMethodCall(RecordDecl, InitMethodName, BodyStmts); return true; } diff --git a/clang/test/CodeGenSYCL/Inputs/sycl.hpp b/clang/test/CodeGenSYCL/Inputs/sycl.hpp index 5fdeb4c2e89de..2acc7c5a76e7b 100644 --- a/clang/test/CodeGenSYCL/Inputs/sycl.hpp +++ b/clang/test/CodeGenSYCL/Inputs/sycl.hpp @@ -197,7 +197,6 @@ class __attribute__((sycl_special_class)) accessor { private: void __init(__attribute__((opencl_global)) dataT *Ptr, range AccessRange, range MemRange, id Offset) {} - void __init_esimd(__attribute__((opencl_global)) dataT *Ptr) {} friend class stream; }; diff --git a/clang/test/CodeGenSYCL/esimd-accessor-ptr-md.cpp b/clang/test/CodeGenSYCL/esimd-accessor-ptr-md.cpp index b433c954feb8c..2e69ffa6f4504 100644 --- a/clang/test/CodeGenSYCL/esimd-accessor-ptr-md.cpp +++ b/clang/test/CodeGenSYCL/esimd-accessor-ptr-md.cpp @@ -5,8 +5,6 @@ // This test checks // 1) Proper 'kernel_arg_accessor_ptr' metadata is generated by the FE for // ESIMD kernels. -// 2) __init_esimd function is used to initialize the accessor rather than -// __init. #include "sycl.hpp" @@ -29,8 +27,4 @@ void test(int val) { // CHECK-LABEL: define {{.*}}spir_kernel void @_ZTSZZ4testiENKUlRN2cl4sycl7handlerEE_clES2_E12esimd_kernel( // --- Attributes // CHECK: {{.*}} !kernel_arg_accessor_ptr ![[ACC_PTR_ATTR:[0-9]+]] !sycl_explicit_simd !{{[0-9]+}} {{.*}}{ - // --- init_esimd call is expected instead of __init: - // CHECK: call spir_func void @{{.*}}__init_esimd{{.*}}(%"{{.*}}sycl::accessor" addrspace(4)* {{[^,]*}} %{{[0-9]+}}, i32 addrspace(1)* %{{[0-9]+}}) - // CHECK-LABEL: } - // CHECK: ![[ACC_PTR_ATTR]] = !{i1 true, i1 false, i1 true} } diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index f0707a2835572..622356965ccf9 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -904,11 +904,6 @@ class accessor : MData += Offset[0]; } - // __init variant used by the device compiler for ESIMD kernels. - // TODO In ESIMD accessors usage is limited for now - access range, mem - // range and offset are not supported. - void __init_esimd(ConcreteASPtrType Ptr) { MData = Ptr; } - ConcreteASPtrType getQualifiedPtr() const { return MData; } template imageAccessorInit(Image); } - // __init variant used by the device compiler for ESIMD kernels. - void __init_esimd(OCLImageTy Image) { this->imageAccessorInit(Image); } - public: // Default constructor for objects later initialized with __init member. accessor() = default; @@ -2089,9 +2081,6 @@ class __SYCL_SPECIAL_CLASS accessorimageAccessorInit(Image); } - // __init variant used by the device compiler for ESIMD kernels. - void __init_esimd(OCLImageTy Image) { this->imageAccessorInit(Image); } - public: // Default constructor for objects later initialized with __init member. accessor() = default; From b8e840c1eeac905ecea1b4cf24f027ecad53b49b Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 15 Sep 2021 06:21:23 -0700 Subject: [PATCH 64/82] Leaving the removal of __init_esimd method for another patch Signed-off-by: Zahira Ammarguellat --- clang/test/CodeGenSYCL/Inputs/sycl.hpp | 1 + sycl/include/CL/sycl/accessor.hpp | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/clang/test/CodeGenSYCL/Inputs/sycl.hpp b/clang/test/CodeGenSYCL/Inputs/sycl.hpp index 2acc7c5a76e7b..5fdeb4c2e89de 100644 --- a/clang/test/CodeGenSYCL/Inputs/sycl.hpp +++ b/clang/test/CodeGenSYCL/Inputs/sycl.hpp @@ -197,6 +197,7 @@ class __attribute__((sycl_special_class)) accessor { private: void __init(__attribute__((opencl_global)) dataT *Ptr, range AccessRange, range MemRange, id Offset) {} + void __init_esimd(__attribute__((opencl_global)) dataT *Ptr) {} friend class stream; }; diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 622356965ccf9..f0707a2835572 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -904,6 +904,11 @@ class accessor : MData += Offset[0]; } + // __init variant used by the device compiler for ESIMD kernels. + // TODO In ESIMD accessors usage is limited for now - access range, mem + // range and offset are not supported. + void __init_esimd(ConcreteASPtrType Ptr) { MData = Ptr; } + ConcreteASPtrType getQualifiedPtr() const { return MData; } template imageAccessorInit(Image); } + // __init variant used by the device compiler for ESIMD kernels. + void __init_esimd(OCLImageTy Image) { this->imageAccessorInit(Image); } + public: // Default constructor for objects later initialized with __init member. accessor() = default; @@ -2081,6 +2089,9 @@ class __SYCL_SPECIAL_CLASS accessorimageAccessorInit(Image); } + // __init variant used by the device compiler for ESIMD kernels. + void __init_esimd(OCLImageTy Image) { this->imageAccessorInit(Image); } + public: // Default constructor for objects later initialized with __init member. accessor() = default; From 98463ad9ea17ab6a42194feffc2c2ea4484bd6fe Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 15 Sep 2021 12:34:58 -0700 Subject: [PATCH 65/82] Refactor code to handle accesors' parameters. Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index ae4691a5a9bff..8633ffed997b9 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1953,9 +1953,10 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { SYCLIntelBufferLocationAttr::CreateImplicit(Ctx, LocationID)); } - // There is a discrepancy in how inherited accessors are handled. - void handleInheritedAccessor(const CXXRecordDecl *RecordDecl, FieldDecl *FD) { - handleAccessorPropertyList(Params.back(), RecordDecl, FD->getLocation()); + // Handle accessor's parameters for both, accessor as a field to a base class, + // or accessor as a base class. + void handleAccessorType(const CXXRecordDecl *RecordDecl, SourceLocation Loc) { + handleAccessorPropertyList(Params.back(), RecordDecl, Loc); if (KernelDecl->hasAttr()) // In ESIMD kernels accessor's pointer argument needs to be marked Params.back()->addAttr( @@ -1992,7 +1993,8 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { addParam(FD, ParamTy.getCanonicalType()); if (ParamTy.getTypePtr()->isPointerType() && !isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName)) - handleInheritedAccessor(RecordDecl, FD); + // Handle parameters for accessors as a field of a base class. + handleAccessorType(RecordDecl, FD->getLocation()); } LastParamIndex = ParamIndex; return true; @@ -2089,27 +2091,16 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { isCXXRecordWithInitOrFinalizeMember(RecordDecl, InitMethodName); assert(InitMethod && "The type must have the __init method"); - // Get access mode of accessor. - const auto *AccessorSpecializationDecl = - cast(RecordDecl); - const TemplateArgument &AccessModeArg = - AccessorSpecializationDecl->getTemplateArgs().get(2); - // Don't do -1 here because we count on this to be the first parameter added // (if any). size_t ParamIndex = Params.size(); for (const ParmVarDecl *Param : InitMethod->parameters()) { QualType ParamTy = Param->getType(); addParam(BS, ParamTy.getCanonicalType()); - if (ParamTy.getTypePtr()->isPointerType()) { - handleAccessorPropertyList(Params.back(), RecordDecl, BS.getBeginLoc()); - - // Add implicit attribute to parameter decl when it is a read only - // SYCL accessor. - if (isReadOnlyAccessor(AccessModeArg)) - Params.back()->addAttr(SYCLAccessorReadonlyAttr::CreateImplicit( - SemaRef.getASTContext())); - } + if (ParamTy.getTypePtr()->isPointerType() && + !isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName)) + // Handle parameters for accessors as a base class. + handleAccessorType(RecordDecl, BS.getBeginLoc()); } LastParamIndex = ParamIndex; return true; From 7130ef493cf6dc35d8305d01ec85c6a36c22b79d Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 15 Sep 2021 13:51:09 -0700 Subject: [PATCH 66/82] Fix comments. Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 8633ffed997b9..061628281da83 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1953,8 +1953,7 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { SYCLIntelBufferLocationAttr::CreateImplicit(Ctx, LocationID)); } - // Handle accessor's parameters for both, accessor as a field to a base class, - // or accessor as a base class. + // Additional processing is required for accessor type. void handleAccessorType(const CXXRecordDecl *RecordDecl, SourceLocation Loc) { handleAccessorPropertyList(Params.back(), RecordDecl, Loc); if (KernelDecl->hasAttr()) @@ -1993,7 +1992,9 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { addParam(FD, ParamTy.getCanonicalType()); if (ParamTy.getTypePtr()->isPointerType() && !isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName)) - // Handle parameters for accessors as a field of a base class. + // isPointerType removes sampler type. + // !isCXXRecordWithInitOrFinalizeMember removes stream type. Do this + // only for accessor type. handleAccessorType(RecordDecl, FD->getLocation()); } LastParamIndex = ParamIndex; @@ -2099,7 +2100,9 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { addParam(BS, ParamTy.getCanonicalType()); if (ParamTy.getTypePtr()->isPointerType() && !isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName)) - // Handle parameters for accessors as a base class. + // isPointerType removes sampler type. + // !isCXXRecordWithInitOrFinalizeMember removes stream type. Do this + // only for accessor type. handleAccessorType(RecordDecl, BS.getBeginLoc()); } LastParamIndex = ParamIndex; From 30c3ca823b704758e321c5b9b1c1109fa9572ba6 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Thu, 16 Sep 2021 05:41:52 -0700 Subject: [PATCH 67/82] Addressed review comments Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 061628281da83..8b224cfc99dce 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1957,7 +1957,7 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { void handleAccessorType(const CXXRecordDecl *RecordDecl, SourceLocation Loc) { handleAccessorPropertyList(Params.back(), RecordDecl, Loc); if (KernelDecl->hasAttr()) - // In ESIMD kernels accessor's pointer argument needs to be marked + // In ESIMD, the kernels accessor's pointer argument needs to be marked. Params.back()->addAttr( SYCLSimdAccessorPtrAttr::CreateImplicit(SemaRef.getASTContext())); // Get access mode of accessor. @@ -2297,10 +2297,11 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { using SyclKernelFieldHandler::handleSyclHalfType; }; -std::string getKernelArgDesc(std::string KernelArgDescription) { +std::string getKernelArgDesc(StringRef KernelArgDescription) { if (KernelArgDescription == ":" || KernelArgDescription == "") return ""; - return ("Compiler generated argument for " + KernelArgDescription + ","); + return ("Compiler generated argument for " + KernelArgDescription + ",") + .str(); } class SyclOptReportCreator : public SyclKernelFieldHandler { @@ -2308,12 +2309,11 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { SourceLocation KernelInvocationLoc; void addParam(const FieldDecl *KernelArg, QualType KernelArgType, - std::string KernelArgDescription) { + StringRef KernelArgDescription) { StringRef NameToEmitInDescription = KernelArg->getName(); const RecordDecl *KernelArgParent = KernelArg->getParent(); - if (KernelArgParent && KernelArgDescription == "decomposed struct/class") { + if (KernelArgParent && KernelArgDescription == "decomposed struct/class") NameToEmitInDescription = KernelArgParent->getName(); - } bool isWrappedField = KernelArgDescription == "WrappedPointer" || KernelArgDescription == "WrappedArray"; @@ -2350,7 +2350,7 @@ class SyclOptReportCreator : public SyclKernelFieldHandler { // Handles base classes. void addParam(const CXXBaseSpecifier &, QualType KernelArgType, - std::string KernelArgDescription) { + StringRef KernelArgDescription) { unsigned KernelArgSize = SemaRef.getASTContext().getTypeSizeInChars(KernelArgType).getQuantity(); SemaRef.getDiagnostics().getSYCLOptReport().AddKernelArgs( @@ -3224,6 +3224,7 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { isCXXRecordWithInitOrFinalizeMember(ClassTy, InitMethodName); assert(InitMethod && "type must have __init method"); const ParmVarDecl *SamplerArg = InitMethod->getParamDecl(0); + assert(SamplerArg && "Init method must have arguments"); addParam(SamplerArg->getType(), SYCLIntegrationHeader::kind_sampler, offsetOf(FD, FieldTy)); } From 730de7053ddd10a724f53306b79dd9c2633b18d4 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 22 Sep 2021 08:07:08 -0700 Subject: [PATCH 68/82] Put back the init_esimd and responded to review. The init_esimd changes should be in another PR Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 26 ++++++++++++++----- .../accessor-readonly-invalid-lib.cpp | 2 +- .../CodeGenSYCL/esimd-accessor-ptr-md.cpp | 6 +++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 8b224cfc99dce..a0db6f314b0de 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -58,6 +58,7 @@ enum KernelInvocationKind { }; static constexpr llvm::StringLiteral InitMethodName = "__init"; +static constexpr llvm::StringLiteral InitESIMDMethodName = "__init_esimd"; static constexpr llvm::StringLiteral InitSpecConstantsBuffer = "__init_specialization_constants_buffer"; static constexpr llvm::StringLiteral FinalizeMethodName = "__finalize"; @@ -1980,8 +1981,11 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { bool handleSpecialType(FieldDecl *FD, QualType FieldTy) { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); + llvm::StringLiteral MethodName = KernelDecl->hasAttr() + ? InitESIMDMethodName + : InitMethodName; CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, InitMethodName); + isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); // Don't do -1 here because we count on this to be the first parameter added @@ -2088,8 +2092,11 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { QualType FieldTy) final { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); + llvm::StringLiteral MethodName = KernelDecl->hasAttr() + ? InitESIMDMethodName + : InitMethodName; CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, InitMethodName); + isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); // Don't do -1 here because we count on this to be the first parameter added @@ -2231,8 +2238,10 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { bool handleSpecialType(QualType FieldTy) { const CXXRecordDecl *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); + llvm::StringLiteral MethodName = + IsSIMD ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, InitMethodName); + isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); for (const ParmVarDecl *Param : InitMethod->parameters()) addParam(Param->getType()); @@ -2799,6 +2808,11 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { return VD; } + const llvm::StringLiteral getInitMethodName() const { + bool IsSIMDKernel = isESIMDKernelType(KernelObj); + return IsSIMDKernel ? InitESIMDMethodName : InitMethodName; + } + // Default inits the type, then calls the init-method in the body. bool handleSpecialType(FieldDecl *FD, QualType Ty) { addFieldInit(FD, Ty, None, @@ -2807,7 +2821,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { addFieldMemberExpr(FD, Ty); const auto *RecordDecl = Ty->getAsCXXRecordDecl(); - createSpecialMethodCall(RecordDecl, InitMethodName, BodyStmts); + createSpecialMethodCall(RecordDecl, getInitMethodName(), BodyStmts); CXXMethodDecl *FinalizeMethod = isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName); // A finalize-method is expected for special type such as stream. @@ -2822,7 +2836,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { bool handleSpecialType(const CXXBaseSpecifier &BS, QualType Ty) { const auto *RecordDecl = Ty->getAsCXXRecordDecl(); addBaseInit(BS, Ty, InitializationKind::CreateDefault(KernelCallerSrcLoc)); - createSpecialMethodCall(RecordDecl, InitMethodName, BodyStmts); + createSpecialMethodCall(RecordDecl, getInitMethodName(), BodyStmts); return true; } @@ -4988,7 +5002,7 @@ bool Util::isSyclSpecialType(const QualType Ty) { const CXXRecordDecl *RecTy = Ty->getAsCXXRecordDecl(); if (!RecTy) return false; - return isCXXRecordWithInitOrFinalizeMember(RecTy, "__init"); + return RecTy->hasAttr(); } bool Util::isSyclHalfType(QualType Ty) { diff --git a/clang/test/CodeGenSYCL/accessor-readonly-invalid-lib.cpp b/clang/test/CodeGenSYCL/accessor-readonly-invalid-lib.cpp index a085f3da0bcce..ba334aaad8abe 100644 --- a/clang/test/CodeGenSYCL/accessor-readonly-invalid-lib.cpp +++ b/clang/test/CodeGenSYCL/accessor-readonly-invalid-lib.cpp @@ -60,7 +60,7 @@ struct _ImplT { template -class accessor { +class __attribute__((sycl_special_class)) accessor { public: void use(void) const {} diff --git a/clang/test/CodeGenSYCL/esimd-accessor-ptr-md.cpp b/clang/test/CodeGenSYCL/esimd-accessor-ptr-md.cpp index 2e69ffa6f4504..b433c954feb8c 100644 --- a/clang/test/CodeGenSYCL/esimd-accessor-ptr-md.cpp +++ b/clang/test/CodeGenSYCL/esimd-accessor-ptr-md.cpp @@ -5,6 +5,8 @@ // This test checks // 1) Proper 'kernel_arg_accessor_ptr' metadata is generated by the FE for // ESIMD kernels. +// 2) __init_esimd function is used to initialize the accessor rather than +// __init. #include "sycl.hpp" @@ -27,4 +29,8 @@ void test(int val) { // CHECK-LABEL: define {{.*}}spir_kernel void @_ZTSZZ4testiENKUlRN2cl4sycl7handlerEE_clES2_E12esimd_kernel( // --- Attributes // CHECK: {{.*}} !kernel_arg_accessor_ptr ![[ACC_PTR_ATTR:[0-9]+]] !sycl_explicit_simd !{{[0-9]+}} {{.*}}{ + // --- init_esimd call is expected instead of __init: + // CHECK: call spir_func void @{{.*}}__init_esimd{{.*}}(%"{{.*}}sycl::accessor" addrspace(4)* {{[^,]*}} %{{[0-9]+}}, i32 addrspace(1)* %{{[0-9]+}}) + // CHECK-LABEL: } + // CHECK: ![[ACC_PTR_ATTR]] = !{i1 true, i1 false, i1 true} } From b0297aa10f794ee634fbb1a0ff9f8b66d8ba563c Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Thu, 23 Sep 2021 05:10:38 -0700 Subject: [PATCH 69/82] Indentation Signed-off-by: Zahira Ammarguellat --- clang/test/CodeGenSYCL/Inputs/sycl.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/CodeGenSYCL/Inputs/sycl.hpp b/clang/test/CodeGenSYCL/Inputs/sycl.hpp index 5fdeb4c2e89de..8cad0b9c082a8 100644 --- a/clang/test/CodeGenSYCL/Inputs/sycl.hpp +++ b/clang/test/CodeGenSYCL/Inputs/sycl.hpp @@ -183,7 +183,7 @@ struct _ImplT { template > + typename propertyListT = ext::oneapi::accessor_property_list<>> class __attribute__((sycl_special_class)) accessor { public: From 179abad99cb87294618b19657f69737f52108804 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 5 Oct 2021 10:51:56 -0700 Subject: [PATCH 70/82] Fix LIT failures Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index eca709d7c8c9d..26d36b27f411c 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -784,7 +784,7 @@ class __image_array_slice__ { template -class accessor : +class __SYCL_SPECIAL_CLASS accessor : #ifndef __SYCL_DEVICE_ONLY__ public detail::AccessorBaseHost, #endif @@ -2052,8 +2052,8 @@ class __SYCL_SPECIAL_CLASS accessor -class accessor +class __SYCL_SPECIAL_CLASS accessor : public detail::image_accessor { public: From b8dd5cf5e4ac54cf5a7b004dc65612ce9addc4ae Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 5 Oct 2021 11:02:17 -0700 Subject: [PATCH 71/82] Fix format Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 26d36b27f411c..f6a9f294141d3 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1576,14 +1576,14 @@ class __SYCL_SPECIAL_CLASS accessor : multi_ptr(getQualifiedPtr() + LinearIndex)); } - template - typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, +template +typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, atomic> - operator[](id Index) const { - const size_t LinearIndex = getLinearIndex(Index); - return atomic( - multi_ptr(getQualifiedPtr() + LinearIndex)); - } +operator[](id Index) const { + const size_t LinearIndex = getLinearIndex(Index); + return atomic( + multi_ptr(getQualifiedPtr() + LinearIndex)); +} template typename detail::enable_if_t Date: Tue, 5 Oct 2021 11:08:06 -0700 Subject: [PATCH 72/82] Fix format Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index f6a9f294141d3..750c55edc2fe7 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1574,11 +1574,11 @@ class __SYCL_SPECIAL_CLASS accessor : const size_t LinearIndex = getLinearIndex(id()); return atomic( multi_ptr(getQualifiedPtr() + LinearIndex)); - } +} template typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, - atomic> + atomic> operator[](id Index) const { const size_t LinearIndex = getLinearIndex(Index); return atomic( From 4457a962928537eec983f182a1b41d1f8a2054d9 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Tue, 5 Oct 2021 15:05:23 -0700 Subject: [PATCH 73/82] Removing the property-list handing from (fake) FE header Signed-off-by: Zahira Ammarguellat --- clang/test/SemaSYCL/Inputs/sycl.hpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/clang/test/SemaSYCL/Inputs/sycl.hpp b/clang/test/SemaSYCL/Inputs/sycl.hpp index e423b6d09ece7..90c5f3042cb66 100644 --- a/clang/test/SemaSYCL/Inputs/sycl.hpp +++ b/clang/test/SemaSYCL/Inputs/sycl.hpp @@ -85,29 +85,28 @@ struct _ImplT { id Offset; }; -using propertyListT = ext::oneapi::accessor_property_list<>; -template +template struct DeviceValueType; -template -struct DeviceValueType { +template +struct DeviceValueType { using type = __attribute__((opencl_global)) dataT; }; -template -struct DeviceValueType { +template +struct DeviceValueType { using type = __attribute__((opencl_constant)) dataT; }; -template -struct DeviceValueType { +template +struct DeviceValueType { using type = __attribute__((opencl_local)) dataT; }; template > + typename propertyListT = ext::oneapi::accessor_property_list<>> class __attribute__((sycl_special_class)) accessor { public: void use(void) const {} @@ -115,7 +114,7 @@ class __attribute__((sycl_special_class)) accessor { _ImplT impl; private: - using PtrType = typename DeviceValueType::type *; + using PtrType = typename DeviceValueType::type *; void __init(PtrType Ptr, range AccessRange, range MemRange, id Offset) {} friend class stream; From d7a510563fcbd820882251a06ea471d2d666364e Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Wed, 13 Oct 2021 12:50:42 -0700 Subject: [PATCH 74/82] Making explicit the test for accessor kind and leave init_esimd as is until the change for it is introduced in RT Signed-off-by: Zahira Ammarguellat --- clang/include/clang/Basic/AttrDocs.td | 2 ++ clang/lib/Sema/SemaSYCL.cpp | 24 +++++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index fb104a51aa6dc..e37a3c7a72a57 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -413,6 +413,8 @@ headers to indicate that a class or a struct needs additional handling when it is passed from host to device. Please note that this is an attribute that is used for internal implementation and not intended to be used by external users. It is used for ``accessor``, ``sampler`` , or ``stream`` classes. +The types that own this attribute are excluded from device-copyable and other +type-legalization steps. .. code-block:: c++ class __attribute__((sycl_special_class)) accessor { diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 316e1dbcbde01..1011969402797 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1994,12 +1994,15 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { for (const ParmVarDecl *Param : InitMethod->parameters()) { QualType ParamTy = Param->getType(); addParam(FD, ParamTy.getCanonicalType()); + // FIXME: This code is temporary, and will be removed once the current + // crash (crash pre-existing this patch) is fixed. The function + // handleAccessorType is called only for types that have property list in + // their arguments, accessor for now. (itsn't called for sampler/stream). + // When adding new classes with property list this function needs to be + // renamed too. if (ParamTy.getTypePtr()->isPointerType() && - !isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName)) - // isPointerType removes sampler type. - // !isCXXRecordWithInitOrFinalizeMember removes stream type. Do this - // only for accessor type. - handleAccessorType(RecordDecl, FD->getLocation()); + Util::isSyclType(FieldTy, "accessor", true /*Tmp*/)) + handleAccessorType(RecordDecl, FD->getBeginLoc()); } LastParamIndex = ParamIndex; return true; @@ -2105,11 +2108,14 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { for (const ParmVarDecl *Param : InitMethod->parameters()) { QualType ParamTy = Param->getType(); addParam(BS, ParamTy.getCanonicalType()); + // FIXME: This code is temporary, and will be removed once the current + // crash (crash pre-existing this patch) is fixed. The function + // handleAccessorType is called only for types that have property list in + // their arguments, accessor for now. (itsn't called for sampler/stream). + // When adding new classes with property list this function needs to be + // renamed too. if (ParamTy.getTypePtr()->isPointerType() && - !isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName)) - // isPointerType removes sampler type. - // !isCXXRecordWithInitOrFinalizeMember removes stream type. Do this - // only for accessor type. + Util::isSyclType(FieldTy, "accessor", true /*Tmp*/)) handleAccessorType(RecordDecl, BS.getBeginLoc()); } LastParamIndex = ParamIndex; From e0c44d301765c788f3f9403ae59f38d43135c611 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Thu, 14 Oct 2021 08:56:52 -0700 Subject: [PATCH 75/82] Respond to review commentse Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 70 +++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 1011969402797..d35077bdf7179 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -996,9 +996,8 @@ static void addScopeAttrToLocalVars(CXXMethodDecl &F) { } /// Return method by name -static CXXMethodDecl * -isCXXRecordWithInitOrFinalizeMember(const CXXRecordDecl *CRD, - StringRef MethodName) { +static CXXMethodDecl *getMethodByName(const CXXRecordDecl *CRD, + StringRef MethodName) { CXXMethodDecl *Method; auto It = std::find_if(CRD->methods().begin(), CRD->methods().end(), [MethodName](const CXXMethodDecl *Method) { @@ -1981,11 +1980,13 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { bool handleSpecialType(FieldDecl *FD, QualType FieldTy) { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); - llvm::StringLiteral MethodName = KernelDecl->hasAttr() - ? InitESIMDMethodName - : InitMethodName; - CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); + llvm::StringLiteral MethodName = + KernelDecl->hasAttr() + ? Util::isSyclType(FieldTy, "accessor", true /*Tmp*/) + ? InitESIMDMethodName + : InitMethodName + : InitMethodName; + CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); // Don't do -1 here because we count on this to be the first parameter added @@ -1994,12 +1995,12 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { for (const ParmVarDecl *Param : InitMethod->parameters()) { QualType ParamTy = Param->getType(); addParam(FD, ParamTy.getCanonicalType()); - // FIXME: This code is temporary, and will be removed once the current - // crash (crash pre-existing this patch) is fixed. The function - // handleAccessorType is called only for types that have property list in - // their arguments, accessor for now. (itsn't called for sampler/stream). - // When adding new classes with property list this function needs to be - // renamed too. + // FIXME: This code is temporary, and will be removed once __init_esimd + // is removed and property list refactored. + // The function handleAccessorType includes a call to + // handleAccessorPropertyList. If new classes with property list are + // added, this code needs to be refactored to call + // handleAccessorPropertyList for each class which requires it. if (ParamTy.getTypePtr()->isPointerType() && Util::isSyclType(FieldTy, "accessor", true /*Tmp*/)) handleAccessorType(RecordDecl, FD->getBeginLoc()); @@ -2095,11 +2096,13 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { QualType FieldTy) final { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); - llvm::StringLiteral MethodName = KernelDecl->hasAttr() - ? InitESIMDMethodName - : InitMethodName; - CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); + llvm::StringLiteral MethodName = + KernelDecl->hasAttr() + ? Util::isSyclType(FieldTy, "accessor", true /*Tmp*/) + ? InitESIMDMethodName + : InitMethodName + : InitMethodName; + CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); // Don't do -1 here because we count on this to be the first parameter added @@ -2108,12 +2111,12 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { for (const ParmVarDecl *Param : InitMethod->parameters()) { QualType ParamTy = Param->getType(); addParam(BS, ParamTy.getCanonicalType()); - // FIXME: This code is temporary, and will be removed once the current - // crash (crash pre-existing this patch) is fixed. The function - // handleAccessorType is called only for types that have property list in - // their arguments, accessor for now. (itsn't called for sampler/stream). - // When adding new classes with property list this function needs to be - // renamed too. + // FIXME: This code is temporary, and will be removed once __init_esimd + // is removed and property list refactored. + // The function handleAccessorType includes a call to + // handleAccessorPropertyList. If new classes with property list are + // added, this code needs to be refactored to call + // handleAccessorPropertyList for each class which requires it. if (ParamTy.getTypePtr()->isPointerType() && Util::isSyclType(FieldTy, "accessor", true /*Tmp*/)) handleAccessorType(RecordDecl, BS.getBeginLoc()); @@ -2246,8 +2249,7 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler { assert(RecordDecl && "The type must be a RecordDecl"); llvm::StringLiteral MethodName = IsSIMD ? InitESIMDMethodName : InitMethodName; - CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, MethodName); + CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); for (const ParmVarDecl *Param : InitMethod->parameters()) addParam(Param->getType()); @@ -2733,7 +2735,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { void createSpecialMethodCall(const CXXRecordDecl *RD, StringRef MethodName, SmallVectorImpl &AddTo) { - CXXMethodDecl *Method = isCXXRecordWithInitOrFinalizeMember(RD, MethodName); + CXXMethodDecl *Method = getMethodByName(RD, MethodName); if (!Method) return; @@ -2827,7 +2829,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler { const auto *RecordDecl = Ty->getAsCXXRecordDecl(); createSpecialMethodCall(RecordDecl, getInitMethodName(), BodyStmts); CXXMethodDecl *FinalizeMethod = - isCXXRecordWithInitOrFinalizeMember(RecordDecl, FinalizeMethodName); + getMethodByName(RecordDecl, FinalizeMethodName); // A finalize-method is expected for special type such as stream. if (FinalizeMethod) createSpecialMethodCall(RecordDecl, FinalizeMethodName, FinalizeStmts); @@ -3224,8 +3226,9 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { bool handleSyclSpecialType(FieldDecl *FD, QualType FieldTy) final { const auto *ClassTy = FieldTy->getAsCXXRecordDecl(); assert(ClassTy && "Type must be a C++ record type"); - if (const auto *AccTy = dyn_cast( - FieldTy->getAsRecordDecl())) { + if (Util::isSyclType(FieldTy, "accessor", true /*Tmp*/)) { + const auto *AccTy = + dyn_cast(FieldTy->getAsRecordDecl()); assert(AccTy->getTemplateArgs().size() >= 2 && "Incorrect template args for Accessor Type"); int Dims = static_cast( @@ -3235,11 +3238,10 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler { Header.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, CurOffset + offsetOf(FD, FieldTy)); } else { - if (isCXXRecordWithInitOrFinalizeMember(ClassTy, FinalizeMethodName)) + if (getMethodByName(ClassTy, FinalizeMethodName)) addParam(FD, FieldTy, SYCLIntegrationHeader::kind_stream); else { - CXXMethodDecl *InitMethod = - isCXXRecordWithInitOrFinalizeMember(ClassTy, InitMethodName); + CXXMethodDecl *InitMethod = getMethodByName(ClassTy, InitMethodName); assert(InitMethod && "type must have __init method"); const ParmVarDecl *SamplerArg = InitMethod->getParamDecl(0); assert(SamplerArg && "Init method must have arguments"); From a736a7fe90163828f4d721bd31b6a30aae19a43a Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Thu, 14 Oct 2021 09:52:44 -0700 Subject: [PATCH 76/82] Respond to review comment Signed-off-by: Zahira Ammarguellat --- clang/lib/Sema/SemaSYCL.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index d35077bdf7179..0b989e747a9cd 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1981,10 +1981,9 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); llvm::StringLiteral MethodName = - KernelDecl->hasAttr() - ? Util::isSyclType(FieldTy, "accessor", true /*Tmp*/) - ? InitESIMDMethodName - : InitMethodName + KernelDecl->hasAttr() && + Util::isSyclType(FieldTy, "accessor", true /*Tmp*/) + ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); @@ -2097,10 +2096,9 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler { const auto *RecordDecl = FieldTy->getAsCXXRecordDecl(); assert(RecordDecl && "The type must be a RecordDecl"); llvm::StringLiteral MethodName = - KernelDecl->hasAttr() - ? Util::isSyclType(FieldTy, "accessor", true /*Tmp*/) - ? InitESIMDMethodName - : InitMethodName + KernelDecl->hasAttr() && + Util::isSyclType(FieldTy, "accessor", true /*Tmp*/) + ? InitESIMDMethodName : InitMethodName; CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, MethodName); assert(InitMethod && "The type must have the __init method"); From 71e8d97d3a79bbb649c8527ee437a2db06ae03cc Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Thu, 14 Oct 2021 11:27:50 -0700 Subject: [PATCH 77/82] Respond to review comment Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 750c55edc2fe7..4799a9c16a86d 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1574,16 +1574,16 @@ class __SYCL_SPECIAL_CLASS accessor : const size_t LinearIndex = getLinearIndex(id()); return atomic( multi_ptr(getQualifiedPtr() + LinearIndex)); -} + } -template -typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, + template + typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, atomic> -operator[](id Index) const { - const size_t LinearIndex = getLinearIndex(Index); - return atomic( - multi_ptr(getQualifiedPtr() + LinearIndex)); -} + operator[](id Index) const { + const size_t LinearIndex = getLinearIndex(Index); + return atomic( + multi_ptr(getQualifiedPtr() + LinearIndex)); + } template typename detail::enable_if_t Date: Thu, 14 Oct 2021 12:09:53 -0700 Subject: [PATCH 78/82] Fix formatting Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 4799a9c16a86d..7d501ad53cd37 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1574,6 +1574,7 @@ class __SYCL_SPECIAL_CLASS accessor : const size_t LinearIndex = getLinearIndex(id()); return atomic( multi_ptr(getQualifiedPtr() + LinearIndex)); + // clang-format off } template @@ -1584,7 +1585,7 @@ class __SYCL_SPECIAL_CLASS accessor : return atomic( multi_ptr(getQualifiedPtr() + LinearIndex)); } - + // clang-format on template typename detail::enable_if_t> From 462ff0968c224ebfa206046dc13ba2e05cab7fdd Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Thu, 14 Oct 2021 12:21:39 -0700 Subject: [PATCH 79/82] Fix formatting Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 7d501ad53cd37..dfd481e5a77b6 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1585,7 +1585,7 @@ class __SYCL_SPECIAL_CLASS accessor : return atomic( multi_ptr(getQualifiedPtr() + LinearIndex)); } - // clang-format on + template typename detail::enable_if_t> @@ -1594,7 +1594,7 @@ class __SYCL_SPECIAL_CLASS accessor : return atomic( multi_ptr(getQualifiedPtr() + LinearIndex)); } - + // clang-format on template 1)>> typename AccessorCommonT::template AccessorSubscript operator[](size_t Index) const { From d1707175f2ed094a66f138d7f203e2c3e8433db8 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Fri, 15 Oct 2021 05:03:56 -0700 Subject: [PATCH 80/82] Removed clang-format directives and fixed indentation Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index dfd481e5a77b6..db2a0f898f694 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1571,15 +1571,14 @@ class __SYCL_SPECIAL_CLASS accessor : AccessMode == access::mode::atomic, atomic>() const { #endif - const size_t LinearIndex = getLinearIndex(id()); - return atomic( - multi_ptr(getQualifiedPtr() + LinearIndex)); - // clang-format off + const size_t LinearIndex = getLinearIndex(id()); + return atomic( + multi_ptr(getQualifiedPtr() + LinearIndex)); } template typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, - atomic> + atomic> operator[](id Index) const { const size_t LinearIndex = getLinearIndex(Index); return atomic( @@ -1594,7 +1593,6 @@ class __SYCL_SPECIAL_CLASS accessor : return atomic( multi_ptr(getQualifiedPtr() + LinearIndex)); } - // clang-format on template 1)>> typename AccessorCommonT::template AccessorSubscript operator[](size_t Index) const { From 80cb0d6cb869d38177288f844107ee8d0c451cc7 Mon Sep 17 00:00:00 2001 From: Zahira Ammarguellat Date: Fri, 15 Oct 2021 05:22:50 -0700 Subject: [PATCH 81/82] Fix indentation Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index db2a0f898f694..015b970ec1982 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1571,19 +1571,19 @@ class __SYCL_SPECIAL_CLASS accessor : AccessMode == access::mode::atomic, atomic>() const { #endif - const size_t LinearIndex = getLinearIndex(id()); - return atomic( - multi_ptr(getQualifiedPtr() + LinearIndex)); - } + const size_t LinearIndex = getLinearIndex(id()); + return atomic( + multi_ptr(getQualifiedPtr() + LinearIndex)); +} - template - typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, - atomic> - operator[](id Index) const { - const size_t LinearIndex = getLinearIndex(Index); - return atomic( - multi_ptr(getQualifiedPtr() + LinearIndex)); - } +template +typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, + atomic> +operator[](id Index) const { + const size_t LinearIndex = getLinearIndex(Index); + return atomic( + multi_ptr(getQualifiedPtr() + LinearIndex)); +} template typename detail::enable_if_t Date: Fri, 15 Oct 2021 07:34:51 -0700 Subject: [PATCH 82/82] Fix indentation Signed-off-by: Zahira Ammarguellat --- sycl/include/CL/sycl/accessor.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 015b970ec1982..012a257bb6707 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -1574,16 +1574,16 @@ class __SYCL_SPECIAL_CLASS accessor : const size_t LinearIndex = getLinearIndex(id()); return atomic( multi_ptr(getQualifiedPtr() + LinearIndex)); -} + } -template -typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, + template + typename detail::enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic, atomic> -operator[](id Index) const { - const size_t LinearIndex = getLinearIndex(Index); - return atomic( - multi_ptr(getQualifiedPtr() + LinearIndex)); -} + operator[](id Index) const { + const size_t LinearIndex = getLinearIndex(Index); + return atomic( + multi_ptr(getQualifiedPtr() + LinearIndex)); + } template typename detail::enable_if_t