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-06-10 08:56:18
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/spirv-llvm-translator (Old)
 and      /work/SRC/openSUSE:Factory/.spirv-llvm-translator.new.19631 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "spirv-llvm-translator"

Tue Jun 10 08:56:18 2025 rev:21 rq:1283886 version:20.1.3

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/spirv-llvm-translator/spirv-llvm-translator.changes  
    2025-05-06 16:38:18.612345854 +0200
+++ 
/work/SRC/openSUSE:Factory/.spirv-llvm-translator.new.19631/spirv-llvm-translator.changes
   2025-06-10 08:56:39.390015477 +0200
@@ -1,0 +2,15 @@
+Sat Jun  7 15:55:24 UTC 2025 - Aaron Puchert <aaronpuch...@alice-dsl.net>
+
+- Update to version 20.1.3.
+  * Implement SPV_KHR_bfloat16 extension.
+  * Remove `Aligned 0` from tests.
+  * Rounding modes on int to int conversions are valid OpenCL C
+    builtin functions.
+  * Add reverse translation test for integer convert with explicit
+    rounding.
+  * Make OCLUtil.h compatible with C++20 standard.
+  * Missing addExtension in SPIRVWriter.cpp.
+  * Use native for the system separator for source path string in
+    debug info.
+
+-------------------------------------------------------------------

Old:
----
  SPIRV-LLVM-Translator-20.1.2.tar.gz

New:
----
  SPIRV-LLVM-Translator-20.1.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ spirv-llvm-translator.spec ++++++
--- /var/tmp/diff_new_pack.QLGXBa/_old  2025-06-10 08:56:40.042042410 +0200
+++ /var/tmp/diff_new_pack.QLGXBa/_new  2025-06-10 08:56:40.042042410 +0200
@@ -23,7 +23,7 @@
 
 %define sover   20
 Name:           spirv-llvm-translator
-Version:        20.1.2
+Version:        20.1.3
 Release:        0
 Summary:        LLVM/SPIR-V Bi-Directional Translator library
 License:        BSD-3-Clause

++++++ SPIRV-LLVM-Translator-20.1.2.tar.gz -> 
SPIRV-LLVM-Translator-20.1.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/include/LLVMSPIRVExtensions.inc 
new/SPIRV-LLVM-Translator-20.1.3/include/LLVMSPIRVExtensions.inc
--- old/SPIRV-LLVM-Translator-20.1.2/include/LLVMSPIRVExtensions.inc    
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/include/LLVMSPIRVExtensions.inc    
2025-05-15 10:45:53.000000000 +0200
@@ -77,3 +77,4 @@
 EXT(SPV_INTEL_bindless_images)
 EXT(SPV_INTEL_2d_block_io)
 EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate)
+EXT(SPV_KHR_bfloat16)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/Mangler/ManglingUtils.cpp 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/Mangler/ManglingUtils.cpp
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/Mangler/ManglingUtils.cpp        
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/Mangler/ManglingUtils.cpp        
2025-05-15 10:45:53.000000000 +0200
@@ -28,6 +28,7 @@
     "half",
     "float",
     "double",
+    "__bf16",
     "void",
     "...",
     "image1d_ro_t",
@@ -105,6 +106,7 @@
     "Dh",                                // HALF
     "f",                                 // FLOAT
     "d",                                 // DOUBLE
+    "u6__bf16",                          // __BF16
     "v",                                 // VOID
     "z",                                 // VarArg
     "14ocl_image1d_ro",                  // PRIMITIVE_IMAGE1D_RO_T
@@ -197,6 +199,7 @@
     SPIR12, // HALF
     SPIR12, // FLOAT
     SPIR12, // DOUBLE
+    SPIR12, // __BF16
     SPIR12, // VOID
     SPIR12, // VarArg
     SPIR12, // PRIMITIVE_IMAGE1D_RO_T
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/Mangler/ParameterType.h 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/Mangler/ParameterType.h
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/Mangler/ParameterType.h  
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/Mangler/ParameterType.h  
2025-05-15 10:45:53.000000000 +0200
@@ -45,6 +45,7 @@
   PRIMITIVE_HALF,
   PRIMITIVE_FLOAT,
   PRIMITIVE_DOUBLE,
+  PRIMITIVE_BFLOAT,
   PRIMITIVE_VOID,
   PRIMITIVE_VAR_ARG,
   PRIMITIVE_STRUCT_FIRST,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/OCLToSPIRV.cpp 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/OCLToSPIRV.cpp
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/OCLToSPIRV.cpp   2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/OCLToSPIRV.cpp   2025-05-15 
10:45:53.000000000 +0200
@@ -800,9 +800,6 @@
       OC = OpFConvert;
   }
 
