[llvm] r247729 - LTO: Disable extra verify runs in release builds

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 16 09:48:34 PDT 2015


On Wed, Sep 16, 2015 at 9:40 AM, David Blaikie via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
>
> On Tue, Sep 15, 2015 at 3:26 PM, Duncan P. N. Exon Smith via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>>
>> Author: dexonsmith
>> Date: Tue Sep 15 17:26:11 2015
>> New Revision: 247729
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=247729&view=rev
>> Log:
>> LTO: Disable extra verify runs in release builds
>>
>> The verifier currently runs three times in LTO: (1) after parsing, (2)
>> at the beginning of the optimization pipeline, and (3) at the end of it.
>>
>> The first run is important, since we're not sure where the bitcode comes
>> from and it's nice to validate it, but in release builds the extra runs
>> aren't appropriate.
>>
>> This commit:
>>   - Allows these runs to be disabled in LTOCodeGenerator.
>>   - Adds command-line options to llvm-lto.
>>   - Adds command-line options to libLTO.dylib, and disables the verifier
>>     by default in release builds (based on NDEBUG).
>
>
> Disables the extra runs, but not the input verification, I take it?

Yep, LTOCodeGenerator has an unconditional initial verification pass
for input added in LTOCodeGenerator::applyScopeRestrictions to check
the input bitcode.

(This is not the case for gold-plugin, where I am looking at making
corresponding changes, so I am going to leave VerifyInput on the pass
manager builder unconditionally true as a result).

Teresa

>
>>
>>
>> This shaves about 3.5% off the runtime of ld64 when linking
>> verify-uselistorder with -flto -g.
>>
>> rdar://22509081
>>
>> Added:
>>     llvm/trunk/test/LTO/X86/disable-verify.ll
>> Modified:
>>     llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h
>>     llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
>>     llvm/trunk/tools/llvm-lto/llvm-lto.cpp
>>     llvm/trunk/tools/lto/lto.cpp
>>
>> Modified: llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h?rev=247729&r1=247728&r2=247729&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h (original)
>> +++ llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h Tue Sep 15 17:26:11
>> 2015
>> @@ -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
>>
>> Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=247729&r1=247728&r2=247729&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)
>> +++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Tue Sep 15 17:26:11 2015
>> @@ -265,20 +265,24 @@ LTOCodeGenerator::compileOptimized(std::
>>    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::applyScopeRestric
>>  }
>>
>>  /// 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 Dis
>>      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);
>>
>>
>> Added: llvm/trunk/test/LTO/X86/disable-verify.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/LTO/X86/disable-verify.ll?rev=247729&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/LTO/X86/disable-verify.ll (added)
>> +++ llvm/trunk/test/LTO/X86/disable-verify.ll Tue Sep 15 17:26:11 2015
>> @@ -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
>> +}
>>
>> Modified: llvm/trunk/tools/llvm-lto/llvm-lto.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto/llvm-lto.cpp?rev=247729&r1=247728&r2=247729&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-lto/llvm-lto.cpp (original)
>> +++ llvm/trunk/tools/llvm-lto/llvm-lto.cpp Tue Sep 15 17:26:11 2015
>> @@ -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]
>>
>> Modified: llvm/trunk/tools/lto/lto.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=247729&r1=247728&r2=247729&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/tools/lto/lto.cpp (original)
>> +++ llvm/trunk/tools/lto/lto.cpp Tue Sep 15 17:26:11 2015
>> @@ -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(lt
>>  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
>>
>>  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_optimize
>>  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);
>>  }
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>



-- 
Teresa Johnson | Software Engineer | tejohnson at google.com | 408-460-2413


More information about the llvm-commits mailing list