Skip to content

Commit ff0f21d

Browse files
mdtoguchivladimirlaz
authored andcommitted
[SYCL] remove usage of SPIRV library and generate SPIRV binary via llvm-spirv
Signed-off-by: Vladimir Lazarev <[email protected]> Signed-off-by: Michael D Toguchi <[email protected]>
1 parent fbffaab commit ff0f21d

File tree

22 files changed

+102
-73
lines changed

22 files changed

+102
-73
lines changed

clang/include/clang/Basic/LangOptions.def

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,6 @@ LANGOPT(CUDADeviceApproxTranscendentals, 1, 0, "using approximate transcendental
218218
LANGOPT(GPURelocatableDeviceCode, 1, 0, "generate relocatable device code")
219219

220220
LANGOPT(SYCLIsDevice , 1, 0, "Generate code for SYCL device")
221-
LANGOPT(SYCLUseBitcode , 1, 0, "Generate bitcode for SYCL")
222221
LANGOPT(SYCLAllowFuncPtr , 1, 0, "Allow function pointers in SYCL device code")
223222

224223
LANGOPT(SizedDeallocation , 1, 0, "sized deallocation")

clang/include/clang/CodeGen/BackendUtil.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ namespace clang {
3030
enum BackendAction {
3131
Backend_EmitAssembly, ///< Emit native assembly files
3232
Backend_EmitBC, ///< Emit LLVM bitcode files
33-
Backend_EmitSPIRV, ///< Emit SPIR-V bitcode files
3433
Backend_EmitLL, ///< Emit human-readable LLVM assembly
3534
Backend_EmitNothing, ///< Don't emit anything (benchmarking mode)
3635
Backend_EmitMCNull, ///< Run CodeGen, but don't emit anything

clang/include/clang/CodeGen/CodeGenAction.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,6 @@ class EmitBCAction : public CodeGenAction {
9292
EmitBCAction(llvm::LLVMContext *_VMContext = nullptr);
9393
};
9494

95-
class EmitSPIRVAction : public CodeGenAction {
96-
virtual void anchor();
97-
public:
98-
EmitSPIRVAction(llvm::LLVMContext *_VMContext = nullptr);
99-
};
100-
10195
class EmitLLVMAction : public CodeGenAction {
10296
virtual void anchor();
10397
public:

clang/include/clang/Driver/Action.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,10 @@ class Action {
7272
OffloadBundlingJobClass,
7373
OffloadUnbundlingJobClass,
7474
OffloadWrappingJobClass,
75+
SPIRVTranslatorJobClass,
7576

7677
JobClassFirst = PreprocessJobClass,
77-
JobClassLast = OffloadWrappingJobClass
78+
JobClassLast = SPIRVTranslatorJobClass
7879
};
7980

8081
// The offloading kind determines if this action is binded to a particular
@@ -626,6 +627,17 @@ class OffloadWrappingJobAction : public JobAction {
626627
}
627628
};
628629

630+
class SPIRVTranslatorJobAction : public JobAction {
631+
void anchor() override;
632+
633+
public:
634+
SPIRVTranslatorJobAction(Action *Input, types::ID OutputType);
635+
636+
static bool classof(const Action *A) {
637+
return A->getKind() == SPIRVTranslatorJobClass;
638+
}
639+
};
640+
629641
} // namespace driver
630642
} // namespace clang
631643

clang/include/clang/Driver/ToolChain.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,15 @@ class ToolChain {
130130
mutable std::unique_ptr<Tool> Link;
131131
mutable std::unique_ptr<Tool> OffloadBundler;
132132
mutable std::unique_ptr<Tool> OffloadWrapper;
133+
mutable std::unique_ptr<Tool> SPIRVTranslator;
133134

134135
Tool *getClang() const;
135136
Tool *getAssemble() const;
136137
Tool *getLink() const;
137138
Tool *getClangAs() const;
138139
Tool *getOffloadBundler() const;
139140
Tool *getOffloadWrapper() const;
141+
Tool *getSPIRVTranslator() const;
140142

141143
mutable std::unique_ptr<SanitizerArgs> SanitizerArguments;
142144
mutable std::unique_ptr<XRayArgs> XRayArguments;

clang/include/clang/Frontend/FrontendOptions.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ enum ActionKind {
5757
/// Emit a .bc file.
5858
EmitBC,
5959

60-
/// Emit a .spv file.
61-
EmitSPIRV,
62-
6360
/// Translate input source into HTML.
6461
EmitHTML,
6562

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@
7070
#include "llvm/SYCL/ASFixer.h"
7171
#include <memory>
7272

73-
#include "LLVMSPIRVLib.h"
7473
namespace SPIRV {
7574
extern llvm::cl::opt<bool> SPIRVNoDerefAttr;
7675
}
@@ -807,7 +806,6 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action,
807806

808807
bool UsesCodeGen = (Action != Backend_EmitNothing &&
809808
Action != Backend_EmitBC &&
810-
Action != Backend_EmitSPIRV &&
811809
Action != Backend_EmitLL);
812810
CreateTargetMachine(UsesCodeGen);
813811

@@ -841,6 +839,10 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action,
841839
break;
842840

843841
case Backend_EmitBC:
842+
if (LangOpts.SYCLIsDevice) {
843+
PerModulePasses.add(createASFixerPass());
844+
PerModulePasses.add(createDeadCodeEliminationPass());
845+
}
844846
if (CodeGenOpts.PrepareForThinLTO && !CodeGenOpts.DisableLLVMPasses) {
845847
if (!CodeGenOpts.ThinLinkBitcodeFile.empty()) {
846848
ThinLinkOS = openOutputFile(CodeGenOpts.ThinLinkBitcodeFile);
@@ -871,24 +873,6 @@ void EmitAssemblyHelper::EmitAssembly(BackendAction Action,
871873
}
872874
break;
873875

874-
case Backend_EmitSPIRV:
875-
if (LangOpts.SYCLIsDevice) {
876-
// TODO: SPIRVNoDerefAttr is not modeled when using the bitcode pass
877-
SPIRV::SPIRVNoDerefAttr = true;
878-
// TODO: this pass added to work around missing linkonce_odr in SPIR-V
879-
PerModulePasses.add(
880-
createAlwaysInlinerLegacyPass(true /*InsertLifetimeIntrinsics*/));
881-
PerModulePasses.add(createASFixerPass());
882-
PerModulePasses.add(createDeadCodeEliminationPass());
883-
}
884-
if (LangOpts.SYCLUseBitcode)
885-
PerModulePasses.add(
886-
createBitcodeWriterPass(*OS, CodeGenOpts.EmitLLVMUseLists, false));
887-
else
888-
PerModulePasses.add(createSPIRVWriterPass(*OS));
889-
890-
break;
891-
892876
case Backend_EmitLL:
893877
PerModulePasses.add(
894878
createPrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists));
@@ -1203,6 +1187,10 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
12031187
break;
12041188

12051189
case Backend_EmitBC:
1190+
if (LangOpts.SYCLIsDevice) {
1191+
CodeGenPasses.add(createASFixerPass());
1192+
CodeGenPasses.add(createDeadCodeEliminationPass());
1193+
}
12061194
if (CodeGenOpts.PrepareForThinLTO && !CodeGenOpts.DisableLLVMPasses) {
12071195
if (!CodeGenOpts.ThinLinkBitcodeFile.empty()) {
12081196
ThinLinkOS = openOutputFile(CodeGenOpts.ThinLinkBitcodeFile);
@@ -1232,18 +1220,6 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
12321220
}
12331221
break;
12341222

1235-
case Backend_EmitSPIRV:
1236-
if (LangOpts.SYCLIsDevice) {
1237-
SPIRV::SPIRVNoDerefAttr = true;
1238-
// TODO: this pass added to work around missing linkonce_odr in SPIR-V
1239-
CodeGenPasses.add(
1240-
createAlwaysInlinerLegacyPass(true /*InsertLifetimeIntrinsics*/));
1241-
CodeGenPasses.add(createASFixerPass());
1242-
CodeGenPasses.add(createDeadCodeEliminationPass());
1243-
}
1244-
CodeGenPasses.add(createSPIRVWriterPass(*OS));
1245-
break;
1246-
12471223
case Backend_EmitLL:
12481224
MPM.addPass(PrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists));
12491225
break;

clang/lib/CodeGen/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ set(LLVM_LINK_COMPONENTS
2424
Target
2525
TransformUtils
2626
ASFixer
27-
SPIRVLib
2827
)
2928

3029
# In a standard Clang+LLVM build, we need to generate intrinsics before

clang/lib/CodeGen/CodeGenAction.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -836,8 +836,6 @@ GetOutputStream(CompilerInstance &CI, StringRef InFile, BackendAction Action) {
836836
return CI.createDefaultOutputFile(false, InFile, "ll");
837837
case Backend_EmitBC:
838838
return CI.createDefaultOutputFile(true, InFile, "bc");
839-
case Backend_EmitSPIRV:
840-
return CI.createDefaultOutputFile(true, InFile, "spv");
841839
case Backend_EmitNothing:
842840
return nullptr;
843841
case Backend_EmitMCNull:
@@ -1059,10 +1057,6 @@ void EmitBCAction::anchor() { }
10591057
EmitBCAction::EmitBCAction(llvm::LLVMContext *_VMContext)
10601058
: CodeGenAction(Backend_EmitBC, _VMContext) {}
10611059

1062-
void EmitSPIRVAction::anchor() { }
1063-
EmitSPIRVAction::EmitSPIRVAction(llvm::LLVMContext *_VMContext)
1064-
: CodeGenAction(Backend_EmitSPIRV, _VMContext) {}
1065-
10661060
void EmitLLVMAction::anchor() { }
10671061
EmitLLVMAction::EmitLLVMAction(llvm::LLVMContext *_VMContext)
10681062
: CodeGenAction(Backend_EmitLL, _VMContext) {}

clang/lib/Driver/Action.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,3 +415,9 @@ void OffloadWrappingJobAction::anchor() {}
415415
OffloadWrappingJobAction::OffloadWrappingJobAction(Action *Input,
416416
types::ID Type)
417417
: JobAction(OffloadWrappingJobClass, Input, Type) {}
418+
419+
void SPIRVTranslatorJobAction::anchor() {}
420+
421+
SPIRVTranslatorJobAction::SPIRVTranslatorJobAction(Action *Input,
422+
types::ID Type)
423+
: JobAction(SPIRVTranslatorJobClass, Input, Type) {}

clang/lib/Driver/Driver.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3853,7 +3853,15 @@ Action *Driver::ConstructPhaseAction(
38533853
return C.MakeAction<BackendJobAction>(Input, Output);
38543854
}
38553855
if (Args.hasArg(options::OPT_sycl)) {
3856-
return C.MakeAction<BackendJobAction>(Input, types::TY_SPIRV);
3856+
if (Args.hasFlag(options::OPT_fsycl_use_bitcode,
3857+
options::OPT_fno_sycl_use_bitcode, true))
3858+
return C.MakeAction<BackendJobAction>(Input, types::TY_LLVM_BC);
3859+
// Use of --sycl creates a bitcode file, we need to translate that to
3860+
// a SPIR-V file with -fno-sycl-use-bitcode
3861+
auto *BackendAction =
3862+
C.MakeAction<BackendJobAction>(Input, types::TY_LLVM_BC);
3863+
return C.MakeAction<SPIRVTranslatorJobAction>(BackendAction,
3864+
types::TY_SPIRV);
38573865
}
38583866
return C.MakeAction<BackendJobAction>(Input, types::TY_PP_Asm);
38593867
}

clang/lib/Driver/ToolChain.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,12 @@ Tool *ToolChain::getOffloadWrapper() const {
291291
return OffloadWrapper.get();
292292
}
293293

294+
Tool *ToolChain::getSPIRVTranslator() const {
295+
if (!SPIRVTranslator)
296+
SPIRVTranslator.reset(new tools::SPIRVTranslator(*this));
297+
return SPIRVTranslator.get();
298+
}
299+
294300
Tool *ToolChain::getTool(Action::ActionClass AC) const {
295301
switch (AC) {
296302
case Action::AssembleJobClass:
@@ -323,6 +329,9 @@ Tool *ToolChain::getTool(Action::ActionClass AC) const {
323329

324330
case Action::OffloadWrappingJobClass:
325331
return getOffloadWrapper();
332+
333+
case Action::SPIRVTranslatorJobClass:
334+
return getSPIRVTranslator();
326335
}
327336

328337
llvm_unreachable("Invalid tool kind.");

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3546,10 +3546,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
35463546
CmdArgs.push_back("-aux-triple");
35473547
CmdArgs.push_back(Args.MakeArgString(NormalizedTriple));
35483548
CmdArgs.push_back("-disable-llvm-passes");
3549-
if (Args.hasFlag(options::OPT_fsycl_use_bitcode,
3550-
options::OPT_fno_sycl_use_bitcode, true)) {
3551-
CmdArgs.push_back("-fsycl-use-bitcode");
3552-
}
35533549
if (Args.hasFlag(options::OPT_fsycl_allow_func_ptr,
35543550
options::OPT_fno_sycl_allow_func_ptr, false)) {
35553551
CmdArgs.push_back("-fsycl-allow-func-ptr");
@@ -3600,7 +3596,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
36003596
}
36013597
} else if (isa<AssembleJobAction>(JA)) {
36023598
if (IsSYCLOffloadDevice && IsSYCLDevice) {
3603-
CmdArgs.push_back("-emit-spirv");
3599+
CmdArgs.push_back("-emit-llvm-bc");
36043600
} else {
36053601
CmdArgs.push_back("-emit-obj");
36063602
CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
@@ -3643,8 +3639,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
36433639
} else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
36443640
CmdArgs.push_back("-rewrite-objc");
36453641
rewriteKind = RK_Fragile;
3646-
} else if (JA.getType() == types::TY_SPIRV) {
3647-
CmdArgs.push_back("-emit-spirv");
36483642
} else {
36493643
assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
36503644
}
@@ -6430,3 +6424,30 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA,
64306424
C.addCommand(llvm::make_unique<Command>(JA, *this, Llc, LlcArgs, None));
64316425
}
64326426

6427+
// Begin SPIRVTranslator
6428+
6429+
void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA,
6430+
const InputInfo &Output,
6431+
const InputInfoList &Inputs,
6432+
const llvm::opt::ArgList &TCArgs,
6433+
const char *LinkingOutput) const {
6434+
// Construct llvm-spirv command.
6435+
assert(isa<SPIRVTranslatorJobAction>(JA) && "Expecting Translator job!");
6436+
6437+
// The translator command looks like this:
6438+
// llvm-spirv -o <file>.spv <file>.bc
6439+
ArgStringList TranslatorArgs;
6440+
6441+
TranslatorArgs.push_back("-o");
6442+
TranslatorArgs.push_back(Output.getFilename());
6443+
if (getToolChain().getTriple().isSYCLDeviceEnvironment())
6444+
TranslatorArgs.push_back("-spirv-no-deref-attr");
6445+
for (auto I : Inputs) {
6446+
TranslatorArgs.push_back(I.getFilename());
6447+
}
6448+
6449+
C.addCommand(llvm::make_unique<Command>(JA, *this,
6450+
TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())),
6451+
TranslatorArgs, None));
6452+
}
6453+

clang/lib/Driver/ToolChains/Clang.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,19 @@ class LLVM_LIBRARY_VISIBILITY OffloadWrapper final : public Tool {
159159
const llvm::opt::ArgList &TCArgs,
160160
const char *LinkingOutput) const override;
161161
};
162+
163+
/// SPIR-V translator tool.
164+
class LLVM_LIBRARY_VISIBILITY SPIRVTranslator final : public Tool {
165+
public:
166+
SPIRVTranslator(const ToolChain &TC)
167+
: Tool("SPIR-V translator", "llvm-spirv", TC) {}
168+
169+
bool hasIntegratedCPP() const override { return false; }
170+
void ConstructJob(Compilation &C, const JobAction &JA,
171+
const InputInfo &Output, const InputInfoList &Inputs,
172+
const llvm::opt::ArgList &TCArgs,
173+
const char *LinkingOutput) const override;
174+
};
162175
} // end namespace tools
163176

