@@ -5065,35 +5065,54 @@ bool isValidLLVMModule(Module *M, SPIRVErrorLog &ErrorLog) {
5065
5065
return true ;
5066
5066
}
5067
5067
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 ;
5075
5075
5076
- bool llvm::writeSpirv (Module *M, const SPIRV::TranslatorOpts &Opts,
5077
- std::ostream &OS, std::string &ErrMsg) {
5078
5076
std::unique_ptr<SPIRVModule> BM (SPIRVModule::createSPIRVModule (Opts));
5079
5077
if (!isValidLLVMModule (M, BM->getErrorLog ()))
5080
5078
return false ;
5081
5079
5082
5080
legacy::PassManager PassMgr;
5083
5081
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
+
5089
5090
PassMgr.run (*M);
5090
5091
5091
5092
if (BM->getError (ErrMsg) != SPIRVEC_Success)
5092
5093
return false ;
5093
- OS << *BM;
5094
+
5095
+ if (WriteSpirv)
5096
+ *OS << *BM;
5097
+
5094
5098
return true ;
5095
5099
}
5096
5100
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
+
5097
5116
bool llvm::regularizeLlvmForSpirv (Module *M, std::string &ErrMsg) {
5098
5117
SPIRV::TranslatorOpts DefaultOpts;
5099
5118
// To preserve old behavior of the translator, let's enable all extensions
@@ -5104,12 +5123,5 @@ bool llvm::regularizeLlvmForSpirv(Module *M, std::string &ErrMsg) {
5104
5123
5105
5124
bool llvm::regularizeLlvmForSpirv (Module *M, std::string &ErrMsg,
5106
5125
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);
5115
5127
}
0 commit comments