diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp --- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp @@ -552,6 +552,10 @@ // 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 @@ 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 --- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp @@ -96,8 +96,11 @@ 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 --- a/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td +++ b/llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td @@ -243,6 +243,7 @@ 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 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 --- 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