[clang] f81d529 - [Clang] Fix compilation errors for unsupported __bf16 intrinsics
Elizabeth Andrews via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 25 12:49:12 PST 2023
Author: Elizabeth Andrews
Date: 2023-01-25T12:43:36-08:00
New Revision: f81d529f8955dbdf64d429c27dee994257b4ee99
URL: https://github.com/llvm/llvm-project/commit/f81d529f8955dbdf64d429c27dee994257b4ee99
DIFF: https://github.com/llvm/llvm-project/commit/f81d529f8955dbdf64d429c27dee994257b4ee99.diff
LOG: [Clang] Fix compilation errors for unsupported __bf16 intrinsics
This patch uses existing deferred diagnostics framework to emit error
for unsupported type __bf16 in device code. Error is not emitted in
host code.
Differential Revision: https://reviews.llvm.org/D141375
Added:
clang/test/SemaSYCL/bf16.cpp
Modified:
clang/lib/AST/ASTContext.cpp
clang/lib/AST/ItaniumMangle.cpp
clang/lib/Sema/Sema.cpp
clang/lib/Sema/SemaType.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 2884fe6604228..3ba8b90898b30 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -2140,6 +2140,11 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
if (Target->hasBFloat16Type()) {
Width = Target->getBFloat16Width();
Align = Target->getBFloat16Align();
+ } else if ((getLangOpts().SYCLIsDevice ||
+ (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice)) &&
+ AuxTarget->hasBFloat16Type()) {
+ Width = AuxTarget->getBFloat16Width();
+ Align = AuxTarget->getBFloat16Align();
}
break;
case BuiltinType::Float16:
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index b23bc5f8d8816..88549c7344506 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -3051,7 +3051,11 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
break;
}
case BuiltinType::BFloat16: {
- const TargetInfo *TI = &getASTContext().getTargetInfo();
+ const TargetInfo *TI = ((getASTContext().getLangOpts().OpenMP &&
+ getASTContext().getLangOpts().OpenMPIsDevice) ||
+ getASTContext().getLangOpts().SYCLIsDevice)
+ ? getASTContext().getAuxTargetInfo()
+ : &getASTContext().getTargetInfo();
Out << TI->getBFloat16Mangling();
break;
}
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 0f03054224545..f983c477ac18e 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -1975,6 +1975,8 @@ void Sema::checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D) {
(Ty->isIbm128Type() && !Context.getTargetInfo().hasIbm128Type()) ||
(Ty->isIntegerType() && Context.getTypeSize(Ty) == 128 &&
!Context.getTargetInfo().hasInt128Type()) ||
+ (Ty->isBFloat16Type() && !Context.getTargetInfo().hasBFloat16Type() &&
+ !LangOpts.CUDAIsDevice) ||
LongDoubleMismatched) {
PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);
if (D)
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 89d819a77dcbb..505b3b922d33d 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -1518,9 +1518,10 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
break;
case DeclSpec::TST_half: Result = Context.HalfTy; break;
case DeclSpec::TST_BFloat16:
- if (!S.Context.getTargetInfo().hasBFloat16Type())
- S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported)
- << "__bf16";
+ if (!S.Context.getTargetInfo().hasBFloat16Type() &&
+ !(S.getLangOpts().OpenMP && S.getLangOpts().OpenMPIsDevice) &&
+ !S.getLangOpts().SYCLIsDevice)
+ S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << "__bf16";
Result = Context.BFloat16Ty;
break;
case DeclSpec::TST_float: Result = Context.FloatTy; break;
diff --git a/clang/test/SemaSYCL/bf16.cpp b/clang/test/SemaSYCL/bf16.cpp
new file mode 100644
index 0000000000000..06ae263fbcfe5
--- /dev/null
+++ b/clang/test/SemaSYCL/bf16.cpp
@@ -0,0 +1,22 @@
+// RUN: %clang_cc1 -triple spir64 -aux-triple x86_64-unknown-linux-gnu -fsycl-is-device -verify -fsyntax-only %s
+
+template <typename Name, typename Func>
+__attribute__((sycl_kernel)) void kernel(Func kernelFunc) {
+ kernelFunc(); // expected-note {{called by 'kernel}}
+}
+
+void host_ok(void) {
+ __bf16 A;
+}
+
+int main()
+{ host_ok();
+ __bf16 var; // expected-note {{'var' defined here}}
+ kernel<class variables>([=]() {
+ (void)var; // expected-error {{'var' requires 16 bit size '__bf16' type support, but target 'spir64' does not support it}}
+ int B = sizeof(__bf16);
+ });
+
+ return 0;
+}
+
More information about the cfe-commits
mailing list