Skip to content

Commit bdf0495

Browse files
[SPIR-V] Emit SPIR-V generator magic number and version
This patch: - Adds SPIR-V backend's registered generator magic number to the emitted binary. The magic number consists of the generator ID (43) and LLVM major version. - Adds SPIR-V version to the binary. - Allows reading the expected (maximum supported) SPIR-V version from the target triple. - Uses VersionTuple for representing versions throughout the backend's codebase. - Registers v1.6 for spirv32 and spirv64 triple. See more: KhronosGroup/SPIRV-Headers@7d500c
1 parent e2cf06b commit bdf0495

14 files changed

+117
-80
lines changed

llvm/lib/MC/SPIRVObjectWriter.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ class SPIRVObjectWriter : public MCObjectWriter {
4343

4444
void SPIRVObjectWriter::writeHeader(const MCAssembler &Asm) {
4545
constexpr uint32_t MagicNumber = 0x07230203;
46-
constexpr uint32_t GeneratorMagicNumber = 0;
46+
constexpr uint32_t GeneratorID = 43;
47+
constexpr uint32_t GeneratorMagicNumber =
48+
(GeneratorID << 16) | (LLVM_VERSION_MAJOR);
4749
constexpr uint32_t Schema = 0;
48-
49-
// Construct SPIR-V version and Bound
5050
const MCAssembler::VersionInfoType &VIT = Asm.getVersionInfo();
5151
uint32_t VersionNumber = 0 | (VIT.Major << 16) | (VIT.Minor << 8);
5252
uint32_t Bound = VIT.Update;

llvm/lib/Target/SPIRV/SPIRV.td

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,6 @@ class Proc<string Name, list<SubtargetFeature> Features>
2020

2121
def : Proc<"generic", []>;
2222

23-
def SPIRV10 : SubtargetFeature<"spirv1.0", "SPIRVVersion", "10",
24-
"Use SPIR-V version 1.0">;
25-
def SPIRV11 : SubtargetFeature<"spirv1.1", "SPIRVVersion", "11",
26-
"Use SPIR-V version 1.1">;
27-
def SPIRV12 : SubtargetFeature<"spirv1.2", "SPIRVVersion", "12",
28-
"Use SPIR-V version 1.2">;
29-
def SPIRV13 : SubtargetFeature<"spirv1.3", "SPIRVVersion", "13",
30-
"Use SPIR-V version 1.3">;
31-
def SPIRV14 : SubtargetFeature<"spirv1.4", "SPIRVVersion", "14",
32-
"Use SPIR-V version 1.4">;
33-
def SPIRV15 : SubtargetFeature<"spirv1.5", "SPIRVVersion", "15",
34-
"Use SPIR-V version 1.5">;
35-
3623
def SPIRVInstPrinter : AsmWriter {
3724
string AsmWriterClassName = "InstPrinter";
3825
bit isMCAsmWriter = 1;

llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ void SPIRVAsmPrinter::emitEndOfAsmFile(Module &M) {
108108
}
109109

110110
ST = static_cast<const SPIRVTargetMachine &>(TM).getSubtargetImpl();
111-
uint32_t DecSPIRVVersion = ST->getSPIRVVersion();
112-
uint32_t Major = DecSPIRVVersion / 10;
113-
uint32_t Minor = DecSPIRVVersion - Major * 10;
111+
VersionTuple SPIRVVersion = ST->getSPIRVVersion();
112+
uint32_t Major = SPIRVVersion.getMajor();
113+
uint32_t Minor = SPIRVVersion.getMinor().value_or(0);
114114
// Bound is an approximation that accounts for the maximum used register
115115
// number and number of generated OpLabels
116116
unsigned Bound = 2 * (ST->getBound() + 1) + NLabels;
@@ -321,8 +321,8 @@ void SPIRVAsmPrinter::outputEntryPoints() {
321321
// the Input and Output storage classes. Starting with version 1.4,
322322
// the interface's storage classes are all storage classes used in
323323
// declaring all global variables referenced by the entry point call tree.
324-
if (ST->getSPIRVVersion() >= 14 || SC == SPIRV::StorageClass::Input ||
325-
SC == SPIRV::StorageClass::Output) {
324+
if (ST->isAtLeastSPIRVVer(VersionTuple(1, 4)) ||
325+
SC == SPIRV::StorageClass::Input || SC == SPIRV::StorageClass::Output) {
326326
MachineFunction *MF = MI->getMF();
327327
Register Reg = MAI->getRegisterAlias(MF, MI->getOperand(0).getReg());
328328
InterfaceIDs.insert(Reg);

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,23 @@ getSymbolicOperandRequirements(SPIRV::OperandCategory::OperandCategory Category,
7676
SPIRV::RequirementHandler &Reqs) {
7777
static AvoidCapabilitiesSet
7878
AvoidCaps; // contains capabilities to avoid if there is another option
79-
unsigned ReqMinVer = getSymbolicOperandMinVersion(Category, i);
80-
unsigned ReqMaxVer = getSymbolicOperandMaxVersion(Category, i);
81-
unsigned TargetVer = ST.getSPIRVVersion();
82-
bool MinVerOK = !ReqMinVer || !TargetVer || TargetVer >= ReqMinVer;
83-
bool MaxVerOK = !ReqMaxVer || !TargetVer || TargetVer <= ReqMaxVer;
79+
80+
unsigned ReqMinVerDec = getSymbolicOperandMinVersion(Category, i);
81+
VersionTuple ReqMinVer = VersionTuple(ReqMinVerDec / 10, ReqMinVerDec % 10);
82+
unsigned ReqMaxVerDec = getSymbolicOperandMaxVersion(Category, i);
83+
VersionTuple ReqMaxVer = VersionTuple(ReqMaxVerDec / 10, ReqMaxVerDec % 10);
84+
VersionTuple SPIRVVersion = ST.getSPIRVVersion();
85+
bool MinVerOK =
86+
ReqMinVer.empty() || SPIRVVersion.empty() || SPIRVVersion >= ReqMinVer;
87+
bool MaxVerOK =
88+
ReqMaxVer.empty() || SPIRVVersion.empty() || SPIRVVersion <= ReqMaxVer;
8489
CapabilityList ReqCaps = getSymbolicOperandCapabilities(Category, i);
8590
ExtensionList ReqExts = getSymbolicOperandExtensions(Category, i);
8691
if (ReqCaps.empty()) {
8792
if (ReqExts.empty()) {
8893
if (MinVerOK && MaxVerOK)
8994
return {true, {}, {}, ReqMinVer, ReqMaxVer};
90-
return {false, {}, {}, 0, 0};
95+
return {false, {}, {}, VersionTuple(), VersionTuple()};
9196
}
9297
} else if (MinVerOK && MaxVerOK) {
9398
if (ReqCaps.size() == 1) {
@@ -118,9 +123,13 @@ getSymbolicOperandRequirements(SPIRV::OperandCategory::OperandCategory Category,
118123
if (llvm::all_of(ReqExts, [&ST](const SPIRV::Extension::Extension &Ext) {
119124
return ST.canUseExtension(Ext);
120125
})) {
121-
return {true, {}, ReqExts, 0, 0}; // TODO: add versions to extensions.
126+
return {true,
127+
{},
128+
ReqExts,
129+
VersionTuple(),
130+
VersionTuple()}; // TODO: add versions to extensions.
122131
}
123-
return {false, {}, {}, 0, 0};
132+
return {false, {}, {}, VersionTuple(), VersionTuple()};
124133
}
125134

126135
void SPIRVModuleAnalysis::setBaseInfo(const Module &M) {
@@ -499,25 +508,25 @@ void SPIRV::RequirementHandler::addRequirements(
499508

500509
addExtensions(Req.Exts);
501510

502-
if (Req.MinVer) {
503-
if (MaxVersion && Req.MinVer > MaxVersion) {
511+
if (!Req.MinVer.empty()) {
512+
if (!MaxVersion.empty() && Req.MinVer > MaxVersion) {
504513
LLVM_DEBUG(dbgs() << "Conflicting version requirements: >= " << Req.MinVer
505514
<< " and <= " << MaxVersion << "\n");
506515
report_fatal_error("Adding SPIR-V requirements that can't be satisfied.");
507516
}
508517

509-
if (MinVersion == 0 || Req.MinVer > MinVersion)
518+
if (MinVersion.empty() || Req.MinVer > MinVersion)
510519
MinVersion = Req.MinVer;
511520
}
512521

513-
if (Req.MaxVer) {
514-
if (MinVersion && Req.MaxVer < MinVersion) {
522+
if (!Req.MaxVer.empty()) {
523+
if (!MinVersion.empty() && Req.MaxVer < MinVersion) {
515524
LLVM_DEBUG(dbgs() << "Conflicting version requirements: <= " << Req.MaxVer
516525
<< " and >= " << MinVersion << "\n");
517526
report_fatal_error("Adding SPIR-V requirements that can't be satisfied.");
518527
}
519528

520-
if (MaxVersion == 0 || Req.MaxVer < MaxVersion)
529+
if (MaxVersion.empty() || Req.MaxVer < MaxVersion)
521530
MaxVersion = Req.MaxVer;
522531
}
523532
}
@@ -528,22 +537,22 @@ void SPIRV::RequirementHandler::checkSatisfiable(
528537
bool IsSatisfiable = true;
529538
auto TargetVer = ST.getSPIRVVersion();
530539

531-
if (MaxVersion && TargetVer && MaxVersion < TargetVer) {
540+
if (!MaxVersion.empty() && !TargetVer.empty() && MaxVersion < TargetVer) {
532541
LLVM_DEBUG(
533542
dbgs() << "Target SPIR-V version too high for required features\n"
534543
<< "Required max version: " << MaxVersion << " target version "
535544
<< TargetVer << "\n");
536545
IsSatisfiable = false;
537546
}
538547

539-
if (MinVersion && TargetVer && MinVersion > TargetVer) {
548+
if (!MinVersion.empty() && !TargetVer.empty() && MinVersion > TargetVer) {
540549
LLVM_DEBUG(dbgs() << "Target SPIR-V version too low for required features\n"
541550
<< "Required min version: " << MinVersion
542551
<< " target version " << TargetVer << "\n");
543552
IsSatisfiable = false;
544553
}
545554

546-
if (MinVersion && MaxVersion && MinVersion > MaxVersion) {
555+
if (!MinVersion.empty() && !MaxVersion.empty() && MinVersion > MaxVersion) {
547556
LLVM_DEBUG(
548557
dbgs()
549558
<< "Version is too low for some features and too high for others.\n"
@@ -621,20 +630,21 @@ void RequirementHandler::initAvailableCapabilitiesForOpenCL(
621630
addAvailableCaps({Capability::ImageBasic, Capability::LiteralSampler,
622631
Capability::Image1D, Capability::SampledBuffer,
623632
Capability::ImageBuffer});
624-
if (ST.isAtLeastOpenCLVer(20))
633+
if (ST.isAtLeastOpenCLVer(VersionTuple(2, 0)))
625634
addAvailableCaps({Capability::ImageReadWrite});
626635
}
627-
if (ST.isAtLeastSPIRVVer(11) && ST.isAtLeastOpenCLVer(22))
636+
if (ST.isAtLeastSPIRVVer(VersionTuple(1, 1)) &&
637+
ST.isAtLeastOpenCLVer(VersionTuple(2, 2)))
628638
addAvailableCaps({Capability::SubgroupDispatch, Capability::PipeStorage});
629-
if (ST.isAtLeastSPIRVVer(13))
639+
if (ST.isAtLeastSPIRVVer(VersionTuple(1, 3)))
630640
addAvailableCaps({Capability::GroupNonUniform,
631641
Capability::GroupNonUniformVote,
632642
Capability::GroupNonUniformArithmetic,
633643
Capability::GroupNonUniformBallot,
634644
Capability::GroupNonUniformClustered,
635645
Capability::GroupNonUniformShuffle,
636646
Capability::GroupNonUniformShuffleRelative});
637-
if (ST.isAtLeastSPIRVVer(14))
647+
if (ST.isAtLeastSPIRVVer(VersionTuple(1, 4)))
638648
addAvailableCaps({Capability::DenormPreserve, Capability::DenormFlushToZero,
639649
Capability::SignedZeroInfNanPreserve,
640650
Capability::RoundingModeRTE,
@@ -1151,7 +1161,8 @@ static void collectReqs(const Module &M, SPIRV::ModuleAnalysisInfo &MAI,
11511161
auto Node = M.getNamedMetadata("spirv.ExecutionMode");
11521162
if (Node) {
11531163
// SPV_KHR_float_controls is not available until v1.4
1154-
bool RequireFloatControls = false, VerLower14 = !ST.isAtLeastSPIRVVer(14);
1164+
bool RequireFloatControls = false,
1165+
VerLower14 = !ST.isAtLeastSPIRVVer(VersionTuple(1, 4));
11551166
for (unsigned i = 0; i < Node->getNumOperands(); i++) {
11561167
MDNode *MDN = cast<MDNode>(Node->getOperand(i));
11571168
const MDOperand &MDOp = MDN->getOperand(1);

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ struct Requirements {
4545
const bool IsSatisfiable;
4646
const std::optional<Capability::Capability> Cap;
4747
const ExtensionList Exts;
48-
const unsigned MinVer; // 0 if no min version is required.
49-
const unsigned MaxVer; // 0 if no max version is required.
48+
const VersionTuple MinVer; // 0 if no min version is required.
49+
const VersionTuple MaxVer; // 0 if no max version is required.
5050

5151
Requirements(bool IsSatisfiable = false,
5252
std::optional<Capability::Capability> Cap = {},
53-
ExtensionList Exts = {}, unsigned MinVer = 0,
54-
unsigned MaxVer = 0)
53+
ExtensionList Exts = {}, VersionTuple MinVer = VersionTuple(),
54+
VersionTuple MaxVer = VersionTuple())
5555
: IsSatisfiable(IsSatisfiable), Cap(Cap), Exts(Exts), MinVer(MinVer),
5656
MaxVer(MaxVer) {}
5757
Requirements(Capability::Capability Cap) : Requirements(true, {Cap}) {}
@@ -69,8 +69,8 @@ struct RequirementHandler {
6969
DenseSet<unsigned> AvailableCaps;
7070

7171
SmallSet<Extension::Extension, 4> AllExtensions;
72-
unsigned MinVersion; // 0 if no min version is defined.
73-
unsigned MaxVersion; // 0 if no max version is defined.
72+
VersionTuple MinVersion; // 0 if no min version is defined.
73+
VersionTuple MaxVersion; // 0 if no max version is defined.
7474
// Add capabilities to AllCaps, recursing through their implicitly declared
7575
// capabilities too.
7676
void recursiveAddCapabilities(const CapabilityList &ToPrune);
@@ -79,17 +79,15 @@ struct RequirementHandler {
7979
void initAvailableCapabilitiesForVulkan(const SPIRVSubtarget &ST);
8080

8181
public:
82-
RequirementHandler() : MinVersion(0), MaxVersion(0) {}
82+
RequirementHandler() {}
8383
void clear() {
8484
MinimalCaps.clear();
8585
AllCaps.clear();
8686
AvailableCaps.clear();
8787
AllExtensions.clear();
88-
MinVersion = 0;
89-
MaxVersion = 0;
88+
MinVersion = VersionTuple();
89+
MaxVersion = VersionTuple();
9090
}
91-
unsigned getMinVersion() const { return MinVersion; }
92-
unsigned getMaxVersion() const { return MaxVersion; }
9391
const CapabilityList &getMinimalCapabilities() const { return MinimalCaps; }
9492
const SmallSet<Extension::Extension, 4> &getExtensions() const {
9593
return AllExtensions;

llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,43 @@ static cl::opt<std::set<SPIRV::Extension::Extension>, false,
3939
cl::desc("Specify list of enabled SPIR-V extensions"));
4040

4141
// Compare version numbers, but allow 0 to mean unspecified.
42-
static bool isAtLeastVer(uint32_t Target, uint32_t VerToCompareTo) {
43-
return Target == 0 || Target >= VerToCompareTo;
42+
static bool isAtLeastVer(VersionTuple Target, VersionTuple VerToCompareTo) {
43+
return Target.empty() || Target >= VerToCompareTo;
4444
}
4545

4646
SPIRVSubtarget::SPIRVSubtarget(const Triple &TT, const std::string &CPU,
4747
const std::string &FS,
4848
const SPIRVTargetMachine &TM)
4949
: SPIRVGenSubtargetInfo(TT, CPU, /*TuneCPU=*/CPU, FS),
50-
PointerSize(TM.getPointerSizeInBits(/* AS= */ 0)), SPIRVVersion(0),
51-
OpenCLVersion(0), InstrInfo(),
50+
PointerSize(TM.getPointerSizeInBits(/* AS= */ 0)), InstrInfo(),
5251
FrameLowering(initSubtargetDependencies(CPU, FS)), TLInfo(TM, *this),
5352
TargetTriple(TT) {
53+
switch (TT.getSubArch()) {
54+
case Triple::SPIRVSubArch_v10:
55+
SPIRVVersion = VersionTuple(1, 0);
56+
break;
57+
case Triple::SPIRVSubArch_v11:
58+
SPIRVVersion = VersionTuple(1, 1);
59+
break;
60+
case Triple::SPIRVSubArch_v12:
61+
SPIRVVersion = VersionTuple(1, 2);
62+
break;
63+
case Triple::SPIRVSubArch_v13:
64+
SPIRVVersion = VersionTuple(1, 3);
65+
break;
66+
case Triple::SPIRVSubArch_v14:
67+
default:
68+
SPIRVVersion = VersionTuple(1, 4);
69+
break;
70+
case Triple::SPIRVSubArch_v15:
71+
SPIRVVersion = VersionTuple(1, 5);
72+
break;
73+
case Triple::SPIRVSubArch_v16:
74+
SPIRVVersion = VersionTuple(1, 6);
75+
break;
76+
}
77+
OpenCLVersion = VersionTuple(2, 2);
78+
5479
// The order of initialization is important.
5580
initAvailableExtensions();
5681
initAvailableExtInstSets();
@@ -66,10 +91,6 @@ SPIRVSubtarget::SPIRVSubtarget(const Triple &TT, const std::string &CPU,
6691
SPIRVSubtarget &SPIRVSubtarget::initSubtargetDependencies(StringRef CPU,
6792
StringRef FS) {
6893
ParseSubtargetFeatures(CPU, /*TuneCPU=*/CPU, FS);
69-
if (SPIRVVersion == 0)
70-
SPIRVVersion = 14;
71-
if (OpenCLVersion == 0)
72-
OpenCLVersion = 22;
7394
return *this;
7495
}
7596

@@ -82,11 +103,11 @@ bool SPIRVSubtarget::canUseExtInstSet(
82103
return AvailableExtInstSets.contains(E);
83104
}
84105

85-
bool SPIRVSubtarget::isAtLeastSPIRVVer(uint32_t VerToCompareTo) const {
106+
bool SPIRVSubtarget::isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const {
86107
return isAtLeastVer(SPIRVVersion, VerToCompareTo);
87108
}
88109

89-
bool SPIRVSubtarget::isAtLeastOpenCLVer(uint32_t VerToCompareTo) const {
110+
bool SPIRVSubtarget::isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const {
90111
if (!isOpenCLEnv())
91112
return false;
92113
return isAtLeastVer(OpenCLVersion, VerToCompareTo);
@@ -95,7 +116,7 @@ bool SPIRVSubtarget::isAtLeastOpenCLVer(uint32_t VerToCompareTo) const {
95116
// If the SPIR-V version is >= 1.4 we can call OpPtrEqual and OpPtrNotEqual.
96117
// In SPIR-V Translator compatibility mode this feature is not available.
97118
bool SPIRVSubtarget::canDirectlyComparePointers() const {
98-
return !SPVTranslatorCompat && isAtLeastVer(SPIRVVersion, 14);
119+
return !SPVTranslatorCompat && isAtLeastVer(SPIRVVersion, VersionTuple(1, 4));
99120
}
100121

101122
void SPIRVSubtarget::initAvailableExtensions() {

llvm/lib/Target/SPIRV/SPIRVSubtarget.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ class SPIRVTargetMachine;
3737
class SPIRVSubtarget : public SPIRVGenSubtargetInfo {
3838
private:
3939
const unsigned PointerSize;
40-
uint32_t SPIRVVersion;
41-
uint32_t OpenCLVersion;
40+
VersionTuple SPIRVVersion;
41+
VersionTuple OpenCLVersion;
4242

4343
SmallSet<SPIRV::Extension::Extension, 4> AvailableExtensions;
4444
SmallSet<SPIRV::InstructionSet::InstructionSet, 4> AvailableExtInstSets;
@@ -81,9 +81,9 @@ class SPIRVSubtarget : public SPIRVGenSubtargetInfo {
8181
TargetTriple.getArch() == Triple::spirv64;
8282
}
8383
bool isVulkanEnv() const { return TargetTriple.getArch() == Triple::spirv; }
84-
uint32_t getSPIRVVersion() const { return SPIRVVersion; };
85-
bool isAtLeastSPIRVVer(uint32_t VerToCompareTo) const;
86-
bool isAtLeastOpenCLVer(uint32_t VerToCompareTo) const;
84+
VersionTuple getSPIRVVersion() const { return SPIRVVersion; };
85+
bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const;
86+
bool isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const;
8787
// TODO: implement command line args or other ways to determine this.
8888
bool hasOpenCLFullProfile() const { return true; }
8989
bool hasOpenCLImageSupport() const { return true; }

llvm/lib/TargetParser/Triple.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -558,9 +558,11 @@ static Triple::ArchType parseArch(StringRef ArchName) {
558558
.Case("spir64", Triple::spir64)
559559
.Cases("spirv", "spirv1.5", "spirv1.6", Triple::spirv)
560560
.Cases("spirv32", "spirv32v1.0", "spirv32v1.1", "spirv32v1.2",
561-
"spirv32v1.3", "spirv32v1.4", "spirv32v1.5", Triple::spirv32)
561+
"spirv32v1.3", "spirv32v1.4", "spirv32v1.5",
562+
"spirv32v1.6", Triple::spirv32)
562563
.Cases("spirv64", "spirv64v1.0", "spirv64v1.1", "spirv64v1.2",
563-
"spirv64v1.3", "spirv64v1.4", "spirv64v1.5", Triple::spirv64)
564+
"spirv64v1.3", "spirv64v1.4", "spirv64v1.5",
565+
"spirv64v1.6", Triple::spirv64)
564566
.StartsWith("kalimba", Triple::kalimba)
565567
.Case("lanai", Triple::lanai)
566568
.Case("renderscript32", Triple::renderscript32)

llvm/test/CodeGen/SPIRV/ComparePointers.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
; RUN: llc -O0 -mtriple=spirv64-unknown-unknown --mattr=+spirv1.3 %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
2-
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
1+
; RUN: llc -O0 -mtriple=spirv64v1.3-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64v1.3-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

44
;; kernel void test(int global *in, int global *in2) {
55
;; if (!in)

llvm/test/CodeGen/SPIRV/empty-opencl32.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

4-
;; FIXME: ensure Magic Number, version number, generator's magic number, "bound" and "schema" are at least present
5-
64
;; Ensure the required Capabilities are listed.
75
; CHECK-DAG: OpCapability Kernel
86
; CHECK-DAG: OpCapability Addresses

llvm/test/CodeGen/SPIRV/exec_mode_float_control_khr.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=SPV
2-
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s --mattr=+spirv1.3 --spirv-ext=+SPV_KHR_float_controls -o - | FileCheck %s --check-prefixes=SPVEXT
1+
; RUN: llc -O0 -mtriple=spirv32v1.3-unknown-unknown %s -o - | FileCheck %s --check-prefixes=SPV
2+
; RUN: llc -O0 -mtriple=spirv32v1.3-unknown-unknown %s --spirv-ext=+SPV_KHR_float_controls -o - | FileCheck %s --check-prefixes=SPVEXT
33

44
define dso_local dllexport spir_kernel void @k_float_controls_0(i32 %ibuf, i32 %obuf) local_unnamed_addr {
55
entry:
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
; REQUIRES: spirv-tools
2+
; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - --filetype=obj | spirv-dis | FileCheck %s
3+
4+
; CHECK: Generator: {{.*}}{{43|LLVM SPIR-V Backend}}{{.*}}

0 commit comments

Comments
 (0)