@@ -5066,35 +5066,54 @@ bool isValidLLVMModule(Module *M, SPIRVErrorLog &ErrorLog) {
5066
5066
return true ;
5067
5067
}
5068
5068
5069
- bool llvm::writeSpirv (Module *M, std::ostream &OS, std::string &ErrMsg) {
5070
- SPIRV::TranslatorOpts DefaultOpts;
5071
- // To preserve old behavior of the translator, let's enable all extensions
5072
- // by default in this API
5073
- DefaultOpts. enableAllExtensions ();
5074
- return llvm::writeSpirv (M, DefaultOpts, OS, ErrMsg);
5075
- }
5069
+ namespace {
5070
+
5071
+ bool runSpirvWriterPasses (Module *M, std::ostream *OS, std::string &ErrMsg,
5072
+ const SPIRV::TranslatorOpts &Opts) {
5073
+ // Perform the conversion and write the resulting SPIR-V if an ostream has
5074
+ // been given; otherwise only perform regularization.
5075
+ bool WriteSpirv = OS != nullptr ;
5076
5076
5077
- bool llvm::writeSpirv (Module *M, const SPIRV::TranslatorOpts &Opts,
5078
- std::ostream &OS, std::string &ErrMsg) {
5079
5077
std::unique_ptr<SPIRVModule> BM (SPIRVModule::createSPIRVModule (Opts));
5080
5078
if (!isValidLLVMModule (M, BM->getErrorLog ()))
5081
5079
return false ;
5082
5080
5083
5081
legacy::PassManager PassMgr;
5084
5082
addPassesForSPIRV (PassMgr, Opts);
5085
- // Run loop simplify pass in order to avoid duplicate OpLoopMerge
5086
- // instruction. It can happen in case of continue operand in the loop.
5087
- if (hasLoopMetadata (M))
5088
- PassMgr.add (createLoopSimplifyPass ());
5089
- PassMgr.add (createLLVMToSPIRVLegacy (BM.get ()));
5083
+ if (WriteSpirv) {
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 ()));
5089
+ }
5090
+
5090
5091
PassMgr.run (*M);
5091
5092
5092
5093
if (BM->getError (ErrMsg) != SPIRVEC_Success)
5093
5094
return false ;
5094
- OS << *BM;
5095
+
5096
+ if (WriteSpirv)
5097
+ *OS << *BM;
5098
+
5095
5099
return true ;
5096
5100
}
5097
5101
5102
+ } // namespace
5103
+
5104
+ bool llvm::writeSpirv (Module *M, std::ostream &OS, std::string &ErrMsg) {
5105
+ SPIRV::TranslatorOpts DefaultOpts;
5106
+ // To preserve old behavior of the translator, let's enable all extensions
5107
+ // by default in this API
5108
+ DefaultOpts.enableAllExtensions ();
5109
+ return llvm::writeSpirv (M, DefaultOpts, OS, ErrMsg);
5110
+ }
5111
+
5112
+ bool llvm::writeSpirv (Module *M, const SPIRV::TranslatorOpts &Opts,
5113
+ std::ostream &OS, std::string &ErrMsg) {
5114
+ return runSpirvWriterPasses (M, &OS, ErrMsg, Opts);
5115
+ }
5116
+
5098
5117
bool llvm::regularizeLlvmForSpirv (Module *M, std::string &ErrMsg) {
5099
5118
SPIRV::TranslatorOpts DefaultOpts;
5100
5119
// To preserve old behavior of the translator, let's enable all extensions
@@ -5105,12 +5124,5 @@ bool llvm::regularizeLlvmForSpirv(Module *M, std::string &ErrMsg) {
5105
5124
5106
5125
bool llvm::regularizeLlvmForSpirv (Module *M, std::string &ErrMsg,
5107
5126
const SPIRV::TranslatorOpts &Opts) {
5108
- std::unique_ptr<SPIRVModule> BM (SPIRVModule::createSPIRVModule ());
5109
- if (!isValidLLVMModule (M, BM->getErrorLog ()))
5110
- return false ;
5111
-
5112
- legacy::PassManager PassMgr;
5113
- addPassesForSPIRV (PassMgr, Opts);
5114
- PassMgr.run (*M);
5115
- return true ;
5127
+ return runSpirvWriterPasses (M, nullptr , ErrMsg, Opts);
5116
5128
}
0 commit comments