Skip to content

Commit 522d8f9

Browse files
committed
Use SPIR-V subarch version if present in triple
1 parent 82f31a3 commit 522d8f9

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5176,6 +5176,24 @@ bool isValidLLVMModule(Module *M, SPIRVErrorLog &ErrorLog) {
51765176

51775177
namespace {
51785178

5179+
VersionNumber getVersionFromTriple(const Triple &TT, SPIRVErrorLog &ErrorLog) {
5180+
switch (TT.getSubArch()) {
5181+
case Triple::SPIRVSubArch_v10:
5182+
return VersionNumber::SPIRV_1_0;
5183+
case Triple::SPIRVSubArch_v11:
5184+
return VersionNumber::SPIRV_1_1;
5185+
case Triple::SPIRVSubArch_v12:
5186+
return VersionNumber::SPIRV_1_2;
5187+
case Triple::SPIRVSubArch_v13:
5188+
return VersionNumber::SPIRV_1_3;
5189+
case Triple::SPIRVSubArch_v14:
5190+
return VersionNumber::SPIRV_1_4;
5191+
default:
5192+
ErrorLog.checkError(false, SPIRVEC_InvalidSubArch, TT.getArchName().str());
5193+
return VersionNumber::MaximumVersion;
5194+
}
5195+
}
5196+
51795197
bool runSpirvWriterPasses(Module *M, std::ostream *OS, std::string &ErrMsg,
51805198
const SPIRV::TranslatorOpts &Opts) {
51815199
// Perform the conversion and write the resulting SPIR-V if an ostream has
@@ -5186,6 +5204,20 @@ bool runSpirvWriterPasses(Module *M, std::ostream *OS, std::string &ErrMsg,
51865204
if (!isValidLLVMModule(M, BM->getErrorLog()))
51875205
return false;
51885206

5207+
// If the module carries a SPIR-V triple with a version subarch, target
5208+
// that SPIR-V version.
5209+
Triple TargetTriple(M->getTargetTriple());
5210+
if ((TargetTriple.getArch() == Triple::spirv32 ||
5211+
TargetTriple.getArch() == Triple::spirv64) &&
5212+
TargetTriple.getSubArch() != Triple::NoSubArch) {
5213+
VersionNumber ModuleVer =
5214+
getVersionFromTriple(TargetTriple, BM->getErrorLog());
5215+
if (!BM->getErrorLog().checkError(ModuleVer <= Opts.getMaxVersion(),
5216+
SPIRVEC_TripleMaxVersionIncompatible))
5217+
return false;
5218+
BM->setMinSPIRVVersion(static_cast<SPIRVWord>(ModuleVer));
5219+
}
5220+
51895221
ModulePassManager PassMgr;
51905222
addPassesForSPIRV(PassMgr, Opts);
51915223
if (WriteSpirv) {

lib/SPIRV/libSPIRV/SPIRVErrorEnum.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
_SPIRV_OP(Success, "")
33
_SPIRV_OP(InvalidTargetTriple,
44
"Expects spir-unknown-unknown or spir64-unknown-unknown.")
5+
_SPIRV_OP(InvalidSubArch, "Expecting v1.0-v1.4.")
6+
_SPIRV_OP(TripleMaxVersionIncompatible,
7+
"Triple version and maximum version are incompatible.")
58
_SPIRV_OP(InvalidAddressingModel, "Expects 0-2.")
69
_SPIRV_OP(InvalidMemoryModel, "Expects 0-3.")
710
_SPIRV_OP(InvalidFunctionControlMask, "")

test/spirv-triple-with-version.ll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
; RUN: llvm-as -opaque-pointers=0 %s -o %t.bc
2+
3+
; RUN: not llvm-spirv %t.bc -spirv-max-version=1.0 -o - -spirv-text 2>&1 | FileCheck %s --check-prefix=CHECK-INVALID
4+
; RUN: not llvm-spirv %t.bc -spirv-max-version=1.1 -o - -spirv-text 2>&1 | FileCheck %s --check-prefix=CHECK-INVALID
5+
6+
; RUN: llvm-spirv %t.bc -o - -spirv-text | FileCheck %s --check-prefix=CHECK12
7+
; RUN: llvm-spirv %t.bc -spirv-max-version=1.2 -o - -spirv-text | FileCheck %s --check-prefix=CHECK12
8+
; RUN: llvm-spirv %t.bc -spirv-max-version=1.3 -o - -spirv-text | FileCheck %s --check-prefix=CHECK12
9+
; RUN: llvm-spirv %t.bc -spirv-max-version=1.4 -o - -spirv-text | FileCheck %s --check-prefix=CHECK12
10+
11+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
12+
target triple = "spirv64v1.2-unknown-unknown"
13+
14+
; This is a module with a SPIR-V subarch. Ensure that the SPIR-V version specified as the subarch is taken into account by llvm-spirv.
15+
16+
; CHECK-INVALID: TripleMaxVersionIncompatible: Triple version and maximum version are incompatible.
17+
18+
; 66048 = 0x10200, i.e. version 1.2
19+
; CHECK12: 119734787 66048

0 commit comments

Comments
 (0)