-  if (!Rounding.empty() && (isa<IntegerType>(SrcTy) && IsTargetInt))
-    return;
-
   assert(CI->getCalledFunction() && "Unexpected indirect call");
   mutateCallInst(
       CI, getSPIRVFuncName(OC, "_R" + DestTy + VecSize + Sat + Rounding));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/OCLUtil.h 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/OCLUtil.h
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/OCLUtil.h        2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/OCLUtil.h        2025-05-15 
10:45:53.000000000 +0200
@@ -98,11 +98,19 @@
 // To avoid any inconsistence here, constants are explicitly initialized with
 // the corresponding constants from 'std::memory_order' enum.
 enum OCLMemOrderKind {
+#if __cplusplus >= 202002L
+  OCLMO_relaxed = std::memory_order_relaxed,
+  OCLMO_acquire = std::memory_order_acquire,
+  OCLMO_release = std::memory_order_release,
+  OCLMO_acq_rel = std::memory_order_acq_rel,
+  OCLMO_seq_cst = std::memory_order_seq_cst
+#else
   OCLMO_relaxed = std::memory_order::memory_order_relaxed,
   OCLMO_acquire = std::memory_order::memory_order_acquire,
   OCLMO_release = std::memory_order::memory_order_release,
   OCLMO_acq_rel = std::memory_order::memory_order_acq_rel,
   OCLMO_seq_cst = std::memory_order::memory_order_seq_cst
+#endif
 };
 
 enum IntelFPGAMemoryAccessesVal {
@@ -453,11 +461,12 @@
 template <typename T> std::string getFullPath(const T *Scope) {
   if (!Scope)
     return std::string();
-  std::string Filename = Scope->getFilename().str();
-  if (sys::path::is_absolute(Filename))
-    return Filename;
+  StringRef Filename = Scope->getFilename();
+  auto Style = sys::path::Style::native;
+  if (sys::path::is_absolute(Filename, Style))
+    return Filename.str();
   SmallString<16> DirName = Scope->getDirectory();
-  sys::path::append(DirName, sys::path::Style::posix, Filename);
+  sys::path::append(DirName, Style, Filename.str());
   return DirName.str().str();
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/SPIRVReader.cpp 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/SPIRVReader.cpp
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/SPIRVReader.cpp  2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/SPIRVReader.cpp  2025-05-15 
10:45:53.000000000 +0200
@@ -314,6 +314,8 @@
 Type *SPIRVToLLVM::transFPType(SPIRVType *T) {
   switch (T->getFloatBitWidth()) {
   case 16:
+    if (T->isTypeFloat(16, FPEncodingBFloat16KHR))
+      return Type::getBFloatTy(*Context);
     return Type::getHalfTy(*Context);
   case 32:
     return Type::getFloatTy(*Context);
@@ -1476,7 +1478,9 @@
       const llvm::fltSemantics *FS = nullptr;
       switch (BT->getFloatBitWidth()) {
       case 16:
-        FS = &APFloat::IEEEhalf();
+        FS =
+            (BT->isTypeFloat(16, FPEncodingBFloat16KHR) ? &APFloat::BFloat()
+                                                        : 
&APFloat::IEEEhalf());
         break;
       case 32:
         FS = &APFloat::IEEEsingle();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/SPIRVUtil.cpp 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/SPIRVUtil.cpp
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/SPIRVUtil.cpp    2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/SPIRVUtil.cpp    2025-05-15 
10:45:53.000000000 +0200
@@ -1338,6 +1338,8 @@
     return SPIR::RefParamType(new SPIR::PrimitiveType(SPIR::PRIMITIVE_FLOAT));
   if (Ty->isDoubleTy())
     return SPIR::RefParamType(new SPIR::PrimitiveType(SPIR::PRIMITIVE_DOUBLE));
+  if (Ty->isBFloatTy())
+    return SPIR::RefParamType(new SPIR::PrimitiveType(SPIR::PRIMITIVE_BFLOAT));
   if (auto *VecTy = dyn_cast<FixedVectorType>(Ty)) {
     return SPIR::RefParamType(new SPIR::VectorType(
         transTypeDesc(VecTy->getElementType(), Info), 
VecTy->getNumElements()));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/SPIRVWriter.cpp 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/SPIRVWriter.cpp
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/SPIRVWriter.cpp  2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/SPIRVWriter.cpp  2025-05-15 
10:45:53.000000000 +0200
@@ -397,6 +397,16 @@
     }
   }
 
+  if (T->isBFloatTy()) {
+    BM->getErrorLog().checkError(
+        BM->isAllowedToUseExtension(ExtensionID::SPV_KHR_bfloat16),
+        SPIRVEC_RequiresExtension,
+        "SPV_KHR_bfloat16\n"
+        "NOTE: LLVM module contains bfloat type, translation of which "
+        "requires this extension");
+    return mapType(T, BM->addFloatType(16, FPEncodingBFloat16KHR));
+  }
+
   if (T->isFloatingPointTy())
     return mapType(T, BM->addFloatType(T->getPrimitiveSizeInBits()));
 
@@ -3118,10 +3128,12 @@
           if (FMF.allowContract()) {
             M |= FPFastMathModeAllowContractFastINTELMask;
             BM->addCapability(CapabilityFPFastMathModeINTEL);
+            BM->addExtension(ExtensionID::SPV_INTEL_fp_fast_math_mode);
           }
           if (FMF.allowReassoc()) {
             M |= FPFastMathModeAllowReassocINTELMask;
             BM->addCapability(CapabilityFPFastMathModeINTEL);
+            BM->addExtension(ExtensionID::SPV_INTEL_fp_fast_math_mode);
           }
         }
       }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVEnum.h 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVEnum.h
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVEnum.h     
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVEnum.h     
2025-05-15 10:45:53.000000000 +0200
@@ -223,6 +223,9 @@
                {CapabilityCooperativeMatrixKHR});
   ADD_VEC_INIT(internal::CapabilityCooperativeMatrixOffsetInstructionsINTEL,
                {CapabilityCooperativeMatrixKHR});
+  ADD_VEC_INIT(CapabilityBFloat16DotProductKHR, {CapabilityBFloat16TypeKHR});
+  ADD_VEC_INIT(CapabilityBFloat16CooperativeMatrixKHR,
+               {CapabilityBFloat16TypeKHR, CapabilityCooperativeMatrixKHR});
 }
 
 template <> inline void SPIRVMap<SPIRVExecutionModelKind, SPIRVCapVec>::init() 
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVInstruction.h 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVInstruction.h
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVInstruction.h      
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVInstruction.h      
2025-05-15 10:45:53.000000000 +0200
@@ -779,6 +779,18 @@
       return VersionNumber::SPIRV_1_4;
     return VersionNumber::SPIRV_1_0;
   }
