From: Duncan P. N. Exon Smith Date: Tue, 15 Sep 2015 23:05:59 +0000 (+0000) Subject: Reapply "LTO: Disable extra verify runs in release builds" X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5e60a68a2de963c4f0cae2056e3365d97e1c35b0;p=oota-llvm.git 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247735 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/LTO/LTOCodeGenerator.h b/include/llvm/LTO/LTOCodeGenerator.h index cf31bda6dc1..f69dfb1e7f6 100644 --- a/include/llvm/LTO/LTOCodeGenerator.h +++ b/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 compile(bool DisableInline, + std::unique_ptr 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/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 98266c32d90..8dcc53c8033 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/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 -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/test/LTO/X86/disable-verify.ll b/test/LTO/X86/disable-verify.ll new file mode 100644 index 00000000000..5d2508a96c0 --- /dev/null +++ b/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/tools/llvm-lto/llvm-lto.cpp b/tools/llvm-lto/llvm-lto.cpp index cdb1bcaa6bc..50680ccb8ab 100644 --- a/tools/llvm-lto/llvm-lto.cpp +++ b/tools/llvm-lto/llvm-lto.cpp @@ -36,6 +36,10 @@ OptLevel("O", cl::ZeroOrMore, cl::init('2')); +static cl::opt DisableVerify( + "disable-verify", cl::init(false), + cl::desc("Do not run the verifier during the optimization pipeline")); + static cl::opt 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/tools/lto/lto.cpp b/tools/lto/lto.cpp index 8f62929b326..62675081464 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -43,6 +43,16 @@ static cl::opt 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 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); }