Skip to content

Commit 827214b

Browse files
Introduce support of the LLVM SPIR-V Backend to translate LLVM IR to SPIR-V
1 parent 2213528 commit 827214b

File tree

3 files changed

+119
-9
lines changed

3 files changed

+119
-9
lines changed

scripts/compile-triton.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ build_llvm() {
132132
-DCMAKE_BUILD_TYPE=Release \
133133
-DLLVM_ENABLE_ASSERTIONS=true \
134134
-DLLVM_ENABLE_PROJECTS="mlir" \
135+
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=SPIRV \
136+
-DLLVM_PARALLEL_LINK_JOBS=4 \
135137
-DLLVM_TARGETS_TO_BUILD="X86;NVPTX;AMDGPU" \
136138
-DLLVM_INSTALL_UTILS=true \
137139
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \

third_party/intel/lib/Target/SPIRV/CMakeLists.txt

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,38 @@
11
# SPIRV-LLVM-Translator is required.
22
find_package(SPIRVToLLVMTranslator)
33

4-
add_mlir_translation_library(TritonSPIRV
5-
SPIRVTranslation.cpp
4+
# Check if there is the LLVM SPIR-V backend.
5+
is_llvm_target_library("SPIRV" spirv_present_result INCLUDED_TARGETS)
66

7-
LINK_COMPONENTS
8-
Core
7+
if(spirv_present_result)
8+
message(STATUS "Found SPIR-V Backend")
9+
add_compile_definitions(LLVM_SPIRV_BACKEND_TARGET_PRESENT)
10+
add_mlir_translation_library(TritonSPIRV
11+
SPIRVTranslation.cpp
912

10-
LINK_LIBS PUBLIC
11-
TritonLLVMIR
12-
# spirv tools
13-
LLVMSPIRVLib
14-
)
13+
LINK_COMPONENTS
14+
Core
15+
# spirv backend
16+
SPIRVCodeGen
17+
18+
LINK_LIBS PUBLIC
19+
TritonLLVMIR
20+
# spirv tools
21+
LLVMSPIRVLib
22+
)
23+
else()
24+
add_mlir_translation_library(TritonSPIRV
25+
SPIRVTranslation.cpp
26+
27+
LINK_COMPONENTS
28+
Core
29+
30+
LINK_LIBS PUBLIC
31+
TritonLLVMIR
32+
# spirv tools
33+
LLVMSPIRVLib
34+
)
35+
endif()
1536

1637
# Add SPIRV-LLVM-Translator include directory.
1738
target_include_directories(TritonSPIRV PRIVATE ${SPIRVToLLVMTranslator_INCLUDE_DIR})

third_party/intel/lib/Target/SPIRV/SPIRVTranslation.cpp

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,83 @@
1111
#include "llvm/Support/CommandLine.h"
1212
#include "llvm/Support/TargetSelect.h"
1313
#include "llvm/Target/TargetMachine.h"
14+
#include "llvm/TargetParser/Triple.h"
15+
16+
#if defined(LLVM_SPIRV_BACKEND_TARGET_PRESENT)
17+
namespace llvm {
18+
19+
using namespace llvm;
20+
using namespace SPIRV;
21+
22+
extern "C" bool
23+
SPIRVTranslateModule(Module *M, std::string &SpirvObj, std::string &ErrMsg,
24+
const std::vector<std::string> &AllowExtNames,
25+
const std::vector<std::string> &Opts);
26+
27+
static inline Triple::SubArchType
28+
spirvVersionToSubArch(SPIRV::VersionNumber VN) {
29+
switch (VN) {
30+
case SPIRV::VersionNumber::SPIRV_1_0:
31+
return Triple::SPIRVSubArch_v10;
32+
case VersionNumber::SPIRV_1_1:
33+
return Triple::SPIRVSubArch_v11;
34+
case VersionNumber::SPIRV_1_2:
35+
return Triple::SPIRVSubArch_v12;
36+
case VersionNumber::SPIRV_1_3:
37+
return Triple::SPIRVSubArch_v13;
38+
case VersionNumber::SPIRV_1_4:
39+
return Triple::SPIRVSubArch_v14;
40+
case VersionNumber::SPIRV_1_5:
41+
return Triple::SPIRVSubArch_v15;
42+
case VersionNumber::SPIRV_1_6:
43+
return Triple::SPIRVSubArch_v16;
44+
}
45+
return Triple::NoSubArch;
46+
}
47+
48+
bool runSpirvBackend(Module *M, std::string &Result, std::string &ErrMsg,
49+
const SPIRV::TranslatorOpts &TranslatorOpts) {
50+
static const std::string DefaultTriple = "spirv64v1.6-unknown-unknown";
51+
static const std::vector<std::string> Opts{
52+
"--avoid-spirv-capabilities", "Shader", "--translator-compatibility-mode",
53+
"--spirv-ext=all"};
54+
static const std::vector<std::string> AllowExtNames;
55+
56+
// Correct the Triple value if needed
57+
Triple TargetTriple(M->getTargetTriple());
58+
if (TargetTriple.isSPIR()) {
59+
TargetTriple.setArch(TargetTriple.getArch() == Triple::spir64
60+
? Triple::spirv64
61+
: Triple::spirv32,
62+
TargetTriple.getSubArch());
63+
M->setTargetTriple(TargetTriple.str());
64+
// We need to reset Data Layout to conform with the TargetMachine
65+
M->setDataLayout("");
66+
}
67+
if (TranslatorOpts.getMaxVersion() != VersionNumber::MaximumVersion) {
68+
if (TargetTriple.getTriple().empty())
69+
TargetTriple.setTriple(DefaultTriple);
70+
TargetTriple.setArch(TargetTriple.getArch(),
71+
spirvVersionToSubArch(TranslatorOpts.getMaxVersion()));
72+
M->setTargetTriple(TargetTriple.str());
73+
}
74+
75+
// Translate the Module into SPIR-V
76+
return SPIRVTranslateModule(M, Result, ErrMsg, AllowExtNames, Opts);
77+
}
78+
79+
bool runSpirvBackend(Module *M, std::ostream *OS, std::string &ErrMsg,
80+
const SPIRV::TranslatorOpts &TranslatorOpts) {
81+
std::string Result;
82+
bool Status = runSpirvBackend(M, Result, ErrMsg, TranslatorOpts);
83+
if (Status && OS)
84+
*OS << Result;
85+
return Status;
86+
}
87+
88+
} // namespace llvm
89+
90+
#endif // LLVM_SPIRV_BACKEND_TARGET_PRESENT
1491

1592
namespace triton {
1693

@@ -63,7 +140,17 @@ std::string translateLLVMIRToSPIRV(llvm::Module &module) {
63140
SPIRVOpts.setPreserveOCLKernelArgTypeMetadataThroughString(true);
64141
SPIRVOpts.setPreserveAuxData(false);
65142
SPIRVOpts.setSPIRVAllowUnknownIntrinsics({"llvm.genx.GenISA."});
143+
144+
#if defined(LLVM_SPIRV_BACKEND_TARGET_PRESENT)
145+
int SpvTranslateMode = 0;
146+
if (const char *EnvIsBackend = std::getenv("TRITON_USE_SPIRV_BACKEND"))
147+
llvm::StringRef(EnvIsBackend).getAsInteger(10, SpvTranslateMode);
148+
auto success = SpvTranslateMode
149+
? llvm::runSpirvBackend(&module, &OS, Err, SPIRVOpts)
150+
: llvm::writeSpirv(&module, SPIRVOpts, OS, Err);
151+
#else
66152
auto success = llvm::writeSpirv(&module, SPIRVOpts, OS, Err);
153+
#endif // LLVM_SPIRV_BACKEND_TARGET_PRESENT
67154

68155
if (!success) {
69156
llvm::errs() << "SPIRVTranslation: SPIRV translation failed with"

0 commit comments

Comments
 (0)