+  SPIRVCapVec getRequiredCapability() const override {
+    if (OpCode == OpDot) {
+      const SPIRVType *OpTy = getValueType(Ops[0]);
+      if (OpTy && OpTy->isTypeVector()) {
+        OpTy = OpTy->getVectorComponentType();
+        if (OpTy && OpTy->isTypeFloat(16, FPEncodingBFloat16KHR)) {
+          return getVec(CapabilityBFloat16DotProductKHR);
+        }
+      }
+    }
+    return SPIRVInstruction::getRequiredCapability();
+  }
 };
 
 template <Op OC>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVModule.cpp 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVModule.cpp
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVModule.cpp 
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVModule.cpp 
2025-05-15 10:45:53.000000000 +0200
@@ -253,7 +253,8 @@
   template <class T> T *addType(T *Ty);
   SPIRVTypeArray *addArrayType(SPIRVType *, SPIRVValue *) override;
   SPIRVTypeBool *addBoolType() override;
-  SPIRVTypeFloat *addFloatType(unsigned BitWidth) override;
+  SPIRVTypeFloat *addFloatType(unsigned BitWidth,
+                               unsigned FloatingPointEncoding) override;
   SPIRVTypeFunction *addFunctionType(SPIRVType *,
                                      const std::vector<SPIRVType *> &) 
override;
   SPIRVTypeInt *addIntegerType(unsigned BitWidth) override;
@@ -580,7 +581,8 @@
   SmallDenseMap<SPIRVStorageClassKind, SPIRVTypeUntypedPointerKHR *>
       UntypedPtrTyMap;
   SmallDenseMap<unsigned, SPIRVTypeInt *, 4> IntTypeMap;
-  SmallDenseMap<unsigned, SPIRVTypeFloat *, 4> FloatTypeMap;
+  SmallDenseMap<std::pair<unsigned, unsigned>, SPIRVTypeFloat *, 4>
+      FloatTypeMap;
   SmallDenseMap<std::pair<unsigned, SPIRVType *>, SPIRVTypePointer *, 4>
       PointerTypeMap;
   std::unordered_map<unsigned, SPIRVConstant *> LiteralMap;
@@ -1010,12 +1012,14 @@
   return addType(Ty);
 }
 
