Package: spirv-tools
Version: 2026.3~rc1-1
Severity: normal
Tags: patch upstream

Dear Maintainer,

SPIRV-Tools 2026.3~rc1 does not fully handle the renamed
OpCooperativeMatrixReduceEXT instruction.

This became apparent when building SPIRV-Tools against a newer upstream
version of SPIR-V Headers. The newer headers define opcode 5366 as:

    OpCooperativeMatrixReduceEXT = 5366

with OpCooperativeMatrixReduceNV retained as an alias.

By contrast, the Debian-installed spirv-headers package
(1.6.1+1.4.357.0-1) still exposes the opcode primarily under the
OpCooperativeMatrixReduceNV name.

Parts of SPIRV-Tools 2026.3~rc1 still refer to opcode 5366 using the
obsolete OpCooperativeMatrixReduceNV name. This becomes a problem when
using the newer upstream SPIR-V Headers.

The issue is tracked upstream as SPIRV-Tools issue #6850:

https://github.com/KhronosGroup/SPIRV-Tools/issues/6850

I have attached a patch which updates the affected SPIRV-Tools code
from OpCooperativeMatrixReduceNV to OpCooperativeMatrixReduceEXT and
updates the corresponding validator regression tests.

The patch updates:

    source/operand.cpp
    source/opt/ir_context.cpp
    source/val/validate_arithmetics.cpp
    source/val/validate_function.cpp
    test/val/val_arithmetics_test.cpp

The patch is not architecture-specific.

Regards,
Jeroen Diederen

-- System Information:
Debian Release: forky/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: ppc64

Kernel: Linux 6.8.0-138-generic (SMP w/8 CPU threads; PREEMPT)
Locale: LANG=C, LC_CTYPE=C.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: unable to detect

Versions of packages spirv-tools depends on:
ii  libc6       2.43-3
ii  libstdc++6  16.2.0-1

spirv-tools recommends no packages.

spirv-tools suggests no packages.

-- no debconf information
Description: Fix CooperativeMatrixReduce opcode rename to EXT
 Update SPIR-V Tools validation and operand handling from the obsolete
 CooperativeMatrixReduceNV opcode to CooperativeMatrixReduceEXT, and update
 the corresponding validator regression tests.
Bug: https://github.com/KhronosGroup/SPIRV-Tools/issues/6850
Forwarded: yes

Index: spirv-tools-debian-fixed/source/operand.cpp
===================================================================
--- spirv-tools-debian-fixed.orig/source/operand.cpp
+++ spirv-tools-debian-fixed/source/operand.cpp
@@ -583,7 +583,7 @@ std::function<bool(unsigned)> spvOperand
     case spv::Op::OpCooperativeMatrixPerElementOpNV:
       out = [](unsigned index) { return index == 3; };
       break;
-    case spv::Op::OpCooperativeMatrixReduceNV:
+    case spv::Op::OpCooperativeMatrixReduceEXT:
       out = [](unsigned index) { return index == 4; };
       break;
     case spv::Op::OpCooperativeMatrixLoadTensorNV:
