diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp index 22746788607b8..c3fc255e4b3df 100644 --- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp @@ -552,6 +552,10 @@ void RequirementHandler::initAvailableCapabilities(const SPIRVSubtarget &ST) { // TODO: verify if this needs some checks. addAvailableCaps({Capability::Float16, Capability::Float64}); + // Add cap for SPV_INTEL_optnone. + // FIXME: this should be added only if the target has the extension. + addAvailableCaps({Capability::OptNoneINTEL}); + // TODO: add OpenCL extensions. } } // namespace SPIRV @@ -898,6 +902,13 @@ static void collectReqs(const Module &M, SPIRV::ModuleAnalysisInfo &MAI, MAI.Reqs.getAndAddRequirements( SPIRV::OperandCategory::ExecutionModeOperand, SPIRV::ExecutionMode::VecTypeHint, ST); + + if (F.hasOptNone() && + ST.canUseExtension(SPIRV::Extension::SPV_INTEL_optnone)) { + // Output OpCapability OptNoneINTEL. + MAI.Reqs.addExtension(SPIRV::Extension::SPV_INTEL_optnone); + MAI.Reqs.addCapability(SPIRV::Capability::OptNoneINTEL); + } } } diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp index 0f047b09c5214..05f871a88db0d 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp @@ -96,8 +96,11 @@ void SPIRVSubtarget::initAvailableExtensions() { if (!isOpenCLEnv()) return; // A default extension for testing. + // FIXME: This should be changed when we can select extensions through a + // command line flag. AvailableExtensions.insert( SPIRV::Extension::SPV_KHR_no_integer_wrap_decoration); + AvailableExtensions.insert(SPIRV::Extension::SPV_INTEL_optnone); } // TODO: use command line args for this rather than just defaults. diff --git a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td index e37a1957132f6..a7d2a3fc41cf3 100644 --- a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td +++ b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td @@ -243,6 +243,7 @@ defm SPV_KHR_shader_clock : ExtensionOperand<54>; defm SPV_INTEL_unstructured_loop_controls : ExtensionOperand<55>; defm SPV_EXT_demote_to_helper_invocation : ExtensionOperand<56>; defm SPV_INTEL_fpga_reg : ExtensionOperand<57>; +defm SPV_INTEL_optnone : ExtensionOperand<58>; //===----------------------------------------------------------------------===// // Multiclass used to define Capabilities enum values and at the same time @@ -396,6 +397,7 @@ defm ComputeDerivativeGroupLinearNV : CapabilityOperand<5350, 0, 0, [], []>; defm FragmentDensityEXT : CapabilityOperand<5291, 0, 0, [], [Shader]>; defm PhysicalStorageBufferAddressesEXT : CapabilityOperand<5347, 0, 0, [], [Shader]>; defm CooperativeMatrixNV : CapabilityOperand<5357, 0, 0, [], [Shader]>; +defm OptNoneINTEL : CapabilityOperand<6094, 0, 0, [SPV_INTEL_optnone], []>; //===----------------------------------------------------------------------===// // Multiclass used to define SourceLanguage enum values and at the same time diff --git a/llvm/test/CodeGen/SPIRV/optnone.ll b/llvm/test/CodeGen/SPIRV/optnone.ll index 95c390ce7bf14..238a819317374 100644 --- a/llvm/test/CodeGen/SPIRV/optnone.ll +++ b/llvm/test/CodeGen/SPIRV/optnone.ll @@ -1,6 +1,9 @@ ;; Check that optnone is correctly ignored when extension is not enabled ; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV +; CHECK-SPIRV: OpCapability OptNoneINTEL +; CHECK-SPIRV: OpExtension "SPV_INTEL_optnone" + ;; Per SPIR-V spec: ;; FunctionControlDontInlineMask = 0x2 (2) ; CHECK-SPIRV: %[[#]] = OpFunction %[[#]] DontInline