[llvm] [SPIR-V] Handle bfloat in getZeroFP/getOneFP (PR #202859)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 9 09:02:55 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-spir-v
Author: Arseniy Obolenskiy (aobolensk)
<details>
<summary>Changes</summary>
Related spirv-val change: https://github.com/KhronosGroup/SPIRV-Tools/pull/6734
---
Full diff: https://github.com/llvm/llvm-project/pull/202859.diff
2 Files Affected:
- (modified) llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp (+4)
- (modified) llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bfloat16/bfloat16.ll (+24-1)
``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
index 11128eadef95f..6bdab5d5c4caa 100644
--- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
@@ -3054,6 +3054,8 @@ static APFloat getZeroFP(const Type *LLVMFloatTy) {
switch (LLVMFloatTy->getScalarType()->getTypeID()) {
case Type::HalfTyID:
return APFloat::getZero(APFloat::IEEEhalf());
+ case Type::BFloatTyID:
+ return APFloat::getZero(APFloat::BFloat());
default:
case Type::FloatTyID:
return APFloat::getZero(APFloat::IEEEsingle());
@@ -3068,6 +3070,8 @@ static APFloat getOneFP(const Type *LLVMFloatTy) {
switch (LLVMFloatTy->getScalarType()->getTypeID()) {
case Type::HalfTyID:
return APFloat::getOne(APFloat::IEEEhalf());
+ case Type::BFloatTyID:
+ return APFloat::getOne(APFloat::BFloat());
default:
case Type::FloatTyID:
return APFloat::getOne(APFloat::IEEEsingle());
diff --git a/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bfloat16/bfloat16.ll b/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bfloat16/bfloat16.ll
index 92652f1faefc0..3b4659c08d5da 100644
--- a/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bfloat16/bfloat16.ll
+++ b/llvm/test/CodeGen/SPIRV/extensions/SPV_KHR_bfloat16/bfloat16.ll
@@ -4,10 +4,11 @@
; CHECK-ERROR: LLVM ERROR: OpTypeFloat type with bfloat requires the following SPIR-V extension: SPV_KHR_bfloat16
+; CHECK-DAG: %[[#glsl:]] = OpExtInstImport "GLSL.std.450"
; CHECK-DAG: OpCapability BFloat16TypeKHR
; CHECK-DAG: OpExtension "SPV_KHR_bfloat16"
; CHECK: %[[#BFLOAT:]] = OpTypeFloat 16 0
-; CHECK: %[[#]] = OpTypeVector %[[#BFLOAT]] 2
+; CHECK: %[[#VEC:]] = OpTypeVector %[[#BFLOAT]] 2
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
target triple = "spir64-unknown-unknown"
@@ -25,3 +26,25 @@ entry:
store <2 x bfloat> %data2, ptr @G2
ret void
}
+
+; CHECK-DAG: %[[#zero:]] = OpConstantNull %[[#BFLOAT]]
+; CHECK-DAG: %[[#one:]] = OpConstant %[[#BFLOAT]] 16256
+; CHECK-DAG: %[[#vec_zero:]] = OpConstantNull %[[#VEC]]
+; CHECK-DAG: %[[#vec_one:]] = OpConstantComposite %[[#VEC]] %[[#one]] %[[#one]]
+
+define spir_func bfloat @saturate_bfloat(bfloat %a) {
+entry:
+ ; CHECK: %[[#]] = OpExtInst %[[#BFLOAT]] %[[#glsl]] FClamp %[[#]] %[[#zero]] %[[#one]]
+ %r = call bfloat @llvm.spv.saturate.bf16(bfloat %a)
+ ret bfloat %r
+}
+
+define spir_func <2 x bfloat> @saturate_bfloat2(<2 x bfloat> %a) {
+entry:
+ ; CHECK: %[[#]] = OpExtInst %[[#VEC]] %[[#glsl]] FClamp %[[#]] %[[#vec_zero]] %[[#vec_one]]
+ %r = call <2 x bfloat> @llvm.spv.saturate.v2bf16(<2 x bfloat> %a)
+ ret <2 x bfloat> %r
+}
+
+declare bfloat @llvm.spv.saturate.bf16(bfloat)
+declare <2 x bfloat> @llvm.spv.saturate.v2bf16(<2 x bfloat>)
``````````
</details>
https://github.com/llvm/llvm-project/pull/202859
More information about the llvm-commits
mailing list