@@ -57,6 +57,7 @@ enum KernelInvocationKind {
57
57
};
58
58
59
59
const static std::string InitMethodName = " __init" ;
60
+ const static std::string InitESIMDMethodName = " __init_esimd" ;
60
61
const static std::string FinalizeMethodName = " __finalize" ;
61
62
constexpr unsigned MaxKernelArgsSize = 2048 ;
62
63
@@ -1714,7 +1715,11 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler {
1714
1715
bool isAccessorType = false ) {
1715
1716
const auto *RecordDecl = FieldTy->getAsCXXRecordDecl ();
1716
1717
assert (RecordDecl && " The accessor/sampler must be a RecordDecl" );
1717
- CXXMethodDecl *InitMethod = getMethodByName (RecordDecl, InitMethodName);
1718
+ const std::string &MethodName =
1719
+ KernelDecl->hasAttr <SYCLSimdAttr>() && isAccessorType
1720
+ ? InitESIMDMethodName
1721
+ : InitMethodName;
1722
+ CXXMethodDecl *InitMethod = getMethodByName (RecordDecl, MethodName);
1718
1723
assert (InitMethod && " The accessor/sampler must have the __init method" );
1719
1724
1720
1725
// Don't do -1 here because we count on this to be the first parameter added
@@ -1723,9 +1728,14 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler {
1723
1728
for (const ParmVarDecl *Param : InitMethod->parameters ()) {
1724
1729
QualType ParamTy = Param->getType ();
1725
1730
addParam (FD, ParamTy.getCanonicalType ());
1726
- if (ParamTy.getTypePtr ()->isPointerType () && isAccessorType)
1731
+ if (ParamTy.getTypePtr ()->isPointerType () && isAccessorType) {
1727
1732
handleAccessorPropertyList (Params.back (), RecordDecl,
1728
1733
FD->getLocation ());
1734
+ if (KernelDecl->hasAttr <SYCLSimdAttr>())
1735
+ // In ESIMD kernels accessor's pointer argument needs to be marked
1736
+ Params.back ()->addAttr (
1737
+ SYCLSimdAccessorPtrAttr::CreateImplicit (SemaRef.getASTContext ()));
1738
+ }
1729
1739
}
1730
1740
LastParamIndex = ParamIndex;
1731
1741
return true ;
@@ -1819,7 +1829,10 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler {
1819
1829
QualType FieldTy) final {
1820
1830
const auto *RecordDecl = FieldTy->getAsCXXRecordDecl ();
1821
1831
assert (RecordDecl && " The accessor/sampler must be a RecordDecl" );
1822
- CXXMethodDecl *InitMethod = getMethodByName (RecordDecl, InitMethodName);
1832
+ const std::string MethodName = KernelDecl->hasAttr <SYCLSimdAttr>()
1833
+ ? InitESIMDMethodName
1834
+ : InitMethodName;
1835
+ CXXMethodDecl *InitMethod = getMethodByName (RecordDecl, MethodName);
1823
1836
assert (InitMethod && " The accessor/sampler must have the __init method" );
1824
1837
1825
1838
// Don't do -1 here because we count on this to be the first parameter added
@@ -1951,6 +1964,7 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler {
1951
1964
class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler {
1952
1965
SourceLocation KernelLoc;
1953
1966
unsigned SizeOfParams = 0 ;
1967
+ bool IsSIMD = false ;
1954
1968
1955
1969
void addParam (QualType ArgTy) {
1956
1970
SizeOfParams +=
@@ -1960,7 +1974,9 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler {
1960
1974
bool handleSpecialType (QualType FieldTy) {
1961
1975
const CXXRecordDecl *RecordDecl = FieldTy->getAsCXXRecordDecl ();
1962
1976
assert (RecordDecl && " The accessor/sampler must be a RecordDecl" );
1963
- CXXMethodDecl *InitMethod = getMethodByName (RecordDecl, InitMethodName);
1977
+ const std::string &MethodName =
1978
+ IsSIMD ? InitESIMDMethodName : InitMethodName;
1979
+ CXXMethodDecl *InitMethod = getMethodByName (RecordDecl, MethodName);
1964
1980
assert (InitMethod && " The accessor/sampler must have the __init method" );
1965
1981
for (const ParmVarDecl *Param : InitMethod->parameters ())
1966
1982
addParam (Param->getType ());
@@ -1969,8 +1985,8 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler {
1969
1985
1970
1986
public:
1971
1987
static constexpr const bool VisitInsideSimpleContainers = false ;
1972
- SyclKernelArgsSizeChecker (Sema &S, SourceLocation Loc)
1973
- : SyclKernelFieldHandler(S), KernelLoc(Loc) {}
1988
+ SyclKernelArgsSizeChecker (Sema &S, SourceLocation Loc, bool IsSIMD )
1989
+ : SyclKernelFieldHandler(S), KernelLoc(Loc), IsSIMD(IsSIMD) {}
1974
1990
1975
1991
~SyclKernelArgsSizeChecker () {
1976
1992
if (SizeOfParams > MaxKernelArgsSize)
@@ -2044,6 +2060,19 @@ class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler {
2044
2060
using SyclKernelFieldHandler::handleSyclHalfType;
2045
2061
};
2046
2062
2063
+ static const CXXMethodDecl *getOperatorParens (const CXXRecordDecl *Rec) {
2064
+ for (const auto *MD : Rec->methods ()) {
2065
+ if (MD->getOverloadedOperator () == OO_Call)
2066
+ return MD;
2067
+ }
2068
+ return nullptr ;
2069
+ }
2070
+
2071
+ static bool isESIMDKernelType (const CXXRecordDecl *KernelObjType) {
2072
+ const CXXMethodDecl *OpParens = getOperatorParens (KernelObjType);
2073
+ return (OpParens != nullptr ) && OpParens->hasAttr <SYCLSimdAttr>();
2074
+ }
2075
+
2047
2076
class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2048
2077
SyclKernelDeclCreator &DeclCreator;
2049
2078
llvm::SmallVector<Stmt *, 16 > BodyStmts;
@@ -2359,6 +2388,11 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2359
2388
return VD;
2360
2389
}
2361
2390
2391
+ const std::string &getInitMethodName () const {
2392
+ bool IsSIMDKernel = isESIMDKernelType (KernelObj);
2393
+ return IsSIMDKernel ? InitESIMDMethodName : InitMethodName;
2394
+ }
2395
+
2362
2396
// Default inits the type, then calls the init-method in the body.
2363
2397
bool handleSpecialType (FieldDecl *FD, QualType Ty) {
2364
2398
addFieldInit (FD, Ty, None,
@@ -2367,7 +2401,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2367
2401
addFieldMemberExpr (FD, Ty);
2368
2402
2369
2403
const auto *RecordDecl = Ty->getAsCXXRecordDecl ();
2370
- createSpecialMethodCall (RecordDecl, InitMethodName , BodyStmts);
2404
+ createSpecialMethodCall (RecordDecl, getInitMethodName () , BodyStmts);
2371
2405
2372
2406
removeFieldMemberExpr (FD, Ty);
2373
2407
@@ -2377,7 +2411,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2377
2411
bool handleSpecialType (const CXXBaseSpecifier &BS, QualType Ty) {
2378
2412
const auto *RecordDecl = Ty->getAsCXXRecordDecl ();
2379
2413
addBaseInit (BS, Ty, InitializationKind::CreateDefault (KernelCallerSrcLoc));
2380
- createSpecialMethodCall (RecordDecl, InitMethodName , BodyStmts);
2414
+ createSpecialMethodCall (RecordDecl, getInitMethodName () , BodyStmts);
2381
2415
return true ;
2382
2416
}
2383
2417
@@ -2501,7 +2535,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
2501
2535
// calls, so add them here instead.
2502
2536
const auto *StreamDecl = Ty->getAsCXXRecordDecl ();
2503
2537
2504
- createSpecialMethodCall (StreamDecl, InitMethodName , BodyStmts);
2538
+ createSpecialMethodCall (StreamDecl, getInitMethodName () , BodyStmts);
2505
2539
createSpecialMethodCall (StreamDecl, FinalizeMethodName, FinalizeStmts);
2506
2540
2507
2541
removeFieldMemberExpr (FD, Ty);
@@ -2659,7 +2693,9 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
2659
2693
const CXXRecordDecl *KernelObj, QualType NameType,
2660
2694
StringRef Name, StringRef StableName)
2661
2695
: SyclKernelFieldHandler(S), Header(H) {
2662
- Header.startKernel (Name, NameType, StableName, KernelObj->getLocation ());
2696
+ bool IsSIMDKernel = isESIMDKernelType (KernelObj);
2697
+ Header.startKernel (Name, NameType, StableName, KernelObj->getLocation (),
2698
+ IsSIMDKernel);
2663
2699
}
2664
2700
2665
2701
bool handleSyclAccessorType (const CXXRecordDecl *RD,
@@ -3026,7 +3062,10 @@ void Sema::CheckSYCLKernelCall(FunctionDecl *KernelFunc, SourceRange CallLoc,
3026
3062
SyclKernelDecompMarker DecompMarker (*this );
3027
3063
SyclKernelFieldChecker FieldChecker (*this );
3028
3064
SyclKernelUnionChecker UnionChecker (*this );
3029
- SyclKernelArgsSizeChecker ArgsSizeChecker (*this , Args[0 ]->getExprLoc ());
3065
+
3066
+ bool IsSIMDKernel = isESIMDKernelType (KernelObj);
3067
+ SyclKernelArgsSizeChecker ArgsSizeChecker (*this , Args[0 ]->getExprLoc (),
3068
+ IsSIMDKernel);
3030
3069
3031
3070
KernelObjVisitor Visitor{*this };
3032
3071
SYCLKernelNameTypeVisitor KernelNameTypeVisitor (*this , Args[0 ]->getExprLoc (),
@@ -3087,6 +3126,8 @@ void Sema::ConstructOpenCLKernel(FunctionDecl *KernelCallerFunc,
3087
3126
if (KernelObj->isInvalidDecl ())
3088
3127
return ;
3089
3128
3129
+ bool IsSIMDKernel = isESIMDKernelType (KernelObj);
3130
+
3090
3131
// Calculate both names, since Integration headers need both.
3091
3132
std::string CalculatedName, StableName;
3092
3133
std::tie (CalculatedName, StableName) =
@@ -3095,7 +3136,7 @@ void Sema::ConstructOpenCLKernel(FunctionDecl *KernelCallerFunc,
3095
3136
: CalculatedName);
3096
3137
SyclKernelDeclCreator kernel_decl (*this , KernelName, KernelObj->getLocation (),
3097
3138
KernelCallerFunc->isInlined (),
3098
- KernelCallerFunc-> hasAttr <SYCLSimdAttr>() );
3139
+ IsSIMDKernel );
3099
3140
SyclKernelBodyCreator kernel_body (*this , kernel_decl, KernelObj,
3100
3141
KernelCallerFunc);
3101
3142
SyclKernelIntHeaderCreator int_header (
@@ -3810,6 +3851,9 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) {
3810
3851
O << " getParamDesc(unsigned i) {\n " ;
3811
3852
O << " return kernel_signatures[i+" << CurStart << " ];\n " ;
3812
3853
O << " }\n " ;
3854
+ O << " __SYCL_DLL_LOCAL\n " ;
3855
+ O << " static constexpr bool isESIMD() { return " << K.IsESIMDKernel
3856
+ << " ; }\n " ;
3813
3857
O << " };\n " ;
3814
3858
CurStart += N;
3815
3859
}
@@ -3839,12 +3883,14 @@ bool SYCLIntegrationHeader::emit(const StringRef &IntHeaderName) {
3839
3883
void SYCLIntegrationHeader::startKernel (StringRef KernelName,
3840
3884
QualType KernelNameType,
3841
3885
StringRef KernelStableName,
3842
- SourceLocation KernelLocation) {
3886
+ SourceLocation KernelLocation,
3887
+ bool IsESIMDKernel) {
3843
3888
KernelDescs.resize (KernelDescs.size () + 1 );
3844
3889
KernelDescs.back ().Name = std::string (KernelName);
3845
3890
KernelDescs.back ().NameType = KernelNameType;
3846
3891
KernelDescs.back ().StableName = std::string (KernelStableName);
3847
3892
KernelDescs.back ().KernelLocation = KernelLocation;
3893
+ KernelDescs.back ().IsESIMDKernel = IsESIMDKernel;
3848
3894
}
3849
3895
3850
3896
void SYCLIntegrationHeader::addParamDesc (kernel_param_kind_t Kind, int Info,
0 commit comments