Skip to content

Commit e71b32a

Browse files
Naghasanjsji
authored andcommitted
lGeneric cast integration for SYCL (#18841)
__builtin_spirv_generic_cast_to_ptr_explicit was added upstreaming but because it has limited SYCL support, tests can't run properly.
1 parent fbe1d9a commit e71b32a

File tree

4 files changed

+32
-17
lines changed

4 files changed

+32
-17
lines changed

clang/lib/Headers/__clang_spirv_builtins.h

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626
#define __constant __attribute__((opencl_constant))
2727
#ifdef __SYCL_DEVICE_ONLY__
2828
#define __generic
29+
#define __SPIRV_SYCL_EXTERNAL __attribute__((sycl_device))
2930
#else
3031
#define __generic __attribute__((opencl_generic))
32+
#define __SPIRV_SYCL_EXTERNAL
3133
#endif
3234

3335
// Check if SPIR-V builtins are supported.
@@ -45,60 +47,60 @@
4547

4648
// OpGenericCastToPtrExplicit
4749

48-
extern __SPIRV_overloadable
50+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
4951
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
5052
__global void *__spirv_GenericCastToPtrExplicit_ToGlobal(__generic void *,
5153
int) __SPIRV_NOEXCEPT;
52-
extern __SPIRV_overloadable
54+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
5355
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
5456
__global const void *
5557
__spirv_GenericCastToPtrExplicit_ToGlobal(__generic const void *,
5658
int) __SPIRV_NOEXCEPT;
57-
extern __SPIRV_overloadable
59+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
5860
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
5961
__global volatile void *
6062
__spirv_GenericCastToPtrExplicit_ToGlobal(__generic volatile void *,
6163
int) __SPIRV_NOEXCEPT;
62-
extern __SPIRV_overloadable
64+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
6365
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
6466
__global const volatile void *
6567
__spirv_GenericCastToPtrExplicit_ToGlobal(__generic const volatile void *,
6668
int) __SPIRV_NOEXCEPT;
67-
extern __SPIRV_overloadable
69+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
6870
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
6971
__local void *__spirv_GenericCastToPtrExplicit_ToLocal(__generic void *,
7072
int) __SPIRV_NOEXCEPT;
71-
extern __SPIRV_overloadable
73+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
7274
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
7375
__local const void *
7476
__spirv_GenericCastToPtrExplicit_ToLocal(__generic const void *,
7577
int) __SPIRV_NOEXCEPT;
76-
extern __SPIRV_overloadable
78+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
7779
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
7880
__local volatile void *
7981
__spirv_GenericCastToPtrExplicit_ToLocal(__generic volatile void *,
8082
int) __SPIRV_NOEXCEPT;
81-
extern __SPIRV_overloadable
83+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
8284
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
8385
__local const volatile void *
8486
__spirv_GenericCastToPtrExplicit_ToLocal(__generic const volatile void *,
8587
int) __SPIRV_NOEXCEPT;
86-
extern __SPIRV_overloadable
88+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
8789
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
8890
__private void *
8991
__spirv_GenericCastToPtrExplicit_ToPrivate(__generic void *,
9092
int) __SPIRV_NOEXCEPT;
91-
extern __SPIRV_overloadable
93+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
9294
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
9395
__private const void *
9496
__spirv_GenericCastToPtrExplicit_ToPrivate(__generic const void *,
9597
int) __SPIRV_NOEXCEPT;
96-
extern __SPIRV_overloadable
98+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
9799
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
98100
__private volatile void *
99101
__spirv_GenericCastToPtrExplicit_ToPrivate(__generic volatile void *,
100102
int) __SPIRV_NOEXCEPT;
101-
extern __SPIRV_overloadable
103+
extern __SPIRV_overloadable __SPIRV_SYCL_EXTERNAL
102104
__SPIRV_BUILTIN_ALIAS(__builtin_spirv_generic_cast_to_ptr_explicit)
103105
__private const volatile void *
104106
__spirv_GenericCastToPtrExplicit_ToPrivate(__generic const volatile void *,
@@ -172,6 +174,7 @@ __spirv_GenericCastToPtr_ToPrivate(__generic const volatile void *p,
172174
#undef __local
173175
#undef __constant
174176
#undef __generic
177+
#undef __SPIRV_SYCL_EXTERNAL
175178

176179
#undef __SPIRV_BUILTIN_ALIAS
177180
#undef __SPIRV_NOEXCEPT

clang/lib/Sema/SemaDeclAttr.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5922,11 +5922,12 @@ static void handleBuiltinAliasAttr(Sema &S, Decl *D,
59225922
bool IsSPIRV = S.Context.getTargetInfo().getTriple().isSPIRV();
59235923
bool IsHLSL = S.Context.getLangOpts().HLSL;
59245924
bool IsSYCL = S.Context.getLangOpts().isSYCL();
5925+
bool IsTSBuiltin = S.Context.BuiltinInfo.isTSBuiltin(BuiltinID);
59255926
if ((IsAArch64 && !S.ARM().SveAliasValid(BuiltinID, AliasName)) ||
59265927
(IsARM && !S.ARM().MveAliasValid(BuiltinID, AliasName) &&
59275928
!S.ARM().CdeAliasValid(BuiltinID, AliasName)) ||
59285929
(IsRISCV && !S.RISCV().isAliasValid(BuiltinID, AliasName)) ||
5929-
(IsSYCL && !SYCLAliasValid(S.Context, BuiltinID)) ||
5930+
(IsSYCL && !IsTSBuiltin && !SYCLAliasValid(S.Context, BuiltinID)) ||
59305931
(!IsAArch64 && !IsARM && !IsRISCV && !IsHLSL && !IsSYCL && !IsSPIRV)) {
59315932
S.Diag(AL.getLoc(), diag::err_attribute_builtin_alias) << AL;
59325933
return;

clang/test/CodeGenSPIRV/Builtins/generic_cast_to_ptr_explicit.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@
22
// RUN: %clang_cc1 -O1 -triple spirv64 -cl-std=CL3.0 -x cl %s -emit-llvm -o - | FileCheck %s
33
// RUN: %clang_cc1 -O1 -triple spirv32 -cl-std=CL3.0 -x cl %s -emit-llvm -o - | FileCheck %s
44

5+
#ifdef __SYCL_DEVICE_ONLY__
6+
#define SYCL_EXTERNAL __attribute__((sycl_device))
7+
#else
8+
#define SYCL_EXTERNAL
9+
#endif
10+
511
// CHECK: spir_func noundef ptr @test_cast_to_private(
612
// CHECK-SAME: ptr addrspace(4) noundef readnone [[P:%.*]]
713
// CHECK-NEXT: [[ENTRY:.*:]]
814
// CHECK-NEXT: [[SPV_CAST:%.*]] = tail call noundef ptr @llvm.spv.generic.cast.to.ptr.explicit.p0(ptr addrspace(4) %p)
915
// CHECK-NEXT: ret ptr [[SPV_CAST]]
1016
//
11-
__attribute__((opencl_private)) int* test_cast_to_private(int* p) {
17+
SYCL_EXTERNAL __attribute__((opencl_private)) int* test_cast_to_private(int* p) {
1218
return __builtin_spirv_generic_cast_to_ptr_explicit(p, 7);
1319
}
1420

@@ -18,7 +24,7 @@ __attribute__((opencl_private)) int* test_cast_to_private(int* p) {
1824
// CHECK-NEXT: [[SPV_CAST:%.*]] = tail call noundef ptr addrspace(1) @llvm.spv.generic.cast.to.ptr.explicit.p1(ptr addrspace(4) %p)
1925
// CHECK-NEXT: ret ptr addrspace(1) [[SPV_CAST]]
2026
//
21-
__attribute__((opencl_global)) int* test_cast_to_global(int* p) {
27+
SYCL_EXTERNAL __attribute__((opencl_global)) int* test_cast_to_global(int* p) {
2228
return __builtin_spirv_generic_cast_to_ptr_explicit(p, 5);
2329
}
2430

@@ -28,6 +34,6 @@ __attribute__((opencl_global)) int* test_cast_to_global(int* p) {
2834
// CHECK-NEXT: [[SPV_CAST:%.*]] = tail call noundef ptr addrspace(3) @llvm.spv.generic.cast.to.ptr.explicit.p3(ptr addrspace(4) %p)
2935
// CHECK-NEXT: ret ptr addrspace(3) [[SPV_CAST]]
3036
//
31-
__attribute__((opencl_local)) int* test_cast_to_local(int* p) {
37+
SYCL_EXTERNAL __attribute__((opencl_local)) int* test_cast_to_local(int* p) {
3238
return __builtin_spirv_generic_cast_to_ptr_explicit(p, 4);
3339
}

clang/test/Headers/spirv_functions.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
// RUN: %clang_cc1 -Wno-unused-value -O0 -internal-isystem %S/../../lib/Headers -include __clang_spirv_builtins.h -triple spirv64 -emit-llvm %s -fsycl-is-device -o - | FileCheck %s -check-prefixes=SPV
22
// RUN: %clang_cc1 -Wno-unused-value -O0 -internal-isystem %S/../../lib/Headers -include __clang_spirv_builtins.h -triple nvptx64 -emit-llvm %s -fsycl-is-device -o - | FileCheck %s -check-prefixes=NV
33

4+
#ifdef __SYCL_DEVICE_ONLY__
5+
#define SYCL_EXTERNAL __attribute__((sycl_device))
6+
#else
7+
#define SYCL_EXTERNAL
8+
#endif
49

510
// SPV: void @_Z9test_castPi
611
// SPV: call noundef ptr addrspace(1) @llvm.spv.generic.cast.to.ptr.explicit.p1
@@ -15,7 +20,7 @@
1520
// NV: call noundef ptr @_Z42__spirv_GenericCastToPtrExplicit_ToPrivatePvi
1621
// NV: addrspacecast ptr %{{.*}} to ptr addrspace(1)
1722
// NV: addrspacecast ptr %{{.*}} to ptr addrspace(3)
18-
void test_cast(int* p) {
23+
SYCL_EXTERNAL void test_cast(int* p) {
1924
__spirv_GenericCastToPtrExplicit_ToGlobal(p, 5);
2025
__spirv_GenericCastToPtrExplicit_ToLocal(p, 4);
2126
__spirv_GenericCastToPtrExplicit_ToPrivate(p, 7);

0 commit comments

Comments
 (0)