24#define DEBUG_TYPE "spirv-subtarget"
26#define GET_SUBTARGETINFO_TARGET_DESC
27#define GET_SUBTARGETINFO_CTOR
28#include "SPIRVGenSubtargetInfo.inc"
32 cl::desc(
"SPIR-V Translator compatibility mode"),
38 cl::desc(
"Specify list of enabled SPIR-V extensions"));
43 const std::set<SPIRV::Extension::Extension> &AllowList) {
44 Extensions.insert(AllowList.begin(), AllowList.end());
53 const std::string &FS,
56 PointerSize(TM.getPointerSizeInBits( 0)), InstrInfo(),
57 FrameLowering(initSubtargetDependencies(CPU, FS)), TLInfo(TM, *this),
59 switch (TT.getSubArch()) {
95 initAvailableExtInstSets();
97 GR = std::make_unique<SPIRVGlobalRegistry>(PointerSize);
98 CallLoweringInfo = std::make_unique<SPIRVCallLowering>(TLInfo, GR.get());
99 InlineAsmInfo = std::make_unique<SPIRVInlineAsmLowering>(TLInfo);
100 Legalizer = std::make_unique<SPIRVLegalizerInfo>(*
this);
101 RegBankInfo = std::make_unique<SPIRVRegisterBankInfo>();
112 return AvailableExtensions.
contains(E);
116 SPIRV::InstructionSet::InstructionSet E)
const {
117 return AvailableExtInstSets.
contains(E);
120SPIRV::InstructionSet::InstructionSet
123 return SPIRV::InstructionSet::GLSL_std_450;
125 return SPIRV::InstructionSet::OpenCL_std;
144void SPIRVSubtarget::accountForAMDShaderTrinaryMinmax() {
146 SPIRV::Extension::SPV_AMD_shader_trinary_minmax_extension)) {
147 AvailableExtInstSets.
insert(
148 SPIRV::InstructionSet::SPV_AMD_shader_trinary_minmax);
154void SPIRVSubtarget::initAvailableExtInstSets() {
155 AvailableExtInstSets.
clear();
157 AvailableExtInstSets.
insert(SPIRV::InstructionSet::GLSL_std_450);
159 AvailableExtInstSets.
insert(SPIRV::InstructionSet::OpenCL_std);
162 accountForAMDShaderTrinaryMinmax();
167 const std::set<SPIRV::Extension::Extension> &AllowedExtIds) {
168 AvailableExtensions.
clear();
169 const std::set<SPIRV::Extension::Extension> &ValidExtensions =
172 for (
const auto &Ext : AllowedExtIds) {
173 if (ValidExtensions.count(Ext))
174 AvailableExtensions.
insert(Ext);
177 accountForAMDShaderTrinaryMinmax();
static bool isAtLeastVer(VersionTuple Target, VersionTuple VerToCompareTo)
static cl::opt< bool > SPVTranslatorCompat("translator-compatibility-mode", cl::desc("SPIR-V Translator compatibility mode"), cl::Optional, cl::init(false))
static cl::opt< std::set< SPIRV::Extension::Extension >, false, SPIRVExtensionsParser > Extensions("spirv-ext", cl::desc("Specify list of enabled SPIR-V extensions"))
SPIRVSubtarget & initSubtargetDependencies(StringRef CPU, StringRef FS)
static void addExtensionsToClOpt(const std::set< SPIRV::Extension::Extension > &AllowList)
bool canDirectlyComparePointers() const
bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const
bool isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E) const
void initAvailableExtensions(const std::set< SPIRV::Extension::Extension > &AllowedExtIds)
SPIRVSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, const SPIRVTargetMachine &TM)
SPIRV::InstructionSet::InstructionSet getPreferredInstructionSet() const
bool canUseExtension(SPIRV::Extension::Extension E) const
bool contains(const T &V) const
Check if the SmallSet contains the given element.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
StringRef - Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
OSType getOS() const
Get the parsed operating system type of this triple.
EnvironmentType getEnvironment() const
Get the parsed environment type of this triple.
Represents a version number in the form major[.minor[.subminor[.build]]].
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
InstructionSelector * createSPIRVInstructionSelector(const SPIRVTargetMachine &TM, const SPIRVSubtarget &Subtarget, const RegisterBankInfo &RBI)
Command line parser for toggling SPIR-V extensions.
static std::set< SPIRV::Extension::Extension > getValidExtensions(const Triple &TT)
Returns the list of extensions that are valid for a particular target environment (i....