-SPIRVTypeFloat *SPIRVModuleImpl::addFloatType(unsigned BitWidth) {
-  auto Loc = FloatTypeMap.find(BitWidth);
+SPIRVTypeFloat *SPIRVModuleImpl::addFloatType(unsigned BitWidth,
+                                              unsigned FloatingPointEncoding) {
+  auto Desc = std::make_pair(BitWidth, FloatingPointEncoding);
+  auto Loc = FloatTypeMap.find(Desc);
   if (Loc != FloatTypeMap.end())
     return Loc->second;
-  auto *Ty = new SPIRVTypeFloat(this, getId(), BitWidth);
-  FloatTypeMap[BitWidth] = Ty;
+  auto *Ty = new SPIRVTypeFloat(this, getId(), BitWidth, 
FloatingPointEncoding);
+  FloatTypeMap[Desc] = Ty;
   return addType(Ty);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVModule.h 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVModule.h
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVModule.h   
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVModule.h   
2025-05-15 10:45:53.000000000 +0200
@@ -244,7 +244,7 @@
   // Type creation functions
   virtual SPIRVTypeArray *addArrayType(SPIRVType *, SPIRVValue *) = 0;
   virtual SPIRVTypeBool *addBoolType() = 0;
-  virtual SPIRVTypeFloat *addFloatType(unsigned) = 0;
+  virtual SPIRVTypeFloat *addFloatType(unsigned, unsigned = FPEncodingMax) = 0;
   virtual SPIRVTypeFunction *
   addFunctionType(SPIRVType *, const std::vector<SPIRVType *> &) = 0;
   virtual SPIRVTypeImage *addImageType(SPIRVType *,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h      
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h      
2025-05-15 10:45:53.000000000 +0200
@@ -641,6 +641,9 @@
   add(CapabilityFPGALatencyControlINTEL, "FPGALatencyControlINTEL");
   add(CapabilityFPMaxErrorINTEL, "FPMaxErrorINTEL");
   add(CapabilityRegisterLimitsINTEL, "RegisterLimitsINTEL");
+  add(CapabilityBFloat16TypeKHR, "BFloat16TypeKHR");
+  add(CapabilityBFloat16DotProductKHR, "BFloat16DotProductKHR");
+  add(CapabilityBFloat16CooperativeMatrixKHR, "BFloat16CooperativeMatrixKHR");
   add(CapabilityArithmeticFenceEXT, "ArithmeticFenceEXT");
   add(CapabilitySubgroup2DBlockIOINTEL, "Subgroup2DBlockIOINTEL");
   add(CapabilitySubgroup2DBlockTransformINTEL, 
"Subgroup2DBlockTransformINTEL");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVType.cpp 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVType.cpp
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVType.cpp   
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVType.cpp   
2025-05-15 10:45:53.000000000 +0200
@@ -166,8 +166,15 @@
          isTypeJointMatrixINTEL() || isTypeCooperativeMatrixKHR();
 }
 
-bool SPIRVType::isTypeFloat(unsigned Bits) const {
-  return isType<SPIRVTypeFloat>(this, Bits);
+bool SPIRVType::isTypeFloat(unsigned Bits,
+                            unsigned FloatingPointEncoding) const {
+  if (!isType<SPIRVTypeFloat>(this))
+    return false;
+  if (Bits == 0)
+    return true;
+  const auto *ThisFloat = static_cast<const SPIRVTypeFloat *>(this);
+  return ThisFloat->getBitWidth() == Bits &&
+         ThisFloat->getFloatingPointEncoding() == FloatingPointEncoding;
 }
 
 bool SPIRVType::isTypeOCLImage() const {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVType.h 
new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVType.h
--- old/SPIRV-LLVM-Translator-20.1.2/lib/SPIRV/libSPIRV/SPIRVType.h     
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/lib/SPIRV/libSPIRV/SPIRVType.h     
2025-05-15 10:45:53.000000000 +0200
@@ -84,7 +84,8 @@
   bool isTypeEvent() const;
   bool isTypeDeviceEvent() const;
   bool isTypeReserveId() const;
-  bool isTypeFloat(unsigned Bits = 0) const;
+  bool isTypeFloat(unsigned Bits = 0,
+                   unsigned FloatingPointEncoding = FPEncodingMax) const;
   bool isTypeImage() const;
   bool isTypeOCLImage() const;
   bool isTypePipe() const;
@@ -204,16 +205,31 @@
 public:
   static const Op OC = OpTypeFloat;
   // Complete constructor
-  SPIRVTypeFloat(SPIRVModule *M, SPIRVId TheId, unsigned TheBitWidth)
-      : SPIRVType(M, 3, OC, TheId), BitWidth(TheBitWidth) {}
+  SPIRVTypeFloat(SPIRVModule *M, SPIRVId TheId, unsigned TheBitWidth,
+                 unsigned TheFloatingPointEncoding)
+      : SPIRVType(M, 3 + (TheFloatingPointEncoding != FPEncodingMax), OC,
+                  TheId),
+        BitWidth(TheBitWidth), FloatingPointEncoding(TheFloatingPointEncoding) 
{
+  }
   // Incomplete constructor
-  SPIRVTypeFloat() : SPIRVType(OC), BitWidth(0) {}
+  SPIRVTypeFloat()
+      : SPIRVType(OC), BitWidth(0), FloatingPointEncoding(FPEncodingMax) {}
 
   unsigned getBitWidth() const { return BitWidth; }
 
+  unsigned getFloatingPointEncoding() const { return FloatingPointEncoding; }
+
+  std::optional<ExtensionID> getRequiredExtension() const override {
+    if (isTypeFloat(16, FPEncodingBFloat16KHR))
+      return ExtensionID::SPV_KHR_bfloat16;
+    return {};
+  }
+
   SPIRVCapVec getRequiredCapability() const override {
     SPIRVCapVec CV;
-    if (isTypeFloat(16)) {
+    if (isTypeFloat(16, FPEncodingBFloat16KHR)) {
+      CV.push_back(CapabilityBFloat16TypeKHR);
+    } else if (isTypeFloat(16)) {
       CV.push_back(CapabilityFloat16Buffer);
       auto Extensions = getModule()->getSourceExtension();
       if (std::any_of(Extensions.begin(), Extensions.end(),
@@ -225,14 +241,34 @@
   }
 
 protected:
-  _SPIRV_DEF_ENCDEC2(Id, BitWidth)
+  void encode(spv_ostream &O) const override {
+    assert(WordCount == 3 || WordCount == 4);
+    auto Encoder = getEncoder(O);
+    Encoder << Id << BitWidth;
+    if (WordCount == 4)
+      Encoder << FloatingPointEncoding;
+  }
+
+  void decode(std::istream &I) override {
+    assert(WordCount == 3 || WordCount == 4);
+    auto Decoder = getDecoder(I);
+    Decoder >> Id >> BitWidth;
+    if (WordCount == 4)
+      Decoder >> FloatingPointEncoding;
+  }
+
   void validate() const override {
     SPIRVEntry::validate();
     assert(BitWidth >= 16 && BitWidth <= 64 && "Invalid bit width");
+    assert(
+        (FloatingPointEncoding == FPEncodingMax ||
+         (BitWidth == 16 && FloatingPointEncoding == FPEncodingBFloat16KHR)) &&
+        "Invalid floating point encoding");
   }
 
 private:
   unsigned BitWidth; // Bit width
+  unsigned FloatingPointEncoding;
 };
 
 template <Op TheOpCode = OpTypePointer, SPIRVWord WC = 3>
@@ -1186,7 +1222,10 @@
     return ExtensionID::SPV_KHR_cooperative_matrix;
   }
   SPIRVCapVec getRequiredCapability() const override {
-    return getVec(CapabilityCooperativeMatrixKHR);
+    auto CV = getVec(CapabilityCooperativeMatrixKHR);
+    if (CompType->isTypeFloat(16, FPEncodingBFloat16KHR))
+      CV.push_back(CapabilityBFloat16CooperativeMatrixKHR);
+    return CV;
   }
 
   SPIRVType *getCompType() const { return CompType; }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SPIRV-LLVM-Translator-20.1.2/spirv-headers-tag.conf 
new/SPIRV-LLVM-Translator-20.1.3/spirv-headers-tag.conf
--- old/SPIRV-LLVM-Translator-20.1.2/spirv-headers-tag.conf     2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/spirv-headers-tag.conf     2025-05-15 
10:45:53.000000000 +0200
@@ -1 +1 @@
-2b2e05e088841c63c0b6fd4c9fb380d8688738d3
+0e710677989b4326ac974fd80c5308191ed80965
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/DebugInfo/LocalAddressSpace.ll 
new/SPIRV-LLVM-Translator-20.1.3/test/DebugInfo/LocalAddressSpace.ll
--- old/SPIRV-LLVM-Translator-20.1.2/test/DebugInfo/LocalAddressSpace.ll        
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/test/DebugInfo/LocalAddressSpace.ll        
2025-05-15 10:45:53.000000000 +0200
@@ -22,7 +22,7 @@
 ; CHECK: DW_TAG_variable
 ; CHECK-NEXT: DW_AT_name {{.*}} = "a")
 ; CHECK-NEXT: DW_AT_type {{.*}} "int")
-; CHECK-NEXT: DW_AT_decl_file {{.*}} ("/work/tmp{{[/\\]}}tmp.cl")
+; CHECK-NEXT: DW_AT_decl_file {{.*}} ("/work{{[/\\]}}tmp{{[/\\]}}tmp.cl")
 ; CHECK-NEXT: DW_AT_decl_line {{.*}} (2)
 ; CHECK-NEXT: DW_AT_location [DW_FORM_exprloc]      (DW_OP_addr 0x0)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/DebugInfo/RelativeSrcPath.ll 
new/SPIRV-LLVM-Translator-20.1.3/test/DebugInfo/RelativeSrcPath.ll
--- old/SPIRV-LLVM-Translator-20.1.2/test/DebugInfo/RelativeSrcPath.ll  
1970-01-01 01:00:00.000000000 +0100
+++ new/SPIRV-LLVM-Translator-20.1.3/test/DebugInfo/RelativeSrcPath.ll  
2025-05-15 10:45:53.000000000 +0200
@@ -0,0 +1,61 @@
+; Source:
+; __kernel void foo(__global int *a, __global int *b) {
+;   a[0] += b[0];
+; }
+
+; Command:
+; clang -cc1 -triple spir -O0 -debug-info-kind=line-tables-only -emit-llvm -o 
RelativeSrcPath.ll RelativeSrcPath.cl
+
+; Directory: /tmp
+
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc -spirv-text -o - | FileCheck %s
+
+; ModuleID = 'RelativeSrcPath.cl'
+source_filename = "RelativeSrcPath.cl"
+target datalayout = 
"e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir"
+
+; Function Attrs: convergent noinline nounwind optnone
+define spir_kernel void @foo(ptr addrspace(1) %a, ptr addrspace(1) %b) #0 !dbg 
!8 !kernel_arg_addr_space !11 !kernel_arg_access_qual !12 !kernel_arg_type !13 
!kernel_arg_base_type !13 !kernel_arg_type_qual !14 {
+entry:
+  %a.addr = alloca ptr addrspace(1), align 4
+  %b.addr = alloca ptr addrspace(1), align 4
+  store ptr addrspace(1) %a, ptr %a.addr, align 4
+  store ptr addrspace(1) %b, ptr %b.addr, align 4
+  %0 = load ptr addrspace(1), ptr %b.addr, align 4, !dbg !15
+  %1 = load i32, ptr addrspace(1) %0, align 4, !dbg !15
+  %2 = load ptr addrspace(1), ptr %a.addr, align 4, !dbg !15
+  %3 = load i32, ptr addrspace(1) %2, align 4, !dbg !15
+  %add = add nsw i32 %3, %1, !dbg !15
+  store i32 %add, ptr addrspace(1) %2, align 4, !dbg !15
+  ret void, !dbg !16
+}
+
+attributes #0 = { convergent noinline nounwind optnone 
"correctly-rounded-divide-sqrt-fp-math"="false" "denorms-are-zero"="false" 
"disable-tail-calls"="false" "less-precise-fpmad"="false" 
"no-frame-pointer-elim"="false" "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" "uniform-work-group-size"="true" 
"unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4}
+!opencl.ocl.version = !{!5}
+!opencl.spir.version = !{!6}
+!llvm.ident = !{!7}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang 
version 8.0.0 (cfe/trunk)", isOptimized: false, runtimeVersion: 0, 
emissionKind: LineTablesOnly, enums: !2, nameTableKind: None)
+!1 = !DIFile(filename: "<stdin>", directory: "/tmp")
+!2 = !{}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = !{i32 1, !"wchar_size", i32 4}
+!5 = !{i32 1, i32 0}
+!6 = !{i32 1, i32 2}
+!7 = !{!"clang version 8.0.0 (cfe/trunk)"}
+!8 = distinct !DISubprogram(name: "foo", scope: !9, file: !9, line: 1, type: 
!10, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, 
isOptimized: false, unit: !0, retainedNodes: !2)
+; CHECK: String [[ID:[0-9]+]] "/tmp{{[/\\]}}RelativeSrcPath.cl"
+; CHECK: Line [[ID]]
+!9 = !DIFile(filename: "RelativeSrcPath.cl", directory: "/tmp")
+!10 = !DISubroutineType(types: !2)
+!11 = !{i32 1, i32 1}
+!12 = !{!"none", !"none"}
+!13 = !{!"int*", !"int*"}
+!14 = !{!"", !""}
+!15 = !DILocation(line: 2, scope: !8)
+!16 = !DILocation(line: 3, scope: !8)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/OpLoopMergeNone.spt 
new/SPIRV-LLVM-Translator-20.1.3/test/OpLoopMergeNone.spt
--- old/SPIRV-LLVM-Translator-20.1.2/test/OpLoopMergeNone.spt   2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/test/OpLoopMergeNone.spt   2025-05-15 
10:45:53.000000000 +0200
@@ -39,7 +39,7 @@
 2 Label 20
 4 Variable 18 26 7
 4 Variable 18 27 7
-6 Load 9 21 7 2 0
+4 Load 9 21 7
 5 CompositeExtract 8 22 21 0
 5 ShiftLeftLogical 8 23 22 11
 5 ShiftRightArithmetic 8 24 23 11
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SPIRV-LLVM-Translator-20.1.2/test/RelativeSrcPath.ll 
new/SPIRV-LLVM-Translator-20.1.3/test/RelativeSrcPath.ll
--- old/SPIRV-LLVM-Translator-20.1.2/test/RelativeSrcPath.ll    2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/test/RelativeSrcPath.ll    1970-01-01 
01:00:00.000000000 +0100
@@ -1,61 +0,0 @@
-; Source:
-; __kernel void foo(__global int *a, __global int *b) {
-;   a[0] += b[0];
-; }
-
-; Command:
-; clang -cc1 -triple spir -O0 -debug-info-kind=line-tables-only -emit-llvm -o 
RelativeSrcPath.ll RelativeSrcPath.cl
-
-; Directory: /tmp
-
-; RUN: llvm-as %s -o %t.bc
-; RUN: llvm-spirv %t.bc -spirv-text -o - | FileCheck %s
-
-; ModuleID = 'RelativeSrcPath.cl'
-source_filename = "RelativeSrcPath.cl"
-target datalayout = 
"e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
-target triple = "spir"
-
-; Function Attrs: convergent noinline nounwind optnone
-define spir_kernel void @foo(ptr addrspace(1) %a, ptr addrspace(1) %b) #0 !dbg 
!8 !kernel_arg_addr_space !11 !kernel_arg_access_qual !12 !kernel_arg_type !13 
!kernel_arg_base_type !13 !kernel_arg_type_qual !14 {
-entry:
-  %a.addr = alloca ptr addrspace(1), align 4
-  %b.addr = alloca ptr addrspace(1), align 4
-  store ptr addrspace(1) %a, ptr %a.addr, align 4
-  store ptr addrspace(1) %b, ptr %b.addr, align 4
-  %0 = load ptr addrspace(1), ptr %b.addr, align 4, !dbg !15
-  %1 = load i32, ptr addrspace(1) %0, align 4, !dbg !15
-  %2 = load ptr addrspace(1), ptr %a.addr, align 4, !dbg !15
-  %3 = load i32, ptr addrspace(1) %2, align 4, !dbg !15
-  %add = add nsw i32 %3, %1, !dbg !15
-  store i32 %add, ptr addrspace(1) %2, align 4, !dbg !15
-  ret void, !dbg !16
-}
-
-attributes #0 = { convergent noinline nounwind optnone 
"correctly-rounded-divide-sqrt-fp-math"="false" "denorms-are-zero"="false" 
"disable-tail-calls"="false" "less-precise-fpmad"="false" 
"no-frame-pointer-elim"="false" "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" "uniform-work-group-size"="true" 
"unsafe-fp-math"="false" "use-soft-float"="false" }
-
-!llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!3, !4}
-!opencl.ocl.version = !{!5}
-!opencl.spir.version = !{!6}
-!llvm.ident = !{!7}
-
-!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang 
version 8.0.0 (cfe/trunk)", isOptimized: false, runtimeVersion: 0, 
emissionKind: LineTablesOnly, enums: !2, nameTableKind: None)
-!1 = !DIFile(filename: "<stdin>", directory: "/tmp")
-!2 = !{}
-!3 = !{i32 2, !"Debug Info Version", i32 3}
-!4 = !{i32 1, !"wchar_size", i32 4}
-!5 = !{i32 1, i32 0}
-!6 = !{i32 1, i32 2}
-!7 = !{!"clang version 8.0.0 (cfe/trunk)"}
-!8 = distinct !DISubprogram(name: "foo", scope: !9, file: !9, line: 1, type: 
!10, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, 
isOptimized: false, unit: !0, retainedNodes: !2)
-; CHECK: String [[ID:[0-9]+]] "/tmp/RelativeSrcPath.cl"
-; CHECK: Line [[ID]]
-!9 = !DIFile(filename: "RelativeSrcPath.cl", directory: "/tmp")
-!10 = !DISubroutineType(types: !2)
-!11 = !{i32 1, i32 1}
-!12 = !{!"none", !"none"}
-!13 = !{!"int*", !"int*"}
-!14 = !{!"", !""}
-!15 = !DILocation(line: 2, scope: !8)
-!16 = !DILocation(line: 3, scope: !8)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/composite_construct_struct.spt 
new/SPIRV-LLVM-Translator-20.1.3/test/composite_construct_struct.spt
--- old/SPIRV-LLVM-Translator-20.1.2/test/composite_construct_struct.spt        
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/test/composite_construct_struct.spt        
2025-05-15 10:45:53.000000000 +0200
@@ -37,7 +37,7 @@
 2 Label 21
 5 CompositeConstruct 11 22 16 17
 5 CompositeConstruct 12 23 20 22
