Skip to content

Commit 899128a

Browse files
svenvhdwoodwor-intel
authored andcommitted
Use SPIR-V subarch version if present in triple
Original commit: KhronosGroup/SPIRV-LLVM-Translator@522d8f9
1 parent c1b23a3 commit 899128a

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

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

51805180
namespace {
51815181

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

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

llvm-spirv/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, "")
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)