Skip to content

Commit 7e5a7aa

Browse files
v-klochkovvladimirlaz
authored andcommitted
[SYCL] Common Reference Semantics for accessor class
Signed-off-by: Vyacheslav N Klochkov <[email protected]>
1 parent ced972a commit 7e5a7aa

File tree

8 files changed

+352
-104
lines changed

8 files changed

+352
-104
lines changed

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 15 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -650,21 +650,20 @@ static void buildArgTys(ASTContext &Context, CXXRecordDecl *KernelObj,
650650
CreateAndAddPrmDsc(Fld, PointerType);
651651

652652
FieldDecl *AccessRangeFld =
653-
getFieldDeclByName(RecordDecl, {"__impl", "AccessRange"});
653+
getFieldDeclByName(RecordDecl, {"impl", "AccessRange"});
654654
assert(AccessRangeFld &&
655-
"The accessor must contain the AccessRange from the __impl field");
655+
"The accessor.impl must contain the AccessRange field");
656656
CreateAndAddPrmDsc(AccessRangeFld, AccessRangeFld->getType());
657657

658658
FieldDecl *MemRangeFld =
659-
getFieldDeclByName(RecordDecl, {"__impl", "MemRange"});
659+
getFieldDeclByName(RecordDecl, {"impl", "MemRange"});
660660
assert(MemRangeFld &&
661-
"The accessor must contain the MemRange from the __impl field");
661+
"The accessor.impl must contain the MemRange field");
662662
CreateAndAddPrmDsc(MemRangeFld, MemRangeFld->getType());
663663

