Skip to content

Commit a895567

Browse files
svenvhdwoodwor-intel
authored andcommitted
Use only one PassManager in SPIRVWriter
Factor out common code, in preparation of transitioning SPIRVWriter to the new PassManager. Original commit: KhronosGroup/SPIRV-LLVM-Translator@dc9e645
1 parent f577893 commit a895567

File tree

1 file changed

+35
-23
lines changed

1 file changed

+35
-23
lines changed

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5065,35 +5065,54 @@ bool isValidLLVMModule(Module *M, SPIRVErrorLog &ErrorLog) {
50655065
return true;
50665066
}
50675067

5068-
bool llvm::writeSpirv(Module *M, std::ostream &OS, std::string &ErrMsg) {
5069-
SPIRV::TranslatorOpts DefaultOpts;
5070-
// To preserve old behavior of the translator, let's enable all extensions
5071-
// by default in this API
5072-
DefaultOpts.enableAllExtensions();
5073-
return llvm::writeSpirv(M, DefaultOpts, OS, ErrMsg);
5074-
}
5068+
namespace {
5069+
5070+
bool runSpirvWriterPasses(Module *M, std::ostream *OS, std::string &ErrMsg,
5071+
const SPIRV::TranslatorOpts &Opts) {
5072+
// Perform the conversion and write the resulting SPIR-V if an ostream has
5073+
// been given; otherwise only perform regularization.
5074+
bool WriteSpirv = OS != nullptr;
50755075

5076-
bool llvm::writeSpirv(Module *M, const SPIRV::TranslatorOpts &Opts,
5077-
std::ostream &OS, std::string &ErrMsg) {
50785076
std::unique_ptr<SPIRVModule> BM(SPIRVModule::createSPIRVModule(Opts));
50795077
if (!isValidLLVMModule(M, BM->getErrorLog()))
50805078
return false;
50815079

50825080
legacy::PassManager PassMgr;
50835081
addPassesForSPIRV(PassMgr, Opts);
5084-
// Run loop simplify pass in order to avoid duplicate OpLoopMerge
5085-
// instruction. It can happen in case of continue operand in the loop.
5086-
if (hasLoopMetadata(M))
5087-
PassMgr.add(createLoopSimplifyPass());
5088-
PassMgr.add(createLLVMToSPIRVLegacy(BM.get()));
5082+
if (WriteSpirv) {
5083+
// Run loop simplify pass in order to avoid duplicate OpLoopMerge
5084+
// instruction. It can happen in case of continue operand in the loop.
5085+
if (hasLoopMetadata(M))
5086+
PassMgr.add(createLoopSimplifyPass());
5087+
PassMgr.add(createLLVMToSPIRVLegacy(BM.get()));
5088+
}
5089+
50895090
PassMgr.run(*M);
50905091

50915092
if (BM->getError(ErrMsg) != SPIRVEC_Success)
50925093
return false;
5093-
OS << *BM;
5094+
5095+
if (WriteSpirv)
5096+
*OS << *BM;
5097+
50945098
return true;
50955099
}
50965100

5101+
} // namespace
5102+
5103+
bool llvm::writeSpirv(Module *M, std::ostream &OS, std::string &ErrMsg) {
5104+
SPIRV::TranslatorOpts DefaultOpts;
5105+
// To preserve old behavior of the translator, let's enable all extensions
5106+
// by default in this API
5107+
DefaultOpts.enableAllExtensions();
5108+
return llvm::writeSpirv(M, DefaultOpts, OS, ErrMsg);
5109+
}
5110+
5111+
bool llvm::writeSpirv(Module *M, const SPIRV::TranslatorOpts &Opts,
5112+
std::ostream &OS, std::string &ErrMsg) {
5113+
return runSpirvWriterPasses(M, &OS, ErrMsg, Opts);
5114+
}
5115+
50975116
bool llvm::regularizeLlvmForSpirv(Module *M, std::string &ErrMsg) {
50985117
SPIRV::TranslatorOpts DefaultOpts;
50995118
// To preserve old behavior of the translator, let's enable all extensions
@@ -5104,12 +5123,5 @@ bool llvm::regularizeLlvmForSpirv(Module *M, std::string &ErrMsg) {
51045123

51055124
bool llvm::regularizeLlvmForSpirv(Module *M, std::string &ErrMsg,
51065125
const SPIRV::TranslatorOpts &Opts) {
5107-
std::unique_ptr<SPIRVModule> BM(SPIRVModule::createSPIRVModule());
5108-
if (!isValidLLVMModule(M, BM->getErrorLog()))
5109-
return false;
5110-
5111-
legacy::PassManager PassMgr;
5112-
addPassesForSPIRV(PassMgr, Opts);
5113-
PassMgr.run(*M);
5114-
return true;
5126+
return runSpirvWriterPasses(M, nullptr, ErrMsg, Opts);
51155127
}

0 commit comments

Comments
 (0)