[llvm] [SPIR-V] Require SPV_EXT_long_vector for non-standard vector widths (PR #212685)

Arseniy Obolenskiy via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 27 05:32:42 PDT 2026


https://github.com/aobolensk updated https://github.com/llvm/llvm-project/pull/212685

>From d6ac4dd35168b4c5343067bdb2725686facc6b6f Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Wed, 29 Jul 2026 07:27:37 +0200
Subject: [PATCH] [SPIR-V] Require SPV_EXT_long_vector for non-standard vector
 widths

OpTypeVector with a component count other than 2, 3, 4, 8, or 16 needs OpCapability LongVectorEXT and OpExtension SPV_EXT_long_vector per the SPIR-V spec
---
 llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp     | 3 ++-
 llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp  | 9 +++++++++
 llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td | 2 ++
 llvm/test/CodeGen/SPIRV/concat-vectors.ll      | 5 ++---
 4 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp b/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
index 4608f560e1acf..2fe23996b8cc2 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCommandLine.cpp
@@ -179,7 +179,8 @@ static const StringMap<SPIRV::Extension::Extension> SPIRVExtensionMap = {
     {"SPV_AMD_weak_linkage", SPIRV::Extension::Extension::SPV_AMD_weak_linkage},
     {"SPV_KHR_abort", SPIRV::Extension::Extension::SPV_KHR_abort},
     {"SPV_KHR_poison_freeze",
-     SPIRV::Extension::Extension::SPV_KHR_poison_freeze}};
+     SPIRV::Extension::Extension::SPV_KHR_poison_freeze},
+    {"SPV_EXT_long_vector", SPIRV::Extension::Extension::SPV_EXT_long_vector}};
 
 bool SPIRVExtensionsParser::parse(cl::Option &O, StringRef ArgName,
                                   StringRef ArgValue, ExtensionSet &Vals) {
diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
index 2836a2cc43ef0..9069ea6a10ec7 100644
--- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
@@ -1618,6 +1618,15 @@ void addInstrRequirements(const MachineInstr &MI,
     unsigned NumComponents = MI.getOperand(2).getImm();
     if (NumComponents == 8 || NumComponents == 16)
       Reqs.addCapability(SPIRV::Capability::Vector16);
+    else if (NumComponents != 2 && NumComponents != 3 && NumComponents != 4) {
+      if (!ST.canUseExtension(SPIRV::Extension::SPV_EXT_long_vector))
+        reportFatalUsageError(
+            "Vector type with " + Twine(NumComponents) +
+            " components requires the following SPIR-V extension: "
+            "SPV_EXT_long_vector");
+      Reqs.addExtension(SPIRV::Extension::SPV_EXT_long_vector);
+      Reqs.addCapability(SPIRV::Capability::LongVectorEXT);
+    }
 
     assert(MI.getOperand(1).isReg());
     const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
diff --git a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
index 7da57bc1b2d47..e7296c0228475 100644
--- a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
+++ b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td
@@ -404,6 +404,7 @@ defm SPV_AMD_weak_linkage : ExtensionOperand<137, [EnvOpenCL]>;
 // Message Type, which is not yet implemented.
 defm SPV_KHR_abort : ExtensionOperand<138, [EnvOpenCL]>;
 defm SPV_KHR_poison_freeze : ExtensionOperand<139, [EnvVulkan, EnvOpenCL]>;
+defm SPV_EXT_long_vector : ExtensionOperand<140, [EnvVulkan, EnvOpenCL]>;
 
 //===----------------------------------------------------------------------===//
 // Multiclass used to define Capabilities enum values and at the same time
@@ -642,6 +643,7 @@ defm ArbitraryPrecisionFixedPointALTERA : CapabilityOperand<5922, 0, 0, [SPV_ALT
 defm ArbitraryPrecisionFloatingPointALTERA : CapabilityOperand<5845, 0, 0,[SPV_ALTERA_arbitrary_precision_floating_point], []>;
 defm UnstructuredLoopControlsINTEL : CapabilityOperand<5886, 0, 0, [SPV_INTEL_unstructured_loop_controls], []>;
 defm PoisonFreezeKHR : CapabilityOperand<5156, 0, 0, [SPV_KHR_poison_freeze], []>;
+defm LongVectorEXT : CapabilityOperand<5425, 0, 0, [SPV_EXT_long_vector], []>;
 
 //===----------------------------------------------------------------------===//
 // Multiclass used to define SourceLanguage enum values and at the same time
diff --git a/llvm/test/CodeGen/SPIRV/concat-vectors.ll b/llvm/test/CodeGen/SPIRV/concat-vectors.ll
index cc7d593dbacb0..22f20c17dbc33 100644
--- a/llvm/test/CodeGen/SPIRV/concat-vectors.ll
+++ b/llvm/test/CodeGen/SPIRV/concat-vectors.ll
@@ -1,6 +1,5 @@
-; RUN: llc -O0 -global-isel -verify-machineinstrs -mtriple=spirv64 %s -o - | FileCheck %s
-; spirv-val errors about a 7 element vector.
-; TODO: %if spirv-tools %{ llc -O0 -mtriple=spirv64 < %s -o - -filetype=obj | spirv-val %}
+; RUN: llc -O0 -global-isel -verify-machineinstrs -mtriple=spirv64 --spirv-ext=+SPV_EXT_long_vector %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64 --spirv-ext=+SPV_EXT_long_vector < %s -o - -filetype=obj | spirv-val %}
 
 ; G_CONCAT_VECTORS should select to OpCompositeConstruct, which
 ; concatenates its vector constituents (each sharing the result component type).



More information about the llvm-commits mailing list