664664
FieldDecl *OffsetFld =
665-
getFieldDeclByName(RecordDecl, {"__impl", "Offset"});
666-
assert(OffsetFld &&
667-
"The accessor must contain the Offset from the __impl field");
665+
getFieldDeclByName(RecordDecl, {"impl", "Offset"});
666+
assert(OffsetFld && "The accessor.impl must contain the Offset field");
668667
CreateAndAddPrmDsc(OffsetFld, OffsetFld->getType());
669668
} else if (Util::isSyclStreamType(ArgTy)) {
670669
// the parameter is a SYCL stream object
@@ -710,37 +709,18 @@ static void populateIntHeader(SYCLIntegrationHeader &H, const StringRef Name,
710709
uint64_t Offset = Layout.getFieldOffset(Fld->getFieldIndex()) / 8;
711710

712711
if (Util::isSyclAccessorType(ArgTy)) {
713-
// The parameter is a SYCL accessor object - split into three
714-
// parameters, so need to generate three descriptors.
715-
// ... first descriptor (translated to pointer kernel parameter):
712+
// The parameter is a SYCL accessor object.
713+
// The Info field of the parameter descriptor for accessor contains
714+
// two template parameters packed into thid integer field:
715+
// - target (e.g. global_buffer, constant_buffer, local);
716+
// - dimension of the accessor.
716717
const auto *AccTy = ArgTy->getAsCXXRecordDecl();
717718
assert(AccTy && "accessor must be of a record type");
718719
const auto *AccTmplTy = cast<ClassTemplateSpecializationDecl>(AccTy);
719-
H.addParamDesc(SYCLIntegrationHeader::kind_accessor,
720-
getAccessTarget(AccTmplTy), Offset);
721-
// ... second descriptor (translated to access range kernel parameter):
722-
FieldDecl *AccessRngFld =
723-
getFieldDeclByName(AccTy, {"__impl", "AccessRange"}, &Offset);
724-
uint64_t Sz =
725-
Ctx.getTypeSizeInChars(AccessRngFld->getType()).getQuantity();
726-
H.addParamDesc(SYCLIntegrationHeader::kind_std_layout,
727-
static_cast<unsigned>(Sz), static_cast<unsigned>(Offset));
728-
// ... third descriptor (translated to mem range kernel parameter):
729-
// Get offset in bytes
730-
Offset = Layout.getFieldOffset(Fld->getFieldIndex()) / 8;
731-
FieldDecl *MemRngFld =
732-
getFieldDeclByName(AccTy, {"__impl", "MemRange"}, &Offset);
733-
Sz = Ctx.getTypeSizeInChars(MemRngFld->getType()).getQuantity();
734-
H.addParamDesc(SYCLIntegrationHeader::kind_std_layout,
735-
static_cast<unsigned>(Sz), static_cast<unsigned>(Offset));
736-
// ... fourth descriptor (translated to id kernel parameter):
737-
// Get offset in bytes
738-
Offset = Layout.getFieldOffset(Fld->getFieldIndex()) / 8;
739-
FieldDecl *OffstFld =
740-
getFieldDeclByName(AccTy, {"__impl", "Offset"}, &Offset);
741-
Sz = Ctx.getTypeSizeInChars(OffstFld->getType()).getQuantity();
742-
H.addParamDesc(SYCLIntegrationHeader::kind_std_layout,
743-
static_cast<unsigned>(Sz), static_cast<unsigned>(Offset));
720+
int Dims = static_cast<int>(
721+
AccTmplTy->getTemplateArgs()[1].getAsIntegral().getExtValue());
722+
int Info = getAccessTarget(AccTmplTy) | (Dims << 11);
723+
H.addParamDesc(SYCLIntegrationHeader::kind_accessor, Info, Offset);
744724
} else if (Util::isSyclStreamType(ArgTy)) {
745725
// the parameter is a SYCL stream object
746726
llvm_unreachable("streams not supported yet");

clang/test/CodeGenSYCL/Inputs/sycl.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,15 @@ template <typename dataT, int dimensions, access::mode accessmode,
106106
class accessor {
107107

108108
public:
109-
void __init(__global dataT *Ptr, range<dimensions> AccessRange,
110-
range<dimensions> MemRange, id<dimensions> Offset) {}
111109
void use(void) const {}
112110
template <typename... T>
113111
void use(T... args) {}
114112
template <typename... T>
115113
void use(T... args) const {}
116-
_ImplT<dimensions> __impl;
114+
_ImplT<dimensions> impl;
115+
private:
116+
void __init(__global dataT *Ptr, range<dimensions> AccessRange,
117+
range<dimensions> MemRange, id<dimensions> Offset) {}
117118
};
118119

119120
class kernel {};

clang/test/CodeGenSYCL/integration_header.cpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,16 @@
2222
// CHECK-NEXT: const kernel_param_desc_t kernel_signatures[] = {
2323
// CHECK-NEXT: //--- _ZTSZ4mainE12first_kernel
2424
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 },
25-
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 2014, 4 },
26-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 4 },
27-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 5 },
28-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 6 },
29-
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 2016, 7 },
30-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 7 },
31-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 8 },
32-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 9 },
25+
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 4 },
26+
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 7 },
3327
// CHECK-EMPTY:
3428
// CHECK-NEXT: //--- _ZTSN16second_namespace13second_kernelIcEE
3529
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 },
36-
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 2016, 4 },
37-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 4 },
38-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 5 },
39-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 6 },
30+
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4 },
4031
// CHECK-EMPTY:
4132
// CHECK-NEXT: //--- _ZTS12third_kernelILi1Ei5pointIZ4mainE1XEE
4233
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 4, 0 },
43-
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 2016, 4 },
44-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 4 },
45-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 5 },
46-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 6 },
34+
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 6112, 4 },
4735
// CHECK-EMPTY:
4836
// CHECK-NEXT: };
4937
//

clang/test/CodeGenSYCL/struct_kernel_param.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33

44
// CHECK: const kernel_param_desc_t kernel_signatures[] = {
55
// CHECK-NEXT: //--- _ZTSZZ5test0vENK3$_0clERN2cl4sycl7handlerEE8MyKernel
6-
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 2014, 0 },
7-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 0 },
8-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 1 },
9-
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 1, 2 },
6+
// CHECK-NEXT: { kernel_param_kind_t::kind_accessor, 4062, 0 },
107
// CHECK-NEXT: { kernel_param_kind_t::kind_std_layout, 24, 4 },
118
// CHECK-EMPTY:
129
// CHECK-NEXT:};

clang/test/SemaSYCL/Inputs/sycl.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ class accessor {
6464
public:
6565
void use(void) const {}
6666
void use(void*) const {}
67+
_ImplT<dimensions> impl;
68+
private:
6769
void __init(__global dataT *Ptr, range<dimensions> AccessRange,
6870
range<dimensions> MemRange, id<dimensions> Offset) {}
69-
70-
_ImplT<dimensions> __impl;
7171
};
7272

7373
} // namespace sycl

0 commit comments

Comments
 (0)