Index: spirv-tools-debian-fixed/source/opt/ir_context.cpp
===================================================================
--- spirv-tools-debian-fixed.orig/source/opt/ir_context.cpp
+++ spirv-tools-debian-fixed/source/opt/ir_context.cpp
@@ -975,7 +975,7 @@ void IRContext::AddCalls(const Function*
         todo->push(ii->GetSingleWordInOperand(0));
       if (ii->opcode() == spv::Op::OpCooperativeMatrixPerElementOpNV)
         todo->push(ii->GetSingleWordInOperand(1));
-      if (ii->opcode() == spv::Op::OpCooperativeMatrixReduceNV)
+      if (ii->opcode() == spv::Op::OpCooperativeMatrixReduceEXT)
         todo->push(ii->GetSingleWordInOperand(2));
       if (ii->opcode() == spv::Op::OpCooperativeMatrixLoadTensorNV) {
         const auto memory_operands_index = 3;
Index: spirv-tools-debian-fixed/source/val/validate_arithmetics.cpp
===================================================================
--- spirv-tools-debian-fixed.orig/source/val/validate_arithmetics.cpp
+++ spirv-tools-debian-fixed/source/val/validate_arithmetics.cpp
@@ -715,7 +715,7 @@ spv_result_t ValidateCooperativeMatrixMu
   return SPV_SUCCESS;
 }
 
-spv_result_t ValidateCooperativeMatrixReduceNV(ValidationState_t& _,
+spv_result_t ValidateCooperativeMatrixReduceEXT(ValidationState_t& _,
                                                const Instruction* inst) {
   const spv::Op opcode = inst->opcode();
   const uint32_t result_type = inst->type_id();
@@ -884,8 +884,8 @@ spv_result_t ArithmeticsPass(ValidationS
       return ValidateCooperativeMatrixMulAddNV(_, inst);
     case spv::Op::OpCooperativeMatrixMulAddKHR:
       return ValidateCooperativeMatrixMulAddKHR(_, inst);
-    case spv::Op::OpCooperativeMatrixReduceNV:
-      return ValidateCooperativeMatrixReduceNV(_, inst);
+    case spv::Op::OpCooperativeMatrixReduceEXT:
+      return ValidateCooperativeMatrixReduceEXT(_, inst);
 
     case spv::Op::OpSpecConstantOp: {
       switch (inst->GetOperandAs<spv::Op>(2u)) {
Index: spirv-tools-debian-fixed/source/val/validate_function.cpp
===================================================================
--- spirv-tools-debian-fixed.orig/source/val/validate_function.cpp
+++ spirv-tools-debian-fixed/source/val/validate_function.cpp
@@ -88,7 +88,7 @@ spv_result_t ValidateFunction(Validation
       spv::Op::OpGetKernelMaxNumSubgroups,
       spv::Op::OpName,
       spv::Op::OpCooperativeMatrixPerElementOpNV,
-      spv::Op::OpCooperativeMatrixReduceNV,
+      spv::Op::OpCooperativeMatrixReduceEXT,
       spv::Op::OpCooperativeMatrixLoadTensorNV,
       spv::Op::OpConditionalEntryPointINTEL,
       spv::Op::OpConstantFunctionPointerINTEL};
Index: spirv-tools-debian-fixed/test/val/val_arithmetics_test.cpp
===================================================================
--- spirv-tools-debian-fixed.orig/test/val/val_arithmetics_test.cpp
+++ spirv-tools-debian-fixed/test/val/val_arithmetics_test.cpp
@@ -1881,11 +1881,11 @@ OpFunctionEnd
 
   )";
   const std::string body = R"(
-%val1 = OpCooperativeMatrixReduceNV %f16matC8 %f16mat_C_1 2x2 %reducefunc
-%val2 = OpCooperativeMatrixReduceNV %f16matC16x8 %f16mat_C_1 Row %reducefunc
-%val3 = OpCooperativeMatrixReduceNV %f16matC8x16 %f16mat_C_1 Column %reducefunc
-%val4 = OpCooperativeMatrixReduceNV %f16matC %f16mat_C_1 Row|Column %reducefunc
-%val5 = OpCooperativeMatrixReduceNV %f16matC8 %f16mat_C_1 Row|Column 
%reducefunc
+%val1 = OpCooperativeMatrixReduceEXT %f16matC8 %f16mat_C_1 2x2 %reducefunc
+%val2 = OpCooperativeMatrixReduceEXT %f16matC16x8 %f16mat_C_1 Row %reducefunc
+%val3 = OpCooperativeMatrixReduceEXT %f16matC8x16 %f16mat_C_1 Column 
%reducefunc
+%val4 = OpCooperativeMatrixReduceEXT %f16matC %f16mat_C_1 Row|Column 
%reducefunc
+%val5 = OpCooperativeMatrixReduceEXT %f16matC8 %f16mat_C_1 Row|Column 
%reducefunc
 )";
 
   CompileSuccessfully(GenerateCoopMatKHRCode(extra_types, body).c_str(),
@@ -1907,7 +1907,7 @@ OpFunctionEnd
 
   )";
   const std::string body = R"(
-%val1 = OpCooperativeMatrixReduceNV %f16matC %f16mat_C_1 2x2 %reducefunc
+%val1 = OpCooperativeMatrixReduceEXT %f16matC %f16mat_C_1 2x2 %reducefunc
 )";
 
   CompileSuccessfully(GenerateCoopMatKHRCode(extra_types, body).c_str(),
@@ -1916,7 +1916,7 @@ OpFunctionEnd
             ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
   EXPECT_THAT(getDiagnosticString(),
               HasSubstr("For Reduce2x2, result rows/cols must be half of "
-                        "matrix rows/cols: CooperativeMatrixReduceNV"));
+                        "matrix rows/cols: CooperativeMatrixReduceEXT"));
 }
 
 TEST_F(ValidateArithmetics, CoopMat2ReduceRowDimFail) {
@@ -1935,7 +1935,7 @@ OpFunctionEnd
 
   )";
   const std::string body = R"(
-%val1 = OpCooperativeMatrixReduceNV %f16matC8x16 %f16mat_C_1 Row %reducefunc
+%val1 = OpCooperativeMatrixReduceEXT %f16matC8x16 %f16mat_C_1 Row %reducefunc
 )";
 
   CompileSuccessfully(GenerateCoopMatKHRCode(extra_types, body).c_str(),
@@ -1944,7 +1944,7 @@ OpFunctionEnd
             ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
   EXPECT_THAT(getDiagnosticString(),
               HasSubstr("For ReduceRow, result rows must match matrix rows: "
-                        "CooperativeMatrixReduceNV"));
+                        "CooperativeMatrixReduceEXT"));
 }
 
 TEST_F(ValidateArithmetics, CoopMat2ReduceColDimFail) {
@@ -1963,7 +1963,7 @@ OpFunctionEnd
 
   )";
   const std::string body = R"(