-6 Load 5 24 3 2 0
+4 Load 5 24 3
 5 CompositeExtract 4 25 24 0
 5 ShiftLeftLogical 4 26 25 15
 5 ShiftRightArithmetic 4 27 26 15
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/composite_construct_vector.spt 
new/SPIRV-LLVM-Translator-20.1.3/test/composite_construct_vector.spt
--- old/SPIRV-LLVM-Translator-20.1.2/test/composite_construct_vector.spt        
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/test/composite_construct_vector.spt        
2025-05-15 10:45:53.000000000 +0200
@@ -30,7 +30,7 @@
 3 FunctionParameter 10 2
 
 2 Label 17
-6 Load 5 18 3 2 0
+4 Load 5 18 3
 5 CompositeExtract 4 19 18 0
 5 ShiftLeftLogical 4 20 19 12
 5 ShiftRightArithmetic 4 21 20 12
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SPIRV-LLVM-Translator-20.1.2/test/copy_object.spt 
new/SPIRV-LLVM-Translator-20.1.3/test/copy_object.spt
--- old/SPIRV-LLVM-Translator-20.1.2/test/copy_object.spt       2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/test/copy_object.spt       2025-05-15 
10:45:53.000000000 +0200
@@ -27,7 +27,7 @@
 3 FunctionParameter 9 2
 
 2 Label 13
