LLVM: lib/Target/SPIRV/SPIRVSubtarget.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

21

22using namespace llvm;

23

24#define DEBUG_TYPE "spirv-subtarget"

25

26#define GET_SUBTARGETINFO_TARGET_DESC

27#define GET_SUBTARGETINFO_CTOR

28#include "SPIRVGenSubtargetInfo.inc"

29

32 cl::desc("SPIR-V Translator compatibility mode"),

34

38 cl::desc("Specify list of enabled SPIR-V extensions"));

39

40

41

43 const std::setSPIRV::Extension::Extension &AllowList) {

44 Extensions.insert(AllowList.begin(), AllowList.end());

45}

46

47

51

53 const std::string &FS,

56 PointerSize(TM.getPointerSizeInBits( 0)),

58 TLInfo(TM, *this), TargetTriple(TT) {

59 switch (TT.getSubArch()) {

60 case Triple::SPIRVSubArch_v10:

61 SPIRVVersion = VersionTuple(1, 0);

62 break;

63 case Triple::SPIRVSubArch_v11:

64 SPIRVVersion = VersionTuple(1, 1);

65 break;

66 case Triple::SPIRVSubArch_v12:

67 SPIRVVersion = VersionTuple(1, 2);

68 break;

69 case Triple::SPIRVSubArch_v13:

70 SPIRVVersion = VersionTuple(1, 3);

71 break;

72 case Triple::SPIRVSubArch_v14:

73 SPIRVVersion = VersionTuple(1, 4);

74 break;

75 case Triple::SPIRVSubArch_v15:

76 SPIRVVersion = VersionTuple(1, 5);

77 break;

78 case Triple::SPIRVSubArch_v16:

79 SPIRVVersion = VersionTuple(1, 6);

80 break;

81 default:

82 if (TT.getVendor() == Triple::AMD)

83 SPIRVVersion = VersionTuple(1, 6);

84 else

85 SPIRVVersion = VersionTuple(1, 4);

86 }

88

89

95 else

97

98

100 Extensions.insert(SPIRV::Extension::SPV_INTEL_function_pointers);

103

104

106 initAvailableExtInstSets();

107

108 GR = std::make_unique(PointerSize);

109 CallLoweringInfo = std::make_unique(TLInfo, GR.get());

110 InlineAsmInfo = std::make_unique(TLInfo);

111 Legalizer = std::make_unique(*this);

112 RegBankInfo = std::make_unique();

114}

115

121

123 return AvailableExtensions.contains(E);

124}

125

127 SPIRV::InstructionSet::InstructionSet E) const {

128 return AvailableExtInstSets.contains(E);

129}

130

131SPIRV::InstructionSet::InstructionSet

134 return SPIRV::InstructionSet::GLSL_std_450;

135 else

136 return SPIRV::InstructionSet::OpenCL_std;

137}

138

142

145 return false;

146 return isAtLeastVer(OpenCLVersion, VerToCompareTo);

147}

148

149

150

154

155void SPIRVSubtarget::accountForAMDShaderTrinaryMinmax() {

157 SPIRV::Extension::SPV_AMD_shader_trinary_minmax_extension)) {

158 AvailableExtInstSets.insert(

159 SPIRV::InstructionSet::SPV_AMD_shader_trinary_minmax);

160 }

161}

162

163

164

165void SPIRVSubtarget::initAvailableExtInstSets() {

166 AvailableExtInstSets.clear();

168 AvailableExtInstSets.insert(SPIRV::InstructionSet::GLSL_std_450);

169 else

170 AvailableExtInstSets.insert(SPIRV::InstructionSet::OpenCL_std);

171

172

173 accountForAMDShaderTrinaryMinmax();

174}

175

176

178 const std::setSPIRV::Extension::Extension &AllowedExtIds) {

179 AvailableExtensions.clear();

180 const std::setSPIRV::Extension::Extension &ValidExtensions =

182

183 for (const auto &Ext : AllowedExtIds) {

184 if (ValidExtensions.count(Ext))

185 AvailableExtensions.insert(Ext);

186 }

187

188 accountForAMDShaderTrinaryMinmax();

189}

static bool isAtLeastVer(VersionTuple Target, VersionTuple VerToCompareTo)

Definition SPIRVSubtarget.cpp:48

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)

Definition SPIRVSubtarget.cpp:116

static void addExtensionsToClOpt(const std::set< SPIRV::Extension::Extension > &AllowList)

Definition SPIRVSubtarget.cpp:42

bool canDirectlyComparePointers() const

Definition SPIRVSubtarget.cpp:151

bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const

Definition SPIRVSubtarget.cpp:139

bool isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const

Definition SPIRVSubtarget.cpp:143

void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)

bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E) const

Definition SPIRVSubtarget.cpp:126

void initAvailableExtensions(const std::set< SPIRV::Extension::Extension > &AllowedExtIds)

Definition SPIRVSubtarget.cpp:177

SPIRVSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, const SPIRVTargetMachine &TM)

Definition SPIRVSubtarget.cpp:52

SPIRV::InstructionSet::InstructionSet getPreferredInstructionSet() const

Definition SPIRVSubtarget.cpp:132

bool canUseExtension(SPIRV::Extension::Extension E) const

Definition SPIRVSubtarget.cpp:122

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.

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....