-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[Clang] Support __bf16 type for SPIR/SPIR-V (#169012) #170230
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: release/21.x
Are you sure you want to change the base?
[Clang] Support __bf16 type for SPIR/SPIR-V (#169012) #170230
Conversation
SPIR/SPIR-V are generic targets. Assume they support __bf16. (cherry picked from commit c4254cd)
|
This is backport of c4254cd to 21.x branch |
|
@llvm/pr-subscribers-clang Author: Wenju He (wenju-he) ChangesSPIR/SPIR-V are generic targets. Assume they support __bf16. (cherry picked from commit c4254cd) Full diff: https://github.com/llvm/llvm-project/pull/170230.diff 3 Files Affected:
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 1abf798d93129..5452909809c5c 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -108,6 +108,10 @@ class LLVM_LIBRARY_VISIBILITY BaseSPIRTargetInfo : public TargetInfo {
UseAddrSpaceMapMangling = true;
HasLegalHalfType = true;
HasFloat16 = true;
+ HasBFloat16 = true;
+ HasFullBFloat16 = true;
+ BFloat16Width = BFloat16Align = 16;
+ BFloat16Format = &llvm::APFloat::BFloat();
// Define available target features
// These must be defined in sorted order!
NoAsmVariants = true;
@@ -428,8 +432,6 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64AMDGCNTargetInfo final
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
}
- bool hasBFloat16Type() const override { return true; }
-
ArrayRef<const char *> getGCCRegNames() const override;
bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
diff --git a/clang/test/CodeGenOpenCL/__bf16.cl b/clang/test/CodeGenOpenCL/__bf16.cl
new file mode 100644
index 0000000000000..a40a795bc1600
--- /dev/null
+++ b/clang/test/CodeGenOpenCL/__bf16.cl
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 %s -cl-std=cl3.0 -emit-llvm -o - -triple spir-unknown-unknown | FileCheck %s
+// RUN: %clang_cc1 %s -cl-std=cl3.0 -emit-llvm -o - -triple spirv64-unknown-unknown | FileCheck %s
+
+kernel void test(global __bf16 *a, global __bf16 *b){
+// CHECK-LABEL: spir_kernel void @test(
+// CHECK: fadd bfloat
+// CHECK: fsub bfloat
+// CHECK: fmul bfloat
+// CHECK: fdiv bfloat
+
+ *b += *a;
+ *b -= *a;
+ *b *= *a;
+ *b /= *a;
+}
+
+typedef __bf16 __bf16v4 __attribute((ext_vector_type(4)));
+
+kernel void test_v4(global __bf16v4 *a, global __bf16v4 *b){
+// CHECK-LABEL: spir_kernel void @test_v4(
+// CHECK: fadd <4 x bfloat>
+// CHECK: fsub <4 x bfloat>
+// CHECK: fmul <4 x bfloat>
+// CHECK: fdiv <4 x bfloat>
+
+ *b += *a;
+ *b -= *a;
+ *b *= *a;
+ *b /= *a;
+}
+
diff --git a/clang/test/SemaSYCL/bf16.cpp b/clang/test/SemaSYCL/bf16.cpp
index d1b4776f34044..2ffb277b4eea1 100644
--- a/clang/test/SemaSYCL/bf16.cpp
+++ b/clang/test/SemaSYCL/bf16.cpp
@@ -1,8 +1,9 @@
// RUN: %clang_cc1 -triple spir64 -aux-triple x86_64-unknown-linux-gnu -fsycl-is-device -verify -fsyntax-only %s
+// expected-no-diagnostics
template <typename Name, typename Func>
__attribute__((sycl_kernel)) void kernel(const Func &kernelFunc) {
- kernelFunc(); // expected-note {{called by 'kernel}}
+ kernelFunc();
}
void host_ok(void) {
@@ -11,9 +12,9 @@ void host_ok(void) {
int main()
{ host_ok();
- __bf16 var; // expected-note {{'var' defined here}}
+ __bf16 var;
kernel<class variables>([=]() {
- (void)var; // expected-error {{'var' requires 16 bit size '__bf16' type support, but target 'spir64' does not support it}}
+ (void)var;
int B = sizeof(__bf16);
});
|
|
Does that actually need to be backported? It seems to be a new feature and Clang 22 will release in a couple of months. Thanks! |
let me double check, thanks |
SPIR/SPIR-V are generic targets. Assume they support __bf16.
(cherry picked from commit c4254cd)