Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package spirv-llvm-translator for
openSUSE:Factory checked in at 2025-10-14 18:06:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/spirv-llvm-translator (Old)
and /work/SRC/openSUSE:Factory/.spirv-llvm-translator.new.18484 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "spirv-llvm-translator"
Tue Oct 14 18:06:11 2025 rev:26 rq:1311132 version:21.1.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/spirv-llvm-translator/spirv-llvm-translator.changes
2025-09-30 17:38:55.916552074 +0200
+++
/work/SRC/openSUSE:Factory/.spirv-llvm-translator.new.18484/spirv-llvm-translator.changes
2025-10-14 18:06:35.898417989 +0200
@@ -1,0 +2,11 @@
+Sat Oct 11 13:28:27 UTC 2025 - Aaron Puchert <[email protected]>
+
+- Update to version 21.1.1.
+ * Support for SPV_INTEL_shader_atomic_bfloat16 extension.
+ * Implement SPV_INTEL_bfloat16_arithmetic.
+ * Fix BFloat16 mangling.
+ * Fix error propagation in parseSPIRV.
+- Remove Add-support-for-SPV_INTEL_function_variants.patch: the
+ required functionality is now available in spirv-headers.
+
+-------------------------------------------------------------------
Old:
----
Add-support-for-SPV_INTEL_function_variants.patch
SPIRV-LLVM-Translator-21.1.0.tar.gz
New:
----
SPIRV-LLVM-Translator-21.1.1.tar.gz
----------(Old B)----------
Old: * Fix error propagation in parseSPIRV.
- Remove Add-support-for-SPV_INTEL_function_variants.patch: the
required functionality is now available in spirv-headers.
----------(Old E)----------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ spirv-llvm-translator.spec ++++++
--- /var/tmp/diff_new_pack.j1U9sG/_old 2025-10-14 18:06:36.750454183 +0200
+++ /var/tmp/diff_new_pack.j1U9sG/_new 2025-10-14 18:06:36.754454353 +0200
@@ -23,7 +23,7 @@
%define sover 21
Name: spirv-llvm-translator
-Version: 21.1.0
+Version: 21.1.1
Release: 0
Summary: LLVM/SPIR-V Bi-Directional Translator library
License: BSD-3-Clause
@@ -31,9 +31,6 @@
URL: https://github.com/KhronosGroup/SPIRV-LLVM-Translator
Source:
https://github.com/KhronosGroup/SPIRV-LLVM-Translator/archive/refs/tags/v%{version}.tar.gz#/SPIRV-LLVM-Translator-%{version}.tar.gz
Source101: %{name}.rpmlintrc
-# Temporarily revert upstream commit because the counterpart in spirv-headers
-# (https://github.com/KhronosGroup/SPIRV-Headers/pull/532) is not released yet.
-Patch0:
https://github.com/KhronosGroup/SPIRV-LLVM-Translator/commit/aaa23785dcbd7cabebad860edd9a3aebfc6bbb41.patch#/Add-support-for-SPV_INTEL_function_variants.patch
BuildRequires: cmake >= 3.3
BuildRequires: gcc%{?gcc_version} >= 9
BuildRequires: gcc%{?gcc_version}-c++ >= 9
@@ -69,7 +66,6 @@
%prep
%setup -q -n SPIRV-LLVM-Translator-%{version}
-%patch -P 0 -p 1 -R
%build
%cmake \
++++++ SPIRV-LLVM-Translator-21.1.0.tar.gz ->
SPIRV-LLVM-Translator-21.1.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/include/LLVMSPIRVExtensions.inc
new/SPIRV-LLVM-Translator-21.1.1/include/LLVMSPIRVExtensions.inc
--- old/SPIRV-LLVM-Translator-21.1.0/include/LLVMSPIRVExtensions.inc
2025-08-01 09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/include/LLVMSPIRVExtensions.inc
2025-09-29 12:53:11.000000000 +0200
@@ -77,6 +77,8 @@
EXT(SPV_INTEL_2d_block_io)
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate)
EXT(SPV_KHR_bfloat16)
+EXT(SPV_INTEL_bfloat16_arithmetic)
EXT(SPV_INTEL_ternary_bitwise_function)
EXT(SPV_INTEL_int4)
EXT(SPV_INTEL_function_variants)
+EXT(SPV_INTEL_shader_atomic_bfloat16)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/Mangler/ManglingUtils.cpp
new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/Mangler/ManglingUtils.cpp
--- old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/Mangler/ManglingUtils.cpp
2025-08-01 09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/Mangler/ManglingUtils.cpp
2025-09-29 12:53:11.000000000 +0200
@@ -93,6 +93,7 @@
"intel_sub_group_avc_ime_result_dual_reference_streamin_t"
};
+// clang-format off
const char *MangledTypes[PRIMITIVE_NUM] = {
"b", // BOOL
"h", // UCHAR
@@ -106,7 +107,7 @@
"Dh", // HALF
"f", // FLOAT
"d", // DOUBLE
- "u6__bf16", // __BF16
+ "DF16b", // __BF16
"v", // VOID
"z", // VarArg
"14ocl_image1d_ro", // PRIMITIVE_IMAGE1D_RO_T
@@ -175,6 +176,7 @@
"55ocl_intel_sub_group_avc_ime_single_reference_streamin_t", //
PRIMITIVE_SUB_GROUP_AVC_IME_SINGLE_REF_STREAMIN_T
"53ocl_intel_sub_group_avc_ime_dual_reference_streamin_t" //
PRIMITIVE_SUB_GROUP_AVC_IME_DUAL_REF_STREAMIN_T
};
+// clang-format on
const char *ReadableAttribute[ATTR_NUM] = {
"restrict", "volatile", "const", "__private",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/SPIRVUtil.cpp
new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/SPIRVUtil.cpp
--- old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/SPIRVUtil.cpp 2025-08-01
09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/SPIRVUtil.cpp 2025-09-29
12:53:11.000000000 +0200
@@ -525,6 +525,11 @@
char Mangled = Copy.back();
std::string Mangled2 = Copy.substr(Copy.size() - 2);
+ std::string Mangled5 = Copy.substr(Copy.size() - 5);
+ if (Mangled5 == "DF16b") {
+ return ParamType::FLOAT;
+ }
+
if (isMangledTypeFP(Mangled) || isMangledTypeHalf(Mangled2)) {
return ParamType::FLOAT;
} else if (isMangledTypeUnsigned(Mangled)) {
@@ -1913,6 +1918,9 @@
NumElems = VecTy->getNumElements();
Ty = VecTy->getElementType();
}
+ if (Ty->isBFloatTy() &&
+ BM->hasCapability(internal::CapabilityBFloat16ArithmeticINTEL))
+ return true;
if ((!Ty->isFloatTy() && !Ty->isDoubleTy() && !Ty->isHalfTy()) ||
(!BM->hasCapability(CapabilityVectorAnyINTEL) &&
((NumElems > 4) && (NumElems != 8) && (NumElems != 16)))) {
@@ -1929,6 +1937,9 @@
NumElems = VecTy->getNumElements();
Ty = VecTy->getElementType();
}
+ if (Ty->isBFloatTy() &&
+ BM->hasCapability(internal::CapabilityBFloat16ArithmeticINTEL))
+ return true;
if ((!Ty->isIntegerTy()) ||
(!BM->hasCapability(CapabilityVectorAnyINTEL) &&
((NumElems > 4) && (NumElems != 8) && (NumElems != 16)))) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/SPIRVWriter.cpp
new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/SPIRVWriter.cpp
--- old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/SPIRVWriter.cpp 2025-08-01
09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/SPIRVWriter.cpp 2025-09-29
12:53:11.000000000 +0200
@@ -4201,6 +4201,20 @@
// -spirv-allow-unknown-intrinsics work correctly.
auto IID = II->getIntrinsicID();
switch (IID) {
+ case Intrinsic::fabs:
+ case Intrinsic::fma:
+ case Intrinsic::maxnum:
+ case Intrinsic::minnum:
+ case Intrinsic::fmuladd: {
+ Type *Ty = II->getType();
+ if (Ty->isBFloatTy())
+ BM->addCapability(internal::CapabilityBFloat16ArithmeticINTEL);
+ break;
+ }
+ default:
+ break;
+ }
+ switch (IID) {
case Intrinsic::assume: {
// llvm.assume translation is currently supported only within
// SPV_KHR_expect_assume extension, ignore it otherwise, since it's
@@ -5485,6 +5499,11 @@
SmallVector<std::string, 2> Dec;
if (isBuiltinTransToExtInst(CI->getCalledFunction(), &ExtSetKind, &ExtOp,
&Dec)) {
+ if (const auto *FirstArg = F->getArg(0)) {
+ const auto *Type = FirstArg->getType();
+ if (Type->isBFloatTy())
+ BM->addCapability(internal::CapabilityBFloat16ArithmeticINTEL);
+ }
if (DemangledName.find("__spirv_ocl_printf") != StringRef::npos) {
auto *FormatStrPtr = cast<PointerType>(CI->getArgOperand(0)->getType());
if (FormatStrPtr->getAddressSpace() !=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVEntry.h
new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVEntry.h
--- old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVEntry.h
2025-08-01 09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVEntry.h
2025-09-29 12:53:11.000000000 +0200
@@ -916,6 +916,8 @@
case CapabilityFunctionVariantsINTEL:
case CapabilitySpecConditionalINTEL:
return ExtensionID::SPV_INTEL_function_variants;
+ case internal::CapabilityBFloat16ArithmeticINTEL:
+ return ExtensionID::SPV_INTEL_bfloat16_arithmetic;
default:
return {};
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVEnum.h
new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVEnum.h
--- old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVEnum.h
2025-08-01 09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVEnum.h
2025-09-29 12:53:11.000000000 +0200
@@ -228,6 +228,8 @@
{CapabilityBFloat16TypeKHR, CapabilityCooperativeMatrixKHR});
ADD_VEC_INIT(CapabilityInt4CooperativeMatrixINTEL,
{CapabilityInt4TypeINTEL, CapabilityCooperativeMatrixKHR});
+ ADD_VEC_INIT(internal::CapabilityBFloat16ArithmeticINTEL,
+ {CapabilityBFloat16TypeKHR});
}
template <> inline void SPIRVMap<SPIRVExecutionModelKind, SPIRVCapVec>::init()
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVInstruction.h
new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVInstruction.h
--- old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVInstruction.h
2025-08-01 09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVInstruction.h
2025-09-29 12:53:11.000000000 +0200
@@ -3019,6 +3019,8 @@
public:
std::optional<ExtensionID> getRequiredExtension() const override {
assert(hasType());
+ if (getType()->isTypeFloat(16, FPEncodingBFloat16KHR))
+ return ExtensionID::SPV_INTEL_shader_atomic_bfloat16;
if (getType()->isTypeFloat(16))
return ExtensionID::SPV_EXT_shader_atomic_float16_add;
return ExtensionID::SPV_EXT_shader_atomic_float_add;
@@ -3026,6 +3028,8 @@
SPIRVCapVec getRequiredCapability() const override {
assert(hasType());
+ if (getType()->isTypeFloat(16, FPEncodingBFloat16KHR))
+ return {internal::CapabilityAtomicBFloat16AddINTEL};
if (getType()->isTypeFloat(16))
return {CapabilityAtomicFloat16AddEXT};
if (getType()->isTypeFloat(32))
@@ -3033,26 +3037,30 @@
if (getType()->isTypeFloat(64))
return {CapabilityAtomicFloat64AddEXT};
llvm_unreachable(
- "AtomicFAddEXT can only be generated for f16, f32, f64 types");
+ "AtomicFAddEXT can only be generated for bf16, f16, f32, f64 types");
}
};
class SPIRVAtomicFMinMaxEXTBase : public SPIRVAtomicInstBase {
public:
std::optional<ExtensionID> getRequiredExtension() const override {
+ if (getType()->isTypeFloat(16, FPEncodingBFloat16KHR))
+ return ExtensionID::SPV_INTEL_shader_atomic_bfloat16;
return ExtensionID::SPV_EXT_shader_atomic_float_min_max;
}
SPIRVCapVec getRequiredCapability() const override {
assert(hasType());
+ if (getType()->isTypeFloat(16, FPEncodingBFloat16KHR))
+ return {internal::CapabilityAtomicBFloat16MinMaxINTEL};
if (getType()->isTypeFloat(16))
return {CapabilityAtomicFloat16MinMaxEXT};
if (getType()->isTypeFloat(32))
return {CapabilityAtomicFloat32MinMaxEXT};
if (getType()->isTypeFloat(64))
return {CapabilityAtomicFloat64MinMaxEXT};
- llvm_unreachable(
- "AtomicF(Min|Max)EXT can only be generated for f16, f32, f64 types");
+ llvm_unreachable("AtomicF(Min|Max)EXT can only be generated for bf16, f16,
"
+ "f32, f64 types");
}
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVModule.cpp
new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVModule.cpp
--- old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVModule.cpp
2025-08-01 09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVModule.cpp
2025-09-29 12:53:11.000000000 +0200
@@ -1732,6 +1732,8 @@
SPIRVValue *Op1,
SPIRVValue *Op2,
SPIRVBasicBlock *BB) {
+ if (Type->isTypeFloat(16, FPEncodingBFloat16KHR) && TheOpCode != OpDot)
+ addCapability(internal::CapabilityBFloat16ArithmeticINTEL);
return addInstruction(SPIRVInstTemplateBase::create(
TheOpCode, Type, getId(),
getVec(Op1->getId(), Op2->getId()), BB, this),
@@ -1755,6 +1757,8 @@
SPIRVType *TheType,
SPIRVValue *Op,
SPIRVBasicBlock *BB) {
+ if (TheType->isTypeFloat(16, FPEncodingBFloat16KHR) && TheOpCode != OpDot)
+ addCapability(internal::CapabilityBFloat16ArithmeticINTEL);
return addInstruction(
SPIRVInstTemplateBase::create(TheOpCode, TheType, getId(),
getVec(Op->getId()), BB, this),
@@ -2572,7 +2576,7 @@
SPIRVWord Header[5] = {0};
I.read(reinterpret_cast<char *>(&Header), sizeof(Header));
- SPIRVErrorLog ErrorLog = MI.getErrorLog();
+ SPIRVErrorLog &ErrorLog = MI.getErrorLog();
if (!ErrorLog.checkError(!I.eof(), SPIRVEC_InvalidModule,
"input file is empty") ||
!ErrorLog.checkError(!I.fail(), SPIRVEC_InvalidModule,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
--- old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
2025-08-01 09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
2025-09-29 12:53:11.000000000 +0200
@@ -625,6 +625,9 @@
add(CapabilityLongCompositesINTEL, "LongCompositesINTEL");
add(CapabilityOptNoneEXT, "OptNoneEXT");
add(CapabilityAtomicFloat16AddEXT, "AtomicFloat16AddEXT");
+ add(internal::CapabilityAtomicBFloat16AddINTEL, "AtomicBFloat16AddINTEL");
+ add(internal::CapabilityAtomicBFloat16MinMaxINTEL,
+ "AtomicBFloat16MinMaxINTEL");
add(CapabilityDebugInfoModuleINTEL, "DebugInfoModuleINTEL");
add(CapabilityBFloat16ConversionINTEL, "Bfloat16ConversionINTEL");
add(CapabilitySplitBarrierINTEL, "SplitBarrierINTEL");
@@ -687,6 +690,7 @@
add(CapabilityInt4CooperativeMatrixINTEL, "Int4CooperativeMatrixINTEL");
add(CapabilityFunctionVariantsINTEL, "FunctionVariantsINTEL");
add(CapabilitySpecConditionalINTEL, "SpecConditionalINTEL");
+ add(internal::CapabilityBFloat16ArithmeticINTEL, "BFloat16ArithmeticINTEL");
}
SPIRV_DEF_NAMEMAP(Capability, SPIRVCapabilityNameMap)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/spirv_internal.hpp
new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/spirv_internal.hpp
--- old/SPIRV-LLVM-Translator-21.1.0/lib/SPIRV/libSPIRV/spirv_internal.hpp
2025-08-01 09:28:13.000000000 +0200
+++ new/SPIRV-LLVM-Translator-21.1.1/lib/SPIRV/libSPIRV/spirv_internal.hpp
2025-09-29 12:53:11.000000000 +0200
@@ -106,7 +106,10 @@
ICapGlobalVariableDecorationsINTEL = 6146,
ICapabilityTaskSequenceINTEL = 6162,
ICapabilityCooperativeMatrixCheckedInstructionsINTEL = 6192,
+ ICapabilityBFloat16ArithmeticINTEL = 6226,
ICapabilityCooperativeMatrixOffsetInstructionsINTEL = 6238,
+ ICapabilityAtomicBFloat16AddINTEL = 6255,
+ ICapabilityAtomicBFloat16MinMaxINTEL = 6256,
ICapabilityCooperativeMatrixPrefetchINTEL = 6411,
ICapabilityMaskedGatherScatterINTEL = 6427,
ICapabilityJointMatrixWIInstructionsINTEL = 6435,
@@ -202,6 +205,9 @@
_SPIRV_OP(Op, ConvertHandleToImageINTEL)
_SPIRV_OP(Op, ConvertHandleToSamplerINTEL)
_SPIRV_OP(Op, ConvertHandleToSampledImageINTEL)
+
+_SPIRV_OP(Capability, AtomicBFloat16AddINTEL)
+_SPIRV_OP(Capability, AtomicBFloat16MinMaxINTEL)
#undef _SPIRV_OP
constexpr SourceLanguage SourceLanguagePython =
@@ -263,6 +269,8 @@
static_cast<Capability>(ICapTokenTypeINTEL);
constexpr Capability CapabilityGlobalVariableDecorationsINTEL =
static_cast<Capability>(ICapGlobalVariableDecorationsINTEL);
+constexpr Capability CapabilityBFloat16ArithmeticINTEL =
+ static_cast<Capability>(ICapabilityBFloat16ArithmeticINTEL);
constexpr ExecutionMode ExecutionModeNamedSubgroupSizeINTEL =
static_cast<ExecutionMode>(IExecModeNamedSubgroupSizeINTEL);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_bfloat16/bfloat16_math.ll
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_bfloat16/bfloat16_math.ll
---
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_bfloat16/bfloat16_math.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_bfloat16/bfloat16_math.ll
2025-09-29 12:53:11.000000000 +0200
@@ -0,0 +1,271 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_KHR_bfloat16
--spirv-ext=+SPV_INTEL_bfloat16_arithmetic -o %t.spv
+; RUN: llvm-spirv %t.spv -to-text -o - | FileCheck %s
--check-prefix=CHECK-SPIRV
+
+; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefix=CHECK-LLVM
+
+; RUN: not llvm-spirv %t.bc --spirv-ext=+SPV_KHR_bfloat16 2>&1 >/dev/null |
FileCheck %s --check-prefix=CHECK-ERROR
+; RUN: not llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_bfloat16_arithmetic 2>&1
>/dev/null | FileCheck %s --check-prefix=CHECK-ERROR
+; CHECK-ERROR: RequiresExtension: Feature requires the following SPIR-V
extension:
+
+source_filename = "bfloat16.cpp"
+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 = "spirv64-unknown-unknown"
+
+; CHECK-SPIRV: Capability BFloat16TypeKHR
+; CHECK-SPIRV: Capability BFloat16ArithmeticINTEL
+; CHECK-SPIRV: Extension "SPV_INTEL_bfloat16_arithmetic"
+; CHECK-SPIRV: Extension "SPV_KHR_bfloat16"
+; CHECK-SPIRV: 4 TypeFloat [[BFLOAT:[0-9]+]] 16 0
+; CHECK-SPIRV: 5 Function [[#]] [[#]] [[#]] [[#]]
+; CHECK-SPIRV: 7 Phi [[BFLOAT]] [[#]] [[#]] [[#]] [[#]] [[#]]
+; CHECK-SPIRV: 2 ReturnValue [[#]]
+; CHECK-SPIRV: 4 Variable [[#]] [[ADDR1:[0-9]+]]
+; CHECK-SPIRV: 4 Variable [[#]] [[ADDR2:[0-9]+]]
+; CHECK-SPIRV: 4 Variable [[#]] [[ADDR3:[0-9]+]]
+; CHECK-SPIRV: 6 Load [[BFLOAT]] [[DATA1:[0-9]+]] [[ADDR1]]
+; CHECK-SPIRV: 6 Load [[BFLOAT]] [[DATA2:[0-9]+]] [[ADDR2]]
+; CHECK-SPIRV: 6 Load [[BFLOAT]] [[DATA3:[0-9]+]] [[ADDR3]]
+; Undef
+; Constant
+; ConstantComposite
+; ConstantNull
+; SpecConstant
+; SpecConstantComposite
+; CHECK-SPIRV: 4 ConvertFToU [[#]] [[#]] [[DATA1]]
+; CHECK-SPIRV: 4 ConvertFToS [[#]] [[#]] [[DATA1]]
+; CHECK-SPIRV: 4 ConvertSToF [[BFLOAT]] [[#]] [[#]]
+; CHECK-SPIRV: 4 ConvertUToF [[BFLOAT]] [[#]] [[#]]
+; Bitcast
+; CHECK-SPIRV: 4 FNegate [[BFLOAT]] [[#]] [[DATA1]]
+; CHECK-SPIRV: 5 FAdd [[BFLOAT]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FSub [[BFLOAT]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FMul [[BFLOAT]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FDiv [[BFLOAT]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FRem [[BFLOAT]] [[#]] [[DATA1]] [[DATA2]]
+; FMod
+; VectorTimesScalar
+; CHECK-SPIRV: 4 IsNan [[#]] [[#]] [[DATA1]]
+; CHECK-SPIRV: 4 IsInf [[#]] [[#]] [[DATA1]]
+; IsFinite
+; CHECK-SPIRV: 4 IsNormal [[#]] [[#]] [[DATA1]]
+; CHECK-SPIRV: 5 Ordered [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 Unordered [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 6 Select [[BFLOAT]] [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FOrdEqual [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FUnordEqual [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FOrdNotEqual [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FUnordNotEqual [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FOrdLessThan [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FUnordLessThan [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FOrdGreaterThan [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FUnordGreaterThan [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FOrdLessThanEqual [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FUnordLessThanEqual [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FOrdGreaterThanEqual [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 5 FUnordGreaterThanEqual [[#]] [[#]] [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] fabs [[DATA1]]
+; CHECK-SPIRV: 8 ExtInst [[BFLOAT]] [[#]] [[#]] fclamp [[DATA1]] [[DATA2]]
[[DATA3]]
+; CHECK-SPIRV: 8 ExtInst [[BFLOAT]] [[#]] [[#]] fma [[DATA1]] [[DATA2]]
[[DATA3]]
+; CHECK-SPIRV: 7 ExtInst [[BFLOAT]] [[#]] [[#]] fmax [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 7 ExtInst [[BFLOAT]] [[#]] [[#]] fmin [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 8 ExtInst [[BFLOAT]] [[#]] [[#]] mad [[DATA1]] [[DATA2]]
[[DATA3]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] nan [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_cos [[DATA1]]
+; CHECK-SPIRV: 7 ExtInst [[BFLOAT]] [[#]] [[#]] native_divide [[DATA1]]
[[DATA2]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_exp [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_exp10 [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_exp2 [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_log [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_log10 [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_log2 [[DATA1]]
+; CHECK-SPIRV: 7 ExtInst [[BFLOAT]] [[#]] [[#]] native_powr [[DATA1]] [[DATA2]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_recip [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_rsqrt [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_sin [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_sqrt [[DATA1]]
+; CHECK-SPIRV: 6 ExtInst [[BFLOAT]] [[#]] [[#]] native_tan [[DATA1]]
+
+; CHECK-LLVM: define spir_func void @OpPhi(bfloat %data1, bfloat %data2)
+; CHECK-LLVM: %OpPhi = phi bfloat [ %data1, %blockA ], [ %data2, %blockB ]
+; CHECK-LLVM: ret bfloat %OpReturnValue
+; CHECK-LLVM: [[ADDR1:[%a-z0-9]+]] = alloca bfloat
+; CHECK-LLVM: [[ADDR2:[%a-z0-9]+]] = alloca bfloat
+; CHECK-LLVM: [[ADDR3:[%a-z0-9]+]] = alloca bfloat
+; CHECK-LLVM: [[DATA1:[%a-z0-9]+]] = load bfloat, ptr [[ADDR1]]
+; CHECK-LLVM: [[DATA2:[%a-z0-9]+]] = load bfloat, ptr [[ADDR2]]
+; CHECK-LLVM: [[DATA3:[%a-z0-9]+]] = load bfloat, ptr [[ADDR3]]
+; %OpUndef
+; %OpConstant
+; %OpConstantComposite
+; %OpConstantNull
+; %OpSpecConstant
+; %OpSpecConstantComposite
+; CHECK-LLVM: %OpConvertFToU = fptoui bfloat [[DATA1]] to i32
+; CHECK-LLVM: %OpConvertFToS = fptosi bfloat [[DATA1]] to i32
+; CHECK-LLVM: %OpConvertSToF = sitofp i32 0 to bfloat
+; CHECK-LLVM: %OpConvertUToF = uitofp i32 0 to bfloat
+; %OpBitcast
+; CHECK-LLVM: %OpFNegate = fneg bfloat [[DATA1]]
+; CHECK-LLVM: %OpFAdd = fadd bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFSub = fsub bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFMul = fmul bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFDiv = fdiv bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFRem = frem bfloat [[DATA1]], [[DATA2]]
+; %OpFMod
+; %OpVectorTimesScalar
+; CHECK-LLVM: %[[#]] = call spir_func i32 @_Z5isnanDF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %[[#]] = call spir_func i32 @_Z5isinfDF16b(bfloat [[DATA1]])
+; %OpIsFinite
+; CHECK-LLVM: %[[#]] = call spir_func i32 @_Z8isnormalDF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %OpOrdered = fcmp ord bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpUnordered = fcmp uno bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpSelect = select i1 true, bfloat [[DATA1]], bfloat [[DATA2]]
+; CHECK-LLVM: %OpFOrdEqual = fcmp oeq bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFUnordEqual = fcmp ueq bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFOrdNotEqual = fcmp one bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFUnordNotEqual = fcmp une bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFOrdLessThan = fcmp olt bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFUnordLessThan = fcmp ult bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFOrdGreaterThan = fcmp ogt bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFUnordGreaterThan = fcmp ugt bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFOrdLessThanEqual = fcmp ole bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFUnordLessThanEqual = fcmp ule bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFOrdGreaterThanEqual = fcmp oge bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %OpFUnordGreaterThanEqual = fcmp uge bfloat [[DATA1]], [[DATA2]]
+; CHECK-LLVM: %fabs = call spir_func bfloat @_Z4fabsDF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %fclamp = call spir_func bfloat @_Z5clampDF16bDF16bDF16b(bfloat
[[DATA1]], bfloat [[DATA2]], bfloat [[DATA3]])
+; CHECK-LLVM: %fma = call spir_func bfloat @_Z3fmaDF16bDF16bDF16b(bfloat
[[DATA1]], bfloat [[DATA2]], bfloat [[DATA3]])
+; CHECK-LLVM: %fmax = call spir_func bfloat @_Z4fmaxDF16bDF16b(bfloat
[[DATA1]], bfloat [[DATA2]])
+; CHECK-LLVM: %fmin = call spir_func bfloat @_Z4fminDF16bDF16b(bfloat
[[DATA1]], bfloat [[DATA2]])
+; CHECK-LLVM: %mad = call spir_func bfloat @_Z3madDF16bDF16bDF16b(bfloat
[[DATA1]], bfloat [[DATA2]], bfloat [[DATA3]])
+; CHECK-LLVM: %nan = call spir_func bfloat @_Z3nanDF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %native_cos = call spir_func bfloat @_Z10native_cosDF16b(bfloat
[[DATA1]])
+; CHECK-LLVM: %native_divide = call spir_func bfloat
@_Z13native_divideDF16bDF16b(bfloat [[DATA1]], bfloat [[DATA2]])
+; CHECK-LLVM: %native_exp = call spir_func bfloat @_Z10native_expDF16b(bfloat
[[DATA1]])
+; CHECK-LLVM: %native_exp10 = call spir_func bfloat
@_Z12native_exp10DF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %native_exp2 = call spir_func bfloat
@_Z11native_exp2DF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %native_log = call spir_func bfloat @_Z10native_logDF16b(bfloat
[[DATA1]])
+; CHECK-LLVM: %native_log10 = call spir_func bfloat
@_Z12native_log10DF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %native_log2 = call spir_func bfloat
@_Z11native_log2DF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %native_powr = call spir_func bfloat
@_Z11native_powrDF16bDF16b(bfloat [[DATA1]], bfloat [[DATA2]])
+; CHECK-LLVM: %native_recip = call spir_func bfloat
@_Z12native_recipDF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %native_rsqrt = call spir_func bfloat
@_Z12native_rsqrtDF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %native_sin = call spir_func bfloat @_Z10native_sinDF16b(bfloat
[[DATA1]])
+; CHECK-LLVM: %native_sqrt = call spir_func bfloat
@_Z11native_sqrtDF16b(bfloat [[DATA1]])
+; CHECK-LLVM: %native_tan = call spir_func bfloat @_Z10native_tanDF16b(bfloat
[[DATA1]])
+
+declare spir_func bfloat @_Z5clampDF16bDF16bDF16b(bfloat, bfloat, bfloat)
+declare spir_func bfloat @_Z3nanDF16b(bfloat)
+declare spir_func bfloat @_Z10native_cosDF16b(bfloat)
+declare spir_func bfloat @_Z13native_divideDF16bDF16b(bfloat, bfloat)
+declare spir_func bfloat @_Z10native_expDF16b(bfloat)
+declare spir_func bfloat @_Z12native_exp10DF16b(bfloat)
+declare spir_func bfloat @_Z11native_exp2DF16b(bfloat)
+declare spir_func bfloat @_Z10native_logDF16b(bfloat)
+declare spir_func bfloat @_Z12native_log10DF16b(bfloat)
+declare spir_func bfloat @_Z11native_log2DF16b(bfloat)
+declare spir_func bfloat @_Z11native_powrDF16bDF16b(bfloat, bfloat)
+declare spir_func bfloat @_Z12native_recipDF16b(bfloat)
+declare spir_func bfloat @_Z12native_rsqrtDF16b(bfloat)
+declare spir_func bfloat @_Z10native_sinDF16b(bfloat)
+declare spir_func bfloat @_Z11native_sqrtDF16b(bfloat)
+declare spir_func bfloat @_Z10native_tanDF16b(bfloat)
+
+define spir_func void @OpPhi(bfloat %data1, bfloat %data2) {
+ br label %blockA
+blockA:
+ br label %phi
+blockB:
+ br label %phi
+phi:
+ %OpPhi = phi bfloat [ %data1, %blockA ], [ %data2, %blockB ]
+ ret void
+}
+
+define spir_func bfloat @OpReturnValue(bfloat %OpReturnValue) {
+ ret bfloat %OpReturnValue
+}
+
+define spir_kernel void @testMath() {
+entry:
+ %addr1 = alloca bfloat
+ %addr2 = alloca bfloat
+ %addr3 = alloca bfloat
+ %data1 = load bfloat, ptr %addr1
+ %data2 = load bfloat, ptr %addr2
+ %data3 = load bfloat, ptr %addr3
+ ; %OpUndef
+ ; %OpConstant
+ ; %OpConstantComposite
+ ; %OpConstantNull
+ ; %OpSpecConstant
+ ; %OpSpecConstantComposite
+ %OpConvertFToU = fptoui bfloat %data1 to i32
+ %OpConvertFToS = fptosi bfloat %data1 to i32
+ %OpConvertSToF = sitofp i32 0 to bfloat
+ %OpConvertUToF = uitofp i32 0 to bfloat
+ ; %OpBitcast
+ %OpFNegate = fneg bfloat %data1
+ %OpFAdd = fadd bfloat %data1, %data2
+ %OpFSub = fsub bfloat %data1, %data2
+ %OpFMul = fmul bfloat %data1, %data2
+ %OpFDiv = fdiv bfloat %data1, %data2
+ %OpFRem = frem bfloat %data1, %data2
+ ; %OpFMod
+ ; %OpVectorTimesScalar
+ %OpIsNan = call i1 @llvm.is.fpclass.bfloat(bfloat %data1, i32 3)
+ %OpIsInf = call i1 @llvm.is.fpclass.bfloat(bfloat %data1, i32 516)
+ ; %OpIsFinite
+ %OpIsNormal = call i1 @llvm.is.fpclass.bfloat(bfloat %data1, i32 264)
+ %OpOrdered = fcmp ord bfloat %data1, %data2
+ %OpUnordered = fcmp uno bfloat %data1, %data2
+ %OpSelect = select i1 true, bfloat %data1, bfloat %data2
+ %OpFOrdEqual = fcmp oeq bfloat %data1, %data2
+ %OpFUnordEqual = fcmp ueq bfloat %data1, %data2
+ %OpFOrdNotEqual = fcmp one bfloat %data1, %data2
+ %OpFUnordNotEqual = fcmp une bfloat %data1, %data2
+ %OpFOrdLessThan = fcmp olt bfloat %data1, %data2
+ %OpFUnordLessThan = fcmp ult bfloat %data1, %data2
+ %OpFOrdGreaterThan = fcmp ogt bfloat %data1, %data2
+ %OpFUnordGreaterThan = fcmp ugt bfloat %data1, %data2
+ %OpFOrdLessThanEqual = fcmp ole bfloat %data1, %data2
+ %OpFUnordLessThanEqual = fcmp ule bfloat %data1, %data2
+ %OpFOrdGreaterThanEqual = fcmp oge bfloat %data1, %data2
+ %OpFUnordGreaterThanEqual = fcmp uge bfloat %data1, %data2
+ %fabs = call bfloat @llvm.fabs.bfloat(bfloat %data1)
+ %fclamp = call spir_func bfloat @_Z5clampDF16bDF16bDF16b(bfloat %data1,
bfloat %data2, bfloat %data3)
+ %fma = call bfloat @llvm.fma.bfloat(bfloat %data1, bfloat %data2, bfloat
%data3)
+ %fmax = call bfloat @llvm.maxnum.bfloat(bfloat %data1, bfloat %data2)
+ %fmin = call bfloat @llvm.minnum.bfloat(bfloat %data1, bfloat %data2)
+ %mad = call bfloat @llvm.fmuladd.bfloat(bfloat %data1, bfloat %data2, bfloat
%data3)
+ %nan = call spir_func bfloat @_Z3nanDF16b(bfloat %data1)
+ %native_cos = call spir_func bfloat @_Z10native_cosDF16b(bfloat %data1)
+ %native_divide = call spir_func bfloat @_Z13native_divideDF16bDF16b(bfloat
%data1, bfloat %data2)
+ %native_exp = call spir_func bfloat @_Z10native_expDF16b(bfloat %data1)
+ %native_exp10 = call spir_func bfloat @_Z12native_exp10DF16b(bfloat %data1)
+ %native_exp2 = call spir_func bfloat @_Z11native_exp2DF16b(bfloat %data1)
+ %native_log = call spir_func bfloat @_Z10native_logDF16b(bfloat %data1)
+ %native_log10 = call spir_func bfloat @_Z12native_log10DF16b(bfloat %data1)
+ %native_log2 = call spir_func bfloat @_Z11native_log2DF16b(bfloat %data1)
+ %native_powr = call spir_func bfloat @_Z11native_powrDF16bDF16b(bfloat
%data1, bfloat %data2)
+ %native_recip = call spir_func bfloat @_Z12native_recipDF16b(bfloat %data1)
+ %native_rsqrt = call spir_func bfloat @_Z12native_rsqrtDF16b(bfloat %data1)
+ %native_sin = call spir_func bfloat @_Z10native_sinDF16b(bfloat %data1)
+ %native_sqrt = call spir_func bfloat @_Z11native_sqrtDF16b(bfloat %data1)
+ %native_tan = call spir_func bfloat @_Z10native_tanDF16b(bfloat %data1)
+ ret void
+}
+
+!opencl.enable.FP_CONTRACT = !{}
+!opencl.spir.version = !{!0}
+!opencl.ocl.version = !{!1}
+!opencl.used.extensions = !{!2}
+!opencl.used.optional.core.features = !{!3}
+!opencl.compiler.options = !{!3}
+
+!0 = !{i32 1, i32 2}
+!1 = !{i32 2, i32 0}
+!2 = !{!"cl_khr_fp16"}
+!3 = !{}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFAddEXT.ll
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFAddEXT.ll
---
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFAddEXT.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFAddEXT.ll
2025-09-29 12:53:11.000000000 +0200
@@ -0,0 +1,30 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc
--spirv-ext=+SPV_INTEL_shader_atomic_bfloat16,+SPV_KHR_bfloat16 -o %t.spv
+; RUN: llvm-spirv -to-text %t.spv -o %t.spt
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
+
+; RUN: llvm-spirv --spirv-target-env=SPV-IR -r %t.spv -o %t.rev.bc
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-SPV
+
+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"
+
+; CHECK-SPIRV-DAG: Capability AtomicBFloat16AddINTEL
+; CHECK-SPIRV-DAG: Capability BFloat16TypeKHR
+; CHECK-SPIRV-DAG: Extension "SPV_INTEL_shader_atomic_bfloat16"
+; CHECK-SPIRV-DAG: Extension "SPV_KHR_bfloat16"
+
+; CHECK-SPIRV: TypeFloat [[BFLOAT:[0-9]+]] 16 0
+
+; Function Attrs: convergent norecurse nounwind
+define dso_local spir_func bfloat @test_AtomicFAddEXT_bfloat(ptr addrspace(4)
align 2 dereferenceable(4) %Arg) {
+entry:
+ %0 = addrspacecast ptr addrspace(4) %Arg to ptr addrspace(1)
+ ; CHECK-SPIRV: AtomicFAddEXT [[BFLOAT]]
+ ; CHECK-LLVM-SPV: call spir_func bfloat
@_Z21__spirv_AtomicFAddEXTPU3AS1DF16biiDF16b({{.*}}bfloat
+ %ret = tail call spir_func bfloat
@_Z21__spirv_AtomicFAddEXTPU3AS1DF16biiDF16b(ptr addrspace(1) %0, i32 1, i32
896, bfloat 1.000000e+00)
+ ret bfloat %ret
+}
+
+; Function Attrs: convergent
+declare dso_local spir_func bfloat
@_Z21__spirv_AtomicFAddEXTPU3AS1DF16biiDF16b(ptr addrspace(1), i32, i32, bfloat)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFMaxEXT.ll
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFMaxEXT.ll
---
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFMaxEXT.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFMaxEXT.ll
2025-09-29 12:53:11.000000000 +0200
@@ -0,0 +1,30 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc
--spirv-ext=+SPV_INTEL_shader_atomic_bfloat16,+SPV_KHR_bfloat16 -o %t.spv
+; RUN: llvm-spirv -to-text %t.spv -o %t.spt
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
+
+; RUN: llvm-spirv --spirv-target-env=SPV-IR -r %t.spv -o %t.rev.bc
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-SPV
+
+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"
+
+; CHECK-SPIRV-DAG: Capability AtomicBFloat16MinMaxINTEL
+; CHECK-SPIRV-DAG: Capability BFloat16TypeKHR
+; CHECK-SPIRV-DAG: Extension "SPV_INTEL_shader_atomic_bfloat16"
+; CHECK-SPIRV-DAG: Extension "SPV_KHR_bfloat16"
+
+; CHECK-SPIRV: TypeFloat [[BFLOAT:[0-9]+]] 16 0
+
+; Function Attrs: convergent norecurse nounwind
+define dso_local spir_func bfloat @test_AtomicFMaxEXT_bfloat(ptr addrspace(4)
align 2 dereferenceable(4) %Arg) {
+entry:
+ %0 = addrspacecast ptr addrspace(4) %Arg to ptr addrspace(1)
+ ; CHECK-SPIRV: AtomicFMaxEXT [[BFLOAT]]
+ ; CHECK-LLVM-SPV: call spir_func bfloat
@_Z21__spirv_AtomicFMaxEXTPU3AS1DF16biiDF16b({{.*}}bfloat
+ %ret = tail call spir_func bfloat
@_Z21__spirv_AtomicFMaxEXTPU3AS1DF16biiDF16b(ptr addrspace(1) %0, i32 1, i32
896, bfloat 1.000000e+00)
+ ret bfloat %ret
+}
+
+; Function Attrs: convergent
+declare dso_local spir_func bfloat
@_Z21__spirv_AtomicFMaxEXTPU3AS1DF16biiDF16b(ptr addrspace(1), i32, i32, bfloat)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFMinEXT.ll
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFMinEXT.ll
---
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFMinEXT.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/AtomicFMinEXT.ll
2025-09-29 12:53:11.000000000 +0200
@@ -0,0 +1,30 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc
--spirv-ext=+SPV_INTEL_shader_atomic_bfloat16,+SPV_KHR_bfloat16 -o %t.spv
+; RUN: llvm-spirv -to-text %t.spv -o %t.spt
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
+
+; RUN: llvm-spirv --spirv-target-env=SPV-IR -r %t.spv -o %t.rev.bc
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-SPV
+
+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"
+
+; CHECK-SPIRV-DAG: Capability AtomicBFloat16MinMaxINTEL
+; CHECK-SPIRV-DAG: Capability BFloat16TypeKHR
+; CHECK-SPIRV-DAG: Extension "SPV_INTEL_shader_atomic_bfloat16"
+; CHECK-SPIRV-DAG: Extension "SPV_KHR_bfloat16"
+
+; CHECK-SPIRV: TypeFloat [[BFLOAT:[0-9]+]] 16 0
+
+; Function Attrs: convergent norecurse nounwind
+define dso_local spir_func bfloat @test_AtomicFMinEXT_bfloat(ptr addrspace(4)
align 2 dereferenceable(4) %Arg) {
+entry:
+ %0 = addrspacecast ptr addrspace(4) %Arg to ptr addrspace(1)
+ ; CHECK-SPIRV: AtomicFMinEXT [[BFLOAT]]
+ ; CHECK-LLVM-SPV: call spir_func bfloat
@_Z21__spirv_AtomicFMinEXTPU3AS1DF16biiDF16b({{.*}}bfloat
+ %ret = tail call spir_func bfloat
@_Z21__spirv_AtomicFMinEXTPU3AS1DF16biiDF16b(ptr addrspace(1) %0, i32 1, i32
896, bfloat 1.000000e+00)
+ ret bfloat %ret
+}
+
+; Function Attrs: convergent
+declare dso_local spir_func bfloat
@_Z21__spirv_AtomicFMinEXTPU3AS1DF16biiDF16b(ptr addrspace(1), i32, i32, bfloat)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/atomicrmw_fadd.ll
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/atomicrmw_fadd.ll
---
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/atomicrmw_fadd.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/atomicrmw_fadd.ll
2025-09-29 12:53:11.000000000 +0200
@@ -0,0 +1,34 @@
+; RUN: llvm-as < %s -o %t.bc
+; RUN: llvm-spirv
--spirv-ext=+SPV_INTEL_shader_atomic_bfloat16,+SPV_KHR_bfloat16 %t.bc -o %t.spv
+; RUN: llvm-spirv -to-text %t.spv -o - | FileCheck %s
+
+; CHECK-DAG: Extension "SPV_INTEL_shader_atomic_bfloat16"
+; CHECK-DAG: Extension "SPV_KHR_bfloat16"
+; CHECK-DAG: Capability AtomicBFloat16AddINTEL
+; CHECK-DAG: Capability BFloat16TypeKHR
+; CHECK: TypeInt [[Int:[0-9]+]] 32 0
+; CHECK-DAG: Constant [[Int]] [[Scope_CrossDevice:[0-9]+]] 0 {{$}}
+; CHECK-DAG: Constant [[Int]] [[MemSem_SequentiallyConsistent:[0-9]+]] 16
+; CHECK: TypeFloat [[BFloat:[0-9]+]] 16 0
+; CHECK: Variable {{[0-9]+}} [[BFloatPointer:[0-9]+]]
+; CHECK: Constant [[BFloat]] [[BFloatValue:[0-9]+]] 16936
+
+target datalayout =
"e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir64"
+
+@f = common dso_local local_unnamed_addr addrspace(1) global bfloat
0.000000e+00, align 8
+
+; Function Attrs: nounwind
+define dso_local spir_func void @test_atomicrmw_fadd() local_unnamed_addr #0 {
+entry:
+ %0 = atomicrmw fadd ptr addrspace(1) @f, bfloat 42.000000e+00 seq_cst
+; CHECK: AtomicFAddEXT [[BFloat]] {{[0-9]+}} [[BFloatPointer]]
[[Scope_CrossDevice]] [[MemSem_SequentiallyConsistent]] [[BFloatValue]]
+
+ ret void
+}
+
+attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false"
"disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false"
"min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false"
"no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false"
"no-trapping-math"="false" "stack-protector-buffer-size"="8"
"unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.module.flags = !{!0}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/atomicrmw_fminfmax.ll
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/atomicrmw_fminfmax.ll
---
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/atomicrmw_fminfmax.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/atomicrmw_fminfmax.ll
2025-09-29 12:53:11.000000000 +0200
@@ -0,0 +1,36 @@
+; RUN: llvm-as < %s -o %t.bc
+; RUN: llvm-spirv
--spirv-ext=+SPV_INTEL_shader_atomic_bfloat16,+SPV_KHR_bfloat16 %t.bc -o %t.spv
+; RUN: llvm-spirv -to-text %t.spv -o - | FileCheck %s
+
+; CHECK-DAG: Extension "SPV_INTEL_shader_atomic_bfloat16"
+; CHECK-DAG: Extension "SPV_KHR_bfloat16"
+; CHECK-DAG: AtomicBFloat16MinMaxINTEL
+; CHECK-DAG: Capability BFloat16TypeKHR
+; CHECK: TypeInt [[Int:[0-9]+]] 32 0
+; CHECK-DAG: Constant [[Int]] [[Scope_CrossDevice:[0-9]+]] 0 {{$}}
+; CHECK-DAG: Constant [[Int]] [[MemSem_SequentiallyConsistent:[0-9]+]] 16
+; CHECK: TypeFloat [[BFloat:[0-9]+]] 16 0
+; CHECK: Variable {{[0-9]+}} [[BFloatPointer:[0-9]+]]
+; CHECK: Constant [[BFloat]] [[BFloatValue:[0-9]+]] 16936
+
+target datalayout =
"e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir64"
+
+@f = common dso_local local_unnamed_addr addrspace(1) global bfloat
0.000000e+00, align 4
+
+; Function Attrs: nounwind
+define dso_local spir_func void @test_atomicrmw_fadd() local_unnamed_addr #0 {
+entry:
+ %0 = atomicrmw fmin ptr addrspace(1) @f, bfloat 42.000000e+00 seq_cst
+; CHECK: AtomicFMinEXT [[BFloat]] {{[0-9]+}} [[BFloatPointer]]
[[Scope_CrossDevice]] [[MemSem_SequentiallyConsistent]] [[BFloatValue]]
+ %1 = atomicrmw fmax ptr addrspace(1) @f, bfloat 42.000000e+00 seq_cst
+; CHECK: AtomicFMaxEXT [[BFloat]] {{[0-9]+}} [[BFloatPointer]]
[[Scope_CrossDevice]] [[MemSem_SequentiallyConsistent]] [[BFloatValue]]
+
+ ret void
+}
+
+attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false"
"disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false"
"min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false"
"no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false"
"no-trapping-math"="false" "stack-protector-buffer-size"="8"
"unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.module.flags = !{!0}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/negative.ll
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/negative.ll
---
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/negative.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/INTEL/SPV_INTEL_shader_atomic_bfloat16/negative.ll
2025-09-29 12:53:11.000000000 +0200
@@ -0,0 +1,29 @@
+; RUN: llvm-as < %s -o %t.bc
+; RUN: not llvm-spirv --spirv-ext=+SPV_INTEL_shader_atomic_bfloat16 %t.bc 2>&1
| FileCheck %s --check-prefix=CHECK-NO-BF
+; RUN: not llvm-spirv --spirv-ext=+SPV_KHR_bfloat16 %t.bc 2>&1 | FileCheck %s
--check-prefix=CHECK-NO-ATOM
+
+; CHECK-NO-BF: RequiresExtension: Feature requires the following SPIR-V
extension:
+; CHECK-NO-BF-NEXT: SPV_KHR_bfloat16
+; CHECK-NO-BF-NEXT: NOTE: LLVM module contains bfloat type, translation of
which requires this extension
+
+; CHECK-NO-ATOM: RequiresExtension: Feature requires the following SPIR-V
extension:
+; CHECK-NO-ATOM-NEXT: SPV_INTEL_shader_atomic_bfloat16
+
+target datalayout =
"e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir64"
+
+@f = common dso_local local_unnamed_addr addrspace(1) global bfloat
0.000000e+00, align 8
+
+; Function Attrs: nounwind
+define dso_local spir_func void @test_atomicrmw_fadd() local_unnamed_addr #0 {
+entry:
+ %0 = atomicrmw fadd ptr addrspace(1) @f, bfloat 42.000000e+00 seq_cst
+
+ ret void
+}
+
+attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false"
"disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false"
"min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false"
"no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false"
"no-trapping-math"="false" "stack-protector-buffer-size"="8"
"unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.module.flags = !{!0}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16_dot.ll
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16_dot.ll
---
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16_dot.ll
2025-08-01 09:28:13.000000000 +0200
+++
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16_dot.ll
2025-09-29 12:53:11.000000000 +0200
@@ -20,9 +20,9 @@
; CHECK-LLVM: %addrB = alloca <2 x bfloat>
; CHECK-LLVM: %dataA = load <2 x bfloat>, ptr %addrA
; CHECK-LLVM: %dataB = load <2 x bfloat>, ptr %addrB
-; CHECK-LLVM: %call = call spir_func bfloat @_Z3dotDv2_u6__bf16S_(<2 x bfloat>
%dataA, <2 x bfloat> %dataB)
+; CHECK-LLVM: %call = call spir_func bfloat @_Z3dotDv2_DF16bS_(<2 x bfloat>
%dataA, <2 x bfloat> %dataB)
-declare spir_func bfloat @_Z3dotDv2_u6__bf16Dv2_S_(<2 x bfloat>, <2 x bfloat>)
+declare spir_func bfloat @_Z3dotDv2_DF16bDv2_S_(<2 x bfloat>, <2 x bfloat>)
define spir_kernel void @test() {
entry:
@@ -30,7 +30,7 @@
%addrB = alloca <2 x bfloat>
%dataA = load <2 x bfloat>, ptr %addrA
%dataB = load <2 x bfloat>, ptr %addrB
- %call = call spir_func bfloat @_Z3dotDv2_u6__bf16Dv2_S_(<2 x bfloat> %dataA,
<2 x bfloat> %dataB)
+ %call = call spir_func bfloat @_Z3dotDv2_DF16bDv2_S_(<2 x bfloat> %dataA, <2
x bfloat> %dataB)
ret void
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/KHR/SPV_KHR_bfloat16/cooperative_matrix_bfloat16.ll
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/KHR/SPV_KHR_bfloat16/cooperative_matrix_bfloat16.ll
---
old/SPIRV-LLVM-Translator-21.1.0/test/extensions/KHR/SPV_KHR_bfloat16/cooperative_matrix_bfloat16.ll
2025-08-01 09:28:13.000000000 +0200
+++
new/SPIRV-LLVM-Translator-21.1.1/test/extensions/KHR/SPV_KHR_bfloat16/cooperative_matrix_bfloat16.ll
2025-09-29 12:53:11.000000000 +0200
@@ -21,14 +21,14 @@
; CHECK-SPIRV-DAG: Constant [[#BFloatTy]] [[#]] 16256
; CHECK-SPIRV: CompositeConstruct [[#MatTy]]
-; CHECK-LLVM: call spir_func target("spirv.CooperativeMatrixKHR", bfloat, 3,
12, 12, 2) @_Z26__spirv_CompositeConstructu6__bf16(bfloat 0xR3F80)
+; CHECK-LLVM: call spir_func target("spirv.CooperativeMatrixKHR", bfloat, 3,
12, 12, 2) @_Z26__spirv_CompositeConstructDF16b(bfloat 0xR3F80)
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"
-declare spir_func target("spirv.CooperativeMatrixKHR", bfloat, 3, 12, 12, 2)
@_Z26__spirv_CompositeConstructu6__bf16(bfloat)
+declare spir_func target("spirv.CooperativeMatrixKHR", bfloat, 3, 12, 12, 2)
@_Z26__spirv_CompositeConstructDF16b(bfloat)
define spir_kernel void @test() {
- %mat = call spir_func target("spirv.CooperativeMatrixKHR", bfloat, 3, 12,
12, 2) @_Z26__spirv_CompositeConstructu6__bf16(bfloat 1.0)
+ %mat = call spir_func target("spirv.CooperativeMatrixKHR", bfloat, 3, 12,
12, 2) @_Z26__spirv_CompositeConstructDF16b(bfloat 1.0)
ret void
}