Skip to content

Commit c1efe61

Browse files
committed
[SYCL] Reimplement warning that checks number of arguments
GPU has limitation on size of kernel aguments, not number.
1 parent 66484f2 commit c1efe61

File tree

3 files changed

+27
-21
lines changed

3 files changed

+27
-21
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10999,8 +10999,8 @@ def err_sycl_restrict : Error<
1099910999
"|use a const static or global variable that is neither zero-initialized "
1100011000
"nor constant-initialized"
1100111001
"}0">;
11002-
def warn_sycl_kernel_too_many_args : Warning<
11003-
"kernel argument count (%0) exceeds supported maximum of %1 on GPU">,
11002+
def warn_sycl_kernel_too_big_args : Warning<
11003+
"kernel arguments size (%0 bytes) exceeds supported maximum of %1 on GPU">,
1100411004
InGroup<SyclStrict>;
1100511005
def note_sycl_kernel_args_count : Note<"array elements and fields of a "
1100611006
"class/struct may be counted separately">;

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ enum KernelInvocationKind {
5656

5757
const static std::string InitMethodName = "__init";
5858
const static std::string FinalizeMethodName = "__finalize";
59-
constexpr unsigned GPUMaxKernelArgsNum = 2000;
59+
constexpr unsigned GPUMaxKernelArgsSize = 2048;
6060

6161
namespace {
6262

@@ -1656,29 +1656,35 @@ class SyclKernelDeclCreator : public SyclKernelFieldHandler {
16561656
using SyclKernelFieldHandler::leaveStruct;
16571657
};
16581658

1659-
class SyclKernelNumArgsChecker : public SyclKernelFieldHandler {
1659+
class SyclKernelArgsSizeChecker : public SyclKernelFieldHandler {
16601660
SourceLocation KernelLoc;
1661-
unsigned NumOfParams = 0;
1661+
unsigned SizeOfParams = 0;
1662+
1663+
void addParam(QualType ArgTy) {
1664+
SizeOfParams +=
1665+
SemaRef.getASTContext().getTypeSizeInChars(ArgTy).getQuantity();
1666+
}
16621667

16631668
bool handleSpecialType(QualType FieldTy) {
16641669
const CXXRecordDecl *RecordDecl = FieldTy->getAsCXXRecordDecl();
16651670
assert(RecordDecl && "The accessor/sampler must be a RecordDecl");
16661671
CXXMethodDecl *InitMethod = getMethodByName(RecordDecl, InitMethodName);
16671672
assert(InitMethod && "The accessor/sampler must have the __init method");
1668-
NumOfParams += InitMethod->getNumParams();
1673+
for (const ParmVarDecl *Param : InitMethod->parameters())
1674+
addParam(Param->getType());
16691675
return true;
16701676
}
16711677

16721678
public:
1673-
SyclKernelNumArgsChecker(Sema &S, SourceLocation Loc)
1679+
SyclKernelArgsSizeChecker(Sema &S, SourceLocation Loc)
16741680
: SyclKernelFieldHandler(S), KernelLoc(Loc) {}
16751681

1676-
~SyclKernelNumArgsChecker() {
1682+
~SyclKernelArgsSizeChecker() {
16771683
if (SemaRef.Context.getTargetInfo().getTriple().getSubArch() ==
16781684
llvm::Triple::SPIRSubArch_gen) {
1679-
if (NumOfParams > GPUMaxKernelArgsNum) {
1680-
SemaRef.Diag(KernelLoc, diag::warn_sycl_kernel_too_many_args)
1681-
<< NumOfParams << GPUMaxKernelArgsNum;
1685+
if (SizeOfParams > GPUMaxKernelArgsSize) {
1686+
SemaRef.Diag(KernelLoc, diag::warn_sycl_kernel_too_big_args)
1687+
<< SizeOfParams << GPUMaxKernelArgsSize;
16821688
SemaRef.Diag(KernelLoc, diag::note_sycl_kernel_args_count);
16831689
}
16841690
}
@@ -1703,12 +1709,12 @@ class SyclKernelNumArgsChecker : public SyclKernelFieldHandler {
17031709
}
17041710

17051711
bool handlePointerType(FieldDecl *FD, QualType FieldTy) final {
1706-
NumOfParams++;
1712+
addParam(FieldTy);
17071713
return true;
17081714
}
17091715

17101716
bool handleScalarType(FieldDecl *FD, QualType FieldTy) final {
1711-
NumOfParams++;
1717+
addParam(FieldTy);
17121718
return true;
17131719
}
17141720

@@ -1717,17 +1723,17 @@ class SyclKernelNumArgsChecker : public SyclKernelFieldHandler {
17171723
}
17181724

17191725
bool handleSyclHalfType(FieldDecl *FD, QualType FieldTy) final {
1720-
NumOfParams++;
1726+
addParam(FieldTy);
17211727
return true;
17221728
}
17231729

17241730
bool handleSyclStreamType(FieldDecl *FD, QualType FieldTy) final {
1725-
NumOfParams++;
1731+
addParam(FieldTy);
17261732
return true;
17271733
}
17281734
bool handleSyclStreamType(const CXXRecordDecl *, const CXXBaseSpecifier &,
17291735
QualType FieldTy) final {
1730-
NumOfParams++;
1736+
addParam(FieldTy);
17311737
return true;
17321738
}
17331739
using SyclKernelFieldHandler::handleSyclHalfType;
@@ -2468,7 +2474,7 @@ void Sema::CheckSYCLKernelCall(FunctionDecl *KernelFunc, SourceRange CallLoc,
24682474

24692475
SyclKernelFieldChecker FieldChecker(*this);
24702476
SyclKernelUnionChecker UnionChecker(*this);
2471-
SyclKernelNumArgsChecker NumArgsChecker(*this, Args[0]->getExprLoc());
2477+
SyclKernelArgsSizeChecker ArgsSizeChecker(*this, Args[0]->getExprLoc());
24722478
// check that calling kernel conforms to spec
24732479
QualType KernelParamTy = KernelFunc->getParamDecl(0)->getType();
24742480
if (KernelParamTy->isReferenceType()) {
@@ -2488,9 +2494,9 @@ void Sema::CheckSYCLKernelCall(FunctionDecl *KernelFunc, SourceRange CallLoc,
24882494
KernelObjVisitor Visitor{*this};
24892495
DiagnosingSYCLKernel = true;
24902496
Visitor.VisitRecordBases(KernelObj, FieldChecker, UnionChecker,
2491-
NumArgsChecker);
2497+
ArgsSizeChecker);
24922498
Visitor.VisitRecordFields(KernelObj, FieldChecker, UnionChecker,
2493-
NumArgsChecker);
2499+
ArgsSizeChecker);
24942500
DiagnosingSYCLKernel = false;
24952501
if (!FieldChecker.isValid() || !UnionChecker.isValid())
24962502
KernelFunc->setInvalidDecl();

clang/test/SemaSYCL/num-args-overflow.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ __attribute__((sycl_kernel)) void kernel(F KernelFunc) {
1313
template <typename Name, typename F>
1414
void parallel_for(F KernelFunc) {
1515
#ifdef GPU
16-
// expected-warning@+8 {{kernel argument count (2001) exceeds supported maximum of 2000 on GPU}}
16+
// expected-warning@+8 {{kernel arguments size (7994 bytes) exceeds supported maximum of 2048 on GPU}}
1717
// expected-note@+7 {{array elements and fields of a class/struct may be counted separately}}
1818
#elif ERROR
19-
// expected-error@+5 {{kernel argument count (2001) exceeds supported maximum of 2000 on GPU}}
19+
// expected-error@+5 {{kernel arguments size (7994 bytes) exceeds supported maximum of 2048 on GPU}}
2020
// expected-note@+4 {{array elements and fields of a class/struct may be counted separately}}
2121
#else
2222
// expected-no-diagnostics

0 commit comments

Comments
 (0)