164177
} // end namespace driver

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,8 +1190,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
11901190
}
11911191
}
11921192

1193-
Opts.EmitOpenCLArgMetadata |= Args.hasArg(OPT_emit_spirv);
1194-
11951193
if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
11961194
StringRef Val = A->getValue();
11971195
if (Val == "ieee")
@@ -1619,8 +1617,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
16191617
Opts.ProgramAction = frontend::EmitAssembly; break;
16201618
case OPT_emit_llvm_bc:
16211619
Opts.ProgramAction = frontend::EmitBC; break;
1622-
case OPT_emit_spirv:
1623-
Opts.ProgramAction = frontend::EmitSPIRV; break;
16241620
case OPT_emit_html:
16251621
Opts.ProgramAction = frontend::EmitHTML; break;
16261622
case OPT_emit_llvm:
@@ -2891,8 +2887,6 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
28912887
}
28922888

28932889
Opts.SYCLIsDevice = Args.hasArg(options::OPT_fsycl_is_device);
2894-
Opts.SYCLUseBitcode = Args.hasFlag(options::OPT_fsycl_use_bitcode,
2895-
options::OPT_fno_sycl_use_bitcode, false);
28962890
Opts.SYCLAllowFuncPtr = Args.hasFlag(options::OPT_fsycl_allow_func_ptr,
28972891
options::OPT_fno_sycl_allow_func_ptr, false);
28982892

