diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 165b22dab5a0f..19e47daadc08f 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -13982,7 +13982,7 @@ class Sema final { KernelConstStaticVariable }; - bool isKnownGoodSYCLDecl(const Decl *D); + bool isDeclAllowedInSYCLDeviceCode(const Decl *D); void checkSYCLDeviceVarDecl(VarDecl *Var); void copySYCLKernelAttrs(const CXXRecordDecl *KernelObj); void ConstructOpenCLKernel(FunctionDecl *KernelCallerFunc, MangleContext &MC); diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index b1a012cc12789..e0a952593a22b 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -5967,8 +5967,8 @@ void Sema::checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto, CheckSYCLKernelCall(FD, Range, Args); // Diagnose variadic calls in SYCL. - if (FD && FD ->isVariadic() && getLangOpts().SYCLIsDevice && - !isUnevaluatedContext() && !isKnownGoodSYCLDecl(FD)) + if (FD && FD->isVariadic() && getLangOpts().SYCLIsDevice && + !isUnevaluatedContext() && !isDeclAllowedInSYCLDeviceCode(FD)) SYCLDiagIfDeviceCode(Loc, diag::err_sycl_restrict) << Sema::KernelCallVariadicFunction; } diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index a763109d39aad..70b2e08c833a0 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -364,9 +364,15 @@ static bool IsSyclMathFunc(unsigned BuiltinID) { return true; } -bool Sema::isKnownGoodSYCLDecl(const Decl *D) { +bool Sema::isDeclAllowedInSYCLDeviceCode(const Decl *D) { if (const FunctionDecl *FD = dyn_cast(D)) { const IdentifierInfo *II = FD->getIdentifier(); + + // Allow __builtin_assume_aligned to be called from within device code. + if (FD->getBuiltinID() && + FD->getBuiltinID() == Builtin::BI__builtin_assume_aligned) + return true; + // Allow to use `::printf` only for CUDA. if (Context.getTargetInfo().getTriple().isNVPTX()) { if (FD->getBuiltinID() == Builtin::BIprintf) diff --git a/clang/test/SemaSYCL/remove-restriction-builtin-assume-aligned.cpp b/clang/test/SemaSYCL/remove-restriction-builtin-assume-aligned.cpp new file mode 100644 index 0000000000000..710ddc916a741 --- /dev/null +++ b/clang/test/SemaSYCL/remove-restriction-builtin-assume-aligned.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -fsycl-is-device -internal-isystem %S/Inputs -sycl-std=2020 -verify -fsyntax-only %s +// This test checks if __builtin_assume_aligned does not throw an error when +// called from within device code. + +#include "sycl.hpp" + +using namespace sycl; +queue q; + +int main() { + int *Ptr[2]; + // expected-no-diagnostics + q.submit([&](handler &h) { + h.single_task([=]() { + int *APtr = (int *)__builtin_assume_aligned(Ptr, 32); + *APtr = 42; + }); + }); + return 0; +} +