-%val1 = OpCooperativeMatrixReduceNV %f16matC16x8 %f16mat_C_1 Column %reducefunc
+%val1 = OpCooperativeMatrixReduceEXT %f16matC16x8 %f16mat_C_1 Column 
%reducefunc
 )";
 
   CompileSuccessfully(GenerateCoopMatKHRCode(extra_types, body).c_str(),
@@ -1972,7 +1972,7 @@ OpFunctionEnd
             ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
   EXPECT_THAT(getDiagnosticString(),
               HasSubstr("For ReduceColumn, result cols must match matrix cols: 
"
-                        "CooperativeMatrixReduceNV"));
+                        "CooperativeMatrixReduceEXT"));
 }
 
 TEST_F(ValidateArithmetics, CoopMat2ReduceMaskFail) {
@@ -1991,7 +1991,7 @@ OpFunctionEnd
 
   )";
   const std::string body = R"(
-%val1 = OpCooperativeMatrixReduceNV %f16matC8 %f16mat_C_1 Row|Column|2x2 
%reducefunc
+%val1 = OpCooperativeMatrixReduceEXT %f16matC8 %f16mat_C_1 Row|Column|2x2 
%reducefunc
 )";
 
   CompileSuccessfully(GenerateCoopMatKHRCode(extra_types, body).c_str(),
@@ -2000,7 +2000,7 @@ OpFunctionEnd
             ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
   EXPECT_THAT(getDiagnosticString(),
               HasSubstr("Reduce 2x2 must not be used with Row/Column: "
-                        "CooperativeMatrixReduceNV"));
+                        "CooperativeMatrixReduceEXT"));
 }
 
 TEST_F(ValidateArithmetics, CoopMat2ReduceFuncTypeFail) {
@@ -2017,7 +2017,7 @@ OpFunctionEnd
 
   )";
   const std::string body = R"(
-%val1 = OpCooperativeMatrixReduceNV %f16matC %f16mat_C_1 Row|Column %reducefunc
+%val1 = OpCooperativeMatrixReduceEXT %f16matC %f16mat_C_1 Row|Column 
%reducefunc
 )";
 
   CompileSuccessfully(GenerateCoopMatKHRCode(extra_types, body).c_str(),
@@ -2026,7 +2026,7 @@ OpFunctionEnd
             ValidateInstructions(SPV_ENV_UNIVERSAL_1_3));
   EXPECT_THAT(getDiagnosticString(),
               HasSubstr("CombineFunc return type and parameters must match "
-                        "matrix component type: CooperativeMatrixReduceNV"));
+                        "matrix component type: CooperativeMatrixReduceEXT"));
 }
 
 TEST_F(ValidateArithmetics, CoopMat2PerElementOpSuccess) {

Reply via email to