@@ -3055,7 +3049,6 @@ static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) {
30553049
case frontend::ASTView:
30563050
case frontend::EmitAssembly:
30573051
case frontend::EmitBC:
3058-
case frontend::EmitSPIRV:
30593052
case frontend::EmitHTML:
30603053
case frontend::EmitLLVM:
30613054
case frontend::EmitLLVMOnly:

clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ CreateFrontendBaseAction(CompilerInstance &CI) {
5151
case DumpTokens: return llvm::make_unique<DumpTokensAction>();
5252
case EmitAssembly: return llvm::make_unique<EmitAssemblyAction>();
5353
case EmitBC: return llvm::make_unique<EmitBCAction>();
54-
case EmitSPIRV: return llvm::make_unique<EmitSPIRVAction>();
5554
case EmitHTML: return llvm::make_unique<HTMLPrintAction>();
5655
case EmitLLVM: return llvm::make_unique<EmitLLVMAction>();
5756
case EmitLLVMOnly: return llvm::make_unique<EmitLLVMOnlyAction>();

clang/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ if( NOT CLANG_BUILT_STANDALONE )
112112
llvm-objdump
113113
llvm-profdata
114114
llvm-readobj
115+
llvm-spirv
115116
llvm-symbolizer
116117
opt
117118
)

clang/test/CodeGenSPIRV/intel/is_valid_event.cl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
// Builtins must be declared as overloadable, so Clang mangles their names,
44
// and LLVM-SPIRV translator can recognize them.
55

6-
// RUN: %clang_cc1 %s -emit-spirv -triple spir-unknown-unknown -O0 -cl-std=CL2.0 -include opencl-c.h -o %t.spv
6+
// RUN: %clang_cc1 %s -emit-llvm-bc -triple spir-unknown-unknown -O0 -cl-std=CL2.0 -include opencl-c.h -o %t.bc
7+
// RUN: llvm-spirv %t.bc -o %t.spv
78
// RUN: llvm-spirv -to-text %t.spv -o - | FileCheck %s
89

910
// CHECK: CreateUserEvent

clang/test/CodeGenSPIRV/intel/private-array-initialization.cl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// RUN: %clang_cc1 %s -triple spir-unknown-unknown -O0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-LLVM
2-
// RUN: %clang_cc1 %s -triple spir-unknown-unknown -O0 -emit-spirv -o %t.spv
2+
// RUN: %clang_cc1 %s -triple spir-unknown-unknown -O0 -emit-llvm-bc -o %t.bc
3+
// RUN: llvm-spirv %t.bc -o %t.spv
34
// RUN: llvm-spirv %t.spv -to-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
45

56
// CHECK-LLVM: @__const.test.arr = private unnamed_addr addrspace(2) constant [3 x i32] [i32 1, i32 2, i32 3], align 4

0 commit comments

Comments
 (0)