diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-09-15 23:05:59 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-09-15 23:05:59 +0000 |
commit | cff5feff6fd6e18e73b97de41f9aa5da23ceee95 (patch) | |
tree | 33ceb04978a9c105fba18d6d4a3b9056c0f91330 | |
parent | c1603b64937c90f6b4515fe84f5f3c8779b56925 (diff) | |
download | bcm5719-llvm-cff5feff6fd6e18e73b97de41f9aa5da23ceee95.tar.gz bcm5719-llvm-cff5feff6fd6e18e73b97de41f9aa5da23ceee95.zip |
Reapply "LTO: Disable extra verify runs in release builds"
This reverts commit r247730, effectively reapplying r247729. This time
I have an lld commit ready to follow.
llvm-svn: 247735
-rw-r--r-- | llvm/include/llvm/LTO/LTOCodeGenerator.h | 10 | ||||
-rw-r--r-- | llvm/lib/LTO/LTOCodeGenerator.cpp | 21 | ||||
-rw-r--r-- | llvm/test/LTO/X86/disable-verify.ll | 18 | ||||
-rw-r--r-- | llvm/tools/llvm-lto/llvm-lto.cpp | 8 | ||||
-rw-r--r-- | llvm/tools/lto/lto.cpp | 22 |
5 files changed, 58 insertions, 21 deletions
diff --git a/llvm/include/llvm/LTO/LTOCodeGenerator.h b/llvm/include/llvm/LTO/LTOCodeGenerator.h index cf31bda6dc1..f69dfb1e7f6 100644 --- a/llvm/include/llvm/LTO/LTOCodeGenerator.h +++ b/llvm/include/llvm/LTO/LTOCodeGenerator.h @@ -110,9 +110,9 @@ struct LTOCodeGenerator { /// \note It is up to the linker to remove the intermediate object file. Do /// not try to remove the object file in LTOCodeGenerator's destructor as we /// don't who (LTOCodeGenerator or the obj file) will last longer. - bool compile_to_file(const char **Name, bool DisableInline, - bool DisableGVNLoadPRE, bool DisableVectorization, - std::string &ErrMsg); + bool compile_to_file(const char **Name, bool DisableVerify, + bool DisableInline, bool DisableGVNLoadPRE, + bool DisableVectorization, std::string &ErrMsg); /// As with compile_to_file(), this function compiles the merged module into /// single object file. Instead of returning the object-file-path to the @@ -120,13 +120,13 @@ struct LTOCodeGenerator { /// to the caller. This function should delete intermediate object file once /// its content is brought to memory. Return NULL if the compilation was not /// successful. - std::unique_ptr<MemoryBuffer> compile(bool DisableInline, + std::unique_ptr<MemoryBuffer> compile(bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE, bool DisableVectorization, std::string &errMsg); /// Optimizes the merged module. Returns true on success. - bool optimize(bool DisableInline, bool DisableGVNLoadPRE, + bool optimize(bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE, bool DisableVectorization, std::string &ErrMsg); /// Compiles the merged optimized module into a single object file. It brings diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp index 98266c32d90..8dcc53c8033 100644 --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -265,20 +265,24 @@ LTOCodeGenerator::compileOptimized(std::string &ErrMsg) { return std::move(*BufferOrErr); } -bool LTOCodeGenerator::compile_to_file(const char **Name, bool DisableInline, +bool LTOCodeGenerator::compile_to_file(const char **Name, bool DisableVerify, + bool DisableInline, bool DisableGVNLoadPRE, bool DisableVectorization, std::string &ErrMsg) { - if (!optimize(DisableInline, DisableGVNLoadPRE, DisableVectorization, ErrMsg)) + if (!optimize(DisableVerify, DisableInline, DisableGVNLoadPRE, + DisableVectorization, ErrMsg)) return false; return compileOptimizedToFile(Name, ErrMsg); } std::unique_ptr<MemoryBuffer> -LTOCodeGenerator::compile(bool DisableInline, bool DisableGVNLoadPRE, - bool DisableVectorization, std::string &ErrMsg) { - if (!optimize(DisableInline, DisableGVNLoadPRE, DisableVectorization, ErrMsg)) +LTOCodeGenerator::compile(bool DisableVerify, bool DisableInline, + bool DisableGVNLoadPRE, bool DisableVectorization, + std::string &ErrMsg) { + if (!optimize(DisableVerify, DisableInline, DisableGVNLoadPRE, + DisableVectorization, ErrMsg)) return nullptr; return compileOptimized(ErrMsg); @@ -459,7 +463,8 @@ void LTOCodeGenerator::applyScopeRestrictions() { } /// Optimize merged modules using various IPO passes -bool LTOCodeGenerator::optimize(bool DisableInline, bool DisableGVNLoadPRE, +bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline, + bool DisableGVNLoadPRE, bool DisableVectorization, std::string &ErrMsg) { if (!this->determineTarget(ErrMsg)) @@ -486,8 +491,8 @@ bool LTOCodeGenerator::optimize(bool DisableInline, bool DisableGVNLoadPRE, PMB.Inliner = createFunctionInliningPass(); PMB.LibraryInfo = new TargetLibraryInfoImpl(TargetTriple); PMB.OptLevel = OptLevel; - PMB.VerifyInput = true; - PMB.VerifyOutput = true; + PMB.VerifyInput = !DisableVerify; + PMB.VerifyOutput = !DisableVerify; PMB.populateLTOPassManager(passes); diff --git a/llvm/test/LTO/X86/disable-verify.ll b/llvm/test/LTO/X86/disable-verify.ll new file mode 100644 index 00000000000..5d2508a96c0 --- /dev/null +++ b/llvm/test/LTO/X86/disable-verify.ll @@ -0,0 +1,18 @@ +; RUN: llvm-as < %s >%t.bc +; RUN: llvm-lto -debug-pass=Arguments -exported-symbol=_f -o /dev/null %t.bc 2>&1 -disable-verify | FileCheck %s +; RUN: llvm-lto -debug-pass=Arguments -exported-symbol=_f -o /dev/null %t.bc 2>&1 | FileCheck %s -check-prefix=VERIFY + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.10.0" + +; -disable-verify should disable verification from the optimization pipeline. +; CHECK: Pass Arguments: -verify -internalize +; CHECK-NOT: -verify + +; VERIFY: Pass Arguments: -verify -internalize +; VERIFY: Pass Arguments: {{.*}} -verify {{.*}} -verify + +define void @f() { +entry: + ret void +} diff --git a/llvm/tools/llvm-lto/llvm-lto.cpp b/llvm/tools/llvm-lto/llvm-lto.cpp index cdb1bcaa6bc..50680ccb8ab 100644 --- a/llvm/tools/llvm-lto/llvm-lto.cpp +++ b/llvm/tools/llvm-lto/llvm-lto.cpp @@ -36,6 +36,10 @@ OptLevel("O", cl::ZeroOrMore, cl::init('2')); +static cl::opt<bool> DisableVerify( + "disable-verify", cl::init(false), + cl::desc("Do not run the verifier during the optimization pipeline")); + static cl::opt<bool> DisableInline("disable-inlining", cl::init(false), cl::desc("Do not run the inliner pass")); @@ -248,7 +252,7 @@ int main(int argc, char **argv) { if (!OutputFilename.empty()) { std::string ErrorInfo; - if (!CodeGen.optimize(DisableInline, DisableGVNLoadPRE, + if (!CodeGen.optimize(DisableVerify, DisableInline, DisableGVNLoadPRE, DisableLTOVectorization, ErrorInfo)) { errs() << argv[0] << ": error optimizing the code: " << ErrorInfo << "\n"; return 1; @@ -285,7 +289,7 @@ int main(int argc, char **argv) { std::string ErrorInfo; const char *OutputName = nullptr; - if (!CodeGen.compile_to_file(&OutputName, DisableInline, + if (!CodeGen.compile_to_file(&OutputName, DisableVerify, DisableInline, DisableGVNLoadPRE, DisableLTOVectorization, ErrorInfo)) { errs() << argv[0] diff --git a/llvm/tools/lto/lto.cpp b/llvm/tools/lto/lto.cpp index 8f62929b326..62675081464 100644 --- a/llvm/tools/lto/lto.cpp +++ b/llvm/tools/lto/lto.cpp @@ -43,6 +43,16 @@ static cl::opt<bool> DisableLTOVectorization("disable-lto-vectorization", cl::init(false), cl::desc("Do not run loop or slp vectorization during LTO")); +#ifdef NDEBUG +static bool VerifyByDefault = false; +#else +static bool VerifyByDefault = true; +#endif + +static cl::opt<bool> DisableVerify( + "disable-llvm-verifier", cl::init(!VerifyByDefault), + cl::desc("Don't run the LLVM verifier during the optimization pipeline")); + // Holds most recent error string. // *** Not thread safe *** static std::string sLastErrorString; @@ -321,8 +331,9 @@ bool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) { const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) { maybeParseOptions(cg); LibLTOCodeGenerator *CG = unwrap(cg); - CG->NativeObjectFile = CG->compile(DisableInline, DisableGVNLoadPRE, - DisableLTOVectorization, sLastErrorString); + CG->NativeObjectFile = + CG->compile(DisableVerify, DisableInline, DisableGVNLoadPRE, + DisableLTOVectorization, sLastErrorString); if (!CG->NativeObjectFile) return nullptr; *length = CG->NativeObjectFile->getBufferSize(); @@ -331,9 +342,8 @@ const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) { bool lto_codegen_optimize(lto_code_gen_t cg) { maybeParseOptions(cg); - return !unwrap(cg)->optimize(DisableInline, - DisableGVNLoadPRE, DisableLTOVectorization, - sLastErrorString); + return !unwrap(cg)->optimize(DisableVerify, DisableInline, DisableGVNLoadPRE, + DisableLTOVectorization, sLastErrorString); } const void *lto_codegen_compile_optimized(lto_code_gen_t cg, size_t *length) { @@ -349,7 +359,7 @@ const void *lto_codegen_compile_optimized(lto_code_gen_t cg, size_t *length) { bool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) { maybeParseOptions(cg); return !unwrap(cg)->compile_to_file( - name, DisableInline, DisableGVNLoadPRE, + name, DisableVerify, DisableInline, DisableGVNLoadPRE, DisableLTOVectorization, sLastErrorString); } |