-6 Load 5 14 3 2 0
+4 Load 5 14 3
 5 CompositeExtract 4 15 14 0
 5 ShiftLeftLogical 4 16 15 11
 5 ShiftRightArithmetic 4 17 16 11
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16.ll
 
new/SPIRV-LLVM-Translator-20.1.3/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16.ll
--- 
old/SPIRV-LLVM-Translator-20.1.2/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16.ll
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/SPIRV-LLVM-Translator-20.1.3/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16.ll
   2025-05-15 10:45:53.000000000 +0200
@@ -0,0 +1,36 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_KHR_bfloat16 -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 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
+
+; CHECK-ERROR: RequiresExtension: Feature requires the following SPIR-V 
extension:
+; CHECK-ERROR-NEXT: SPV_KHR_bfloat16
+; CHECK-ERROR-NEXT: NOTE: LLVM module contains bfloat type, translation of 
which
+; CHECK-ERROR-SAME: requires this 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-DAG: Capability BFloat16TypeKHR
+; CHECK-SPIRV-DAG: Extension "SPV_KHR_bfloat16"
+; CHECK-SPIRV: 4 TypeFloat [[BFLOAT:[0-9]+]] 16 0
+; CHECK-SPIRV: 4 TypeVector [[#]] [[BFLOAT]] 2
+
+; CHECK-LLVM: [[ADDR1:]] = alloca bfloat
+; CHECK-LLVM: [[ADDR2:]] = alloca <2 x bfloat>
+; CHECK-LLVM: [[DATA1:]] = load bfloat, ptr [[ADDR1]]
+; CHECK-LLVM: [[DATA2:]] = load <2 x bfloat>, ptr [[ADDR2]]
+
+define spir_kernel void @test() {
+entry:
+  %addr1 = alloca bfloat
+  %addr2 = alloca <2 x bfloat>
+  %data1 = load bfloat, ptr %addr1
+  %data2 = load <2 x bfloat>, ptr %addr2
+  ret void
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16_dot.ll
 
new/SPIRV-LLVM-Translator-20.1.3/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16_dot.ll
--- 
old/SPIRV-LLVM-Translator-20.1.2/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16_dot.ll
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/SPIRV-LLVM-Translator-20.1.3/test/extensions/KHR/SPV_KHR_bfloat16/bfloat16_dot.ll
       2025-05-15 10:45:53.000000000 +0200
@@ -0,0 +1,39 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_KHR_bfloat16 -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
+
+source_filename = "bfloat16_dot.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-DAG: Capability BFloat16TypeKHR
+; CHECK-SPIRV-DAG: Capability BFloat16DotProductKHR
+; CHECK-SPIRV-DAG: Extension "SPV_KHR_bfloat16"
+; CHECK-SPIRV: 4 TypeFloat [[BFLOAT:[0-9]+]] 16 0
+; CHECK-SPIRV: 4 TypeVector [[#]] [[BFLOAT]] 2
+; CHECK-SPIRV: Dot
+
+; CHECK-LLVM: %addrA = alloca <2 x bfloat>
+; 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)
+
+declare spir_func bfloat @_Z3dotDv2_u6__bf16Dv2_S_(<2 x bfloat>, <2 x bfloat>)
+
+define spir_kernel void @test() {
+entry:
+  %addrA = alloca <2 x bfloat>
+  %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)
+  ret void
+}
+
+!opencl.ocl.version = !{!7}
+
+!7 = !{i32 2, i32 0}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/extensions/KHR/SPV_KHR_bfloat16/cooperative_matrix_bfloat16.ll
 
new/SPIRV-LLVM-Translator-20.1.3/test/extensions/KHR/SPV_KHR_bfloat16/cooperative_matrix_bfloat16.ll
--- 
old/SPIRV-LLVM-Translator-20.1.2/test/extensions/KHR/SPV_KHR_bfloat16/cooperative_matrix_bfloat16.ll
        1970-01-01 01:00:00.000000000 +0100
+++ 
new/SPIRV-LLVM-Translator-20.1.3/test/extensions/KHR/SPV_KHR_bfloat16/cooperative_matrix_bfloat16.ll
        2025-05-15 10:45:53.000000000 +0200
@@ -0,0 +1,34 @@
+; RUN: llvm-as < %s -o %t.bc
+; RUN: llvm-spirv %t.bc 
--spirv-ext=+SPV_KHR_cooperative_matrix,+SPV_KHR_bfloat16 -o %t.spv
+; RUN: llvm-spirv %t.spv -to-text -o %t.spt
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
+
+; RUN: llvm-spirv --spirv-ext=+SPV_KHR_cooperative_matrix,+SPV_KHR_bfloat16 -r 
%t.spv -o %t.rev.bc
+; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
+
+; CHECK-SPIRV-DAG: Capability CooperativeMatrixKHR
+; CHECK-SPIRV-DAG: Capability BFloat16TypeKHR
+; CHECK-SPIRV-DAG: Capability BFloat16CooperativeMatrixKHR
+; CHECK-SPIRV-DAG: Extension "SPV_KHR_cooperative_matrix"
+; CHECK-SPIRV-DAG: Extension "SPV_KHR_bfloat16"
+
+; CHECK-SPIRV-DAG: 4 TypeFloat [[#BFloatTy:]] 16 0
+; CHECK-SPIRV-DAG: TypeInt [[#Int32Ty:]] 32 0
+; CHECK-SPIRV-DAG: Constant [[#Int32Ty]] [[#Const12:]] 12
+; CHECK-SPIRV-DAG: Constant [[#Int32Ty]] [[#Const3:]] 3
+; CHECK-SPIRV-DAG: Constant [[#Int32Ty]] [[#Const2:]] 2
+; CHECK-SPIRV-DAG: TypeCooperativeMatrixKHR [[#MatTy:]] [[#BFloatTy]] 
[[#Const3]] [[#Const12]] [[#Const12]] [[#Const2]]
+; 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)
+
+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)
+
+define spir_kernel void @test() {
+  %mat = call spir_func target("spirv.CooperativeMatrixKHR", bfloat, 3, 12, 
12, 2) @_Z26__spirv_CompositeConstructu6__bf16(bfloat 1.0)
+  ret void
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/negative/SPV_INTEL_bfloat16_conversion/f2bf16_inval_output_ty.spt
 
new/SPIRV-LLVM-Translator-20.1.3/test/negative/SPV_INTEL_bfloat16_conversion/f2bf16_inval_output_ty.spt
--- 
old/SPIRV-LLVM-Translator-20.1.2/test/negative/SPV_INTEL_bfloat16_conversion/f2bf16_inval_output_ty.spt
     2025-04-10 14:21:56.000000000 +0200
+++ 
new/SPIRV-LLVM-Translator-20.1.3/test/negative/SPV_INTEL_bfloat16_conversion/f2bf16_inval_output_ty.spt
     2025-05-15 10:45:53.000000000 +0200
@@ -18,7 +18,7 @@
 
 6 Decorate 4 LinkageAttributes "_Z1f" Export
 4 Decorate 8 Alignment 4
-4 TypeFloat 10 16
+3 TypeFloat 10 16
 2 TypeVoid 2
 3 TypeFunction 3 2
 3 TypeFloat 6 32
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/SPIRV-LLVM-Translator-20.1.2/test/right_shift.spt 
new/SPIRV-LLVM-Translator-20.1.3/test/right_shift.spt
--- old/SPIRV-LLVM-Translator-20.1.2/test/right_shift.spt       2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/test/right_shift.spt       2025-05-15 
10:45:53.000000000 +0200
@@ -31,7 +31,7 @@
 3 FunctionParameter 10 2
 
 2 Label 17
-6 Load 5 18 3 2 0
+4 Load 5 18 3
 5 CompositeExtract 4 19 18 0
 5 ShiftRightArithmetic 4 20 19 12
 5 ShiftLeftLogical 4 21 20 25
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/selection_merge.spt 
new/SPIRV-LLVM-Translator-20.1.3/test/selection_merge.spt
--- old/SPIRV-LLVM-Translator-20.1.2/test/selection_merge.spt   2025-04-10 
14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/test/selection_merge.spt   2025-05-15 
10:45:53.000000000 +0200
@@ -35,7 +35,7 @@
 
 2 Label 18
 4 Variable 16 27 7
-6 Load 8 19 6 2 0
+4 Load 8 19 6
 5 CompositeExtract 7 20 19 0
 5 ShiftLeftLogical 7 21 20 13
 5 ShiftRightArithmetic 7 22 21 13
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/transcoding/OpenCL/convert_functions.ll 
new/SPIRV-LLVM-Translator-20.1.3/test/transcoding/OpenCL/convert_functions.ll
--- 
old/SPIRV-LLVM-Translator-20.1.2/test/transcoding/OpenCL/convert_functions.ll   
    2025-04-10 14:21:56.000000000 +0200
+++ 
new/SPIRV-LLVM-Translator-20.1.3/test/transcoding/OpenCL/convert_functions.ll   
    2025-05-15 10:45:53.000000000 +0200
@@ -14,9 +14,11 @@
 ; CHECK-SPIRV: Name [[#Func1:]] "_Z20convert_uint_satfunc"
 ; CHECK-SPIRV: Name [[#Func2:]] "_Z21convert_float_rtzfunc"
 ; CHECK-SPIRV-DAG: TypeVoid [[#VoidTy:]]
+; CHECK-SPIRV-DAG: TypeInt [[#CharTy:]] 8
 ; CHECK-SPIRV-DAG: TypeFloat [[#FloatTy:]] 32
 
 ; CHECK-SPIRV: Function [[#VoidTy]] [[#Func]]
+; CHECK-SPIRV: SConvert [[#CharTy]] [[#ConvertId:]] [[#]]
 ; CHECK-SPIRV: ConvertSToF [[#FloatTy]] [[#ConvertId:]] [[#]]
 ; CHECK-SPIRV: FunctionCall [[#VoidTy]] [[#]] [[#Func]] [[#ConvertId]]
 ; CHECK-SPIRV: FunctionCall [[#VoidTy]] [[#]] [[#Func1]] [[#]]
@@ -51,6 +53,11 @@
   %x.addr = alloca i32, align 4
   store i32 %x, ptr %x.addr, align 4
   %0 = load i32, ptr %x.addr, align 4
+; We don't get the convert_char_rtei back, but that's fine because they are
+; functionally equivalent anyway. The rounding information is lost when
+; translating to SPIR-V.
+; CHECK-LLVM: call spir_func i8 @_Z12convert_chari(i32 %[[#]])
+  call spir_func signext i8 @_Z16convert_char_rtei(i32 noundef %0) #1
 ; CHECK-LLVM: %[[Call:[a-z]+]] = sitofp i32 %[[#]] to float
 ; CHECK-LLVM: call spir_func void @_Z18convert_float_func(float %[[Call]])
 ; CHECK-LLVM: call spir_func void @_Z20convert_uint_satfunc(i32 %[[#]])
@@ -63,6 +70,9 @@
 }
 
 ; Function Attrs: convergent nounwind willreturn memory(none)
+declare spir_func signext i8 @_Z16convert_char_rtei(i32 noundef) #1
+
+; Function Attrs: convergent nounwind willreturn memory(none)
 declare spir_func float @_Z13convert_floati(i32 noundef) #1
 
 attributes #0 = { convergent nounwind }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/SPIRV-LLVM-Translator-20.1.2/test/vector_times_scalar.spt 
new/SPIRV-LLVM-Translator-20.1.3/test/vector_times_scalar.spt
--- old/SPIRV-LLVM-Translator-20.1.2/test/vector_times_scalar.spt       
2025-04-10 14:21:56.000000000 +0200
+++ new/SPIRV-LLVM-Translator-20.1.3/test/vector_times_scalar.spt       
2025-05-15 10:45:53.000000000 +0200
@@ -34,7 +34,7 @@
 3 FunctionParameter 13 4 
 
 2 Label 17 
-6 Load 8 18 6 2 0 
+4 Load 8 18 6
 5 CompositeExtract 7 19 18 0 
 5 ShiftLeftLogical 7 20 19 10 
 5 ShiftRightArithmetic 7 21 20 10 

Reply via email to