Skip to content

Commit 0476352

Browse files
asudarsaromanovvlad
authored andcommitted
[SYCL] Add user friendly diagnostic for unsupported built-in functions usage in kernel
According to SYCL specification, some of the built-in math functions cannot be called from a kernel (e.g. fabsf) Signed-off-by: Arvind Sudarsanam <arvind.sudarsanam@intel.com>
1 parent 6a96b3c commit 0476352

File tree

2 files changed

+127
-1
lines changed

2 files changed

+127
-1
lines changed

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 110 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,106 @@ static CXXRecordDecl *getKernelObjectType(FunctionDecl *Caller) {
8383
return (*Caller->param_begin())->getType()->getAsCXXRecordDecl();
8484
}
8585

86+
// This information is from Section 4.13 of the SYCL spec
87+
// https://www.khronos.org/registry/SYCL/specs/sycl-1.2.1.pdf
88+
// This function returns false if the math lib function
89+
// corresponding to the input builtin is not supported
90+
// for SYCL
91+
static bool IsSyclMathFunc(unsigned BuiltinID) {
92+
switch (BuiltinID) {
93+
case Builtin::BIlround:
94+
case Builtin::BI__builtin_lround:
95+
case Builtin::BIceill:
96+
case Builtin::BI__builtin_ceill:
97+
case Builtin::BIcopysignl:
98+
case Builtin::BI__builtin_copysignl:
99+
case Builtin::BIcosl:
100+
case Builtin::BI__builtin_cosl:
101+
case Builtin::BIexpl:
102+
case Builtin::BI__builtin_expl:
103+
case Builtin::BIexp2l:
104+
case Builtin::BI__builtin_exp2l:
105+
case Builtin::BIfabsl:
106+
case Builtin::BI__builtin_fabsl:
107+
case Builtin::BIfloorl:
108+
case Builtin::BI__builtin_floorl:
109+
case Builtin::BIfmal:
110+
case Builtin::BI__builtin_fmal:
111+
case Builtin::BIfmaxl:
112+
case Builtin::BI__builtin_fmaxl:
113+
case Builtin::BIfminl:
114+
case Builtin::BI__builtin_fminl:
115+
case Builtin::BIfmodl:
116+
case Builtin::BI__builtin_fmodl:
117+
case Builtin::BIlogl:
118+
case Builtin::BI__builtin_logl:
119+
case Builtin::BIlog10l:
120+
case Builtin::BI__builtin_log10l:
121+
case Builtin::BIlog2l:
122+
case Builtin::BI__builtin_log2l:
123+
case Builtin::BIpowl:
124+
case Builtin::BI__builtin_powl:
125+
case Builtin::BIrintl:
126+
case Builtin::BI__builtin_rintl:
127+
case Builtin::BIroundl:
128+
case Builtin::BI__builtin_roundl:
129+
case Builtin::BIsinl:
130+
case Builtin::BI__builtin_sinl:
131+
case Builtin::BIsqrtl:
132+
case Builtin::BI__builtin_sqrtl:
133+
case Builtin::BItruncl:
134+
case Builtin::BI__builtin_truncl:
135+
case Builtin::BIlroundl:
136+
case Builtin::BI__builtin_lroundl:
137+
case Builtin::BIceilf:
138+
case Builtin::BI__builtin_ceilf:
139+
case Builtin::BIcopysignf:
140+
case Builtin::BI__builtin_copysignf:
141+
case Builtin::BIcosf:
142+
case Builtin::BI__builtin_cosf:
143+
case Builtin::BIexpf:
144+
case Builtin::BI__builtin_expf:
145+
case Builtin::BIexp2f:
146+
case Builtin::BI__builtin_exp2f:
147+
case Builtin::BIfabsf:
148+
case Builtin::BI__builtin_fabsf:
149+
case Builtin::BIfloorf:
150+
case Builtin::BI__builtin_floorf:
151+
case Builtin::BIfmaf:
152+
case Builtin::BI__builtin_fmaf:
153+
case Builtin::BIfmaxf:
154+
case Builtin::BI__builtin_fmaxf:
155+
case Builtin::BIfminf:
156+
case Builtin::BI__builtin_fminf:
157+
case Builtin::BIfmodf:
158+
case Builtin::BI__builtin_fmodf:
159+
case Builtin::BIlogf:
160+
case Builtin::BI__builtin_logf:
161+
case Builtin::BIlog10f:
162+
case Builtin::BI__builtin_log10f:
163+
case Builtin::BIlog2f:
164+
case Builtin::BI__builtin_log2f:
165+
case Builtin::BIpowf:
166+
case Builtin::BI__builtin_powf:
167+
case Builtin::BIrintf:
168+
case Builtin::BI__builtin_rintf:
169+
case Builtin::BIroundf:
170+
case Builtin::BI__builtin_roundf:
171+
case Builtin::BIsinf:
172+
case Builtin::BI__builtin_sinf:
173+
case Builtin::BIsqrtf:
174+
case Builtin::BI__builtin_sqrtf:
175+
case Builtin::BItruncf:
176+
case Builtin::BI__builtin_truncf:
177+
case Builtin::BIlroundf:
178+
case Builtin::BI__builtin_lroundf:
179+
return false;
180+
default:
181+
break;
182+
}
183+
return true;
184+
}
185+
86186
class MarkDeviceFunction : public RecursiveASTVisitor<MarkDeviceFunction> {
87187
public:
88188
MarkDeviceFunction(Sema &S)
@@ -131,7 +231,16 @@ class MarkDeviceFunction : public RecursiveASTVisitor<MarkDeviceFunction> {
131231
SemaRef.Diag(FD->getLocation(), diag::note_callee_decl) << FD;
132232
}
133233
}
134-
} else if (!SemaRef.getLangOpts().SYCLAllowFuncPtr &&
234+
// Specifically check if the math library function corresponding to this
235+
// builtin is supported for SYCL
236+
unsigned BuiltinID = (Callee ? Callee->getBuiltinID() : 0);
237+
if (BuiltinID && !IsSyclMathFunc(BuiltinID)) {
238+
StringRef Name = SemaRef.Context.BuiltinInfo.getName(BuiltinID);
239+
SemaRef.Diag(e->getExprLoc(),
240+
diag::err_builtin_target_unsupported)
241+
<< Name << "SYCL device";
242+
}
243+
} else if ((!SemaRef.getLangOpts().SYCLAllowFuncPtr) &&
135244
!e->isTypeDependent())
136245
SemaRef.Diag(e->getExprLoc(), diag::err_sycl_restrict)
137246
<< Sema::KernelCallFunctionPointer;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// RUN: %clang_cc1 -fsycl-is-device -fsyntax-only -verify %s
2+
3+
template <typename name, typename Func>
4+
__attribute__((sycl_kernel)) void kernel(Func kernelFunc) {
5+
kernelFunc();
6+
}
7+
8+
int main() {
9+
kernel<class kernel_function>([=]() {
10+
int acc[1] = {5};
11+
acc[0] *= 2;
12+
acc[0] += (int)__builtin_fabsf(-1.0f); // expected-error{{builtin is not supported on this target}}
13+
acc[0] += (int)__builtin_cosf(-1.0f); // expected-error{{builtin is not supported on this target}}
14+
acc[0] += (int)__builtin_powf(-1.0f, 10.0f); // expected-error{{builtin is not supported on this target}}
15+
});
16+
return 0;
17+
}

0 commit comments

Comments
 (0)