<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 15, 2015 at 3:26 PM, Duncan P. N. Exon Smith via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dexonsmith<br>
Date: Tue Sep 15 17:26:11 2015<br>
New Revision: 247729<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=247729&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=247729&view=rev</a><br>
Log:<br>
LTO: Disable extra verify runs in release builds<br>
<br>
The verifier currently runs three times in LTO: (1) after parsing, (2)<br>
at the beginning of the optimization pipeline, and (3) at the end of it.<br>
<br>
The first run is important, since we're not sure where the bitcode comes<br>
from and it's nice to validate it, but in release builds the extra runs<br>
aren't appropriate.<br>
<br>
This commit:<br>
  - Allows these runs to be disabled in LTOCodeGenerator.<br>
  - Adds command-line options to llvm-lto.<br>
  - Adds command-line options to libLTO.dylib, and disables the verifier<br>
    by default in release builds (based on NDEBUG).<br></blockquote><div><br></div><div>Disables the extra runs, but not the input verification, I take it?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
This shaves about 3.5% off the runtime of ld64 when linking<br>
verify-uselistorder with -flto -g.<br>
<br>
rdar://22509081<br>
<br>
Added:<br>
    llvm/trunk/test/LTO/X86/disable-verify.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h<br>
    llvm/trunk/lib/LTO/LTOCodeGenerator.cpp<br>
    llvm/trunk/tools/llvm-lto/llvm-lto.cpp<br>
    llvm/trunk/tools/lto/lto.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h?rev=247729&r1=247728&r2=247729&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h?rev=247729&r1=247728&r2=247729&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h (original)<br>
+++ llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h Tue Sep 15 17:26:11 2015<br>
@@ -110,9 +110,9 @@ struct LTOCodeGenerator {<br>
   /// \note It is up to the linker to remove the intermediate object file.  Do<br>
   /// not try to remove the object file in LTOCodeGenerator's destructor as we<br>
   /// don't who (LTOCodeGenerator or the obj file) will last longer.<br>
-  bool compile_to_file(const char **Name, bool DisableInline,<br>
-                       bool DisableGVNLoadPRE, bool DisableVectorization,<br>
-                       std::string &ErrMsg);<br>
+  bool compile_to_file(const char **Name, bool DisableVerify,<br>
+                       bool DisableInline, bool DisableGVNLoadPRE,<br>
+                       bool DisableVectorization, std::string &ErrMsg);<br>
<br>
   /// As with compile_to_file(), this function compiles the merged module into<br>
   /// single object file. Instead of returning the object-file-path to the<br>
@@ -120,13 +120,13 @@ struct LTOCodeGenerator {<br>
   /// to the caller. This function should delete intermediate object file once<br>
   /// its content is brought to memory. Return NULL if the compilation was not<br>
   /// successful.<br>
-  std::unique_ptr<MemoryBuffer> compile(bool DisableInline,<br>
+  std::unique_ptr<MemoryBuffer> compile(bool DisableVerify, bool DisableInline,<br>
                                         bool DisableGVNLoadPRE,<br>
                                         bool DisableVectorization,<br>
                                         std::string &errMsg);<br>
<br>
   /// Optimizes the merged module.  Returns true on success.<br>
-  bool optimize(bool DisableInline, bool DisableGVNLoadPRE,<br>
+  bool optimize(bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE,<br>
                 bool DisableVectorization, std::string &ErrMsg);<br>
<br>
   /// Compiles the merged optimized module into a single object file. It brings<br>
<br>
Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=247729&r1=247728&r2=247729&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=247729&r1=247728&r2=247729&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)<br>
+++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Tue Sep 15 17:26:11 2015<br>
@@ -265,20 +265,24 @@ LTOCodeGenerator::compileOptimized(std::<br>
   return std::move(*BufferOrErr);<br>
 }<br>
<br>
-bool LTOCodeGenerator::compile_to_file(const char **Name, bool DisableInline,<br>
+bool LTOCodeGenerator::compile_to_file(const char **Name, bool DisableVerify,<br>
+                                       bool DisableInline,<br>
                                        bool DisableGVNLoadPRE,<br>
                                        bool DisableVectorization,<br>
                                        std::string &ErrMsg) {<br>
-  if (!optimize(DisableInline, DisableGVNLoadPRE, DisableVectorization, ErrMsg))<br>
+  if (!optimize(DisableVerify, DisableInline, DisableGVNLoadPRE,<br>
+                DisableVectorization, ErrMsg))<br>
     return false;<br>
<br>
   return compileOptimizedToFile(Name, ErrMsg);<br>
 }<br>
<br>
 std::unique_ptr<MemoryBuffer><br>
-LTOCodeGenerator::compile(bool DisableInline, bool DisableGVNLoadPRE,<br>
-                          bool DisableVectorization, std::string &ErrMsg) {<br>
-  if (!optimize(DisableInline, DisableGVNLoadPRE, DisableVectorization, ErrMsg))<br>
+LTOCodeGenerator::compile(bool DisableVerify, bool DisableInline,<br>
+                          bool DisableGVNLoadPRE, bool DisableVectorization,<br>
+                          std::string &ErrMsg) {<br>
+  if (!optimize(DisableVerify, DisableInline, DisableGVNLoadPRE,<br>
+                DisableVectorization, ErrMsg))<br>
     return nullptr;<br>
<br>
   return compileOptimized(ErrMsg);<br>
@@ -459,7 +463,8 @@ void LTOCodeGenerator::applyScopeRestric<br>
 }<br>
<br>
 /// Optimize merged modules using various IPO passes<br>
-bool LTOCodeGenerator::optimize(bool DisableInline, bool DisableGVNLoadPRE,<br>
+bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline,<br>
+                                bool DisableGVNLoadPRE,<br>
                                 bool DisableVectorization,<br>
                                 std::string &ErrMsg) {<br>
   if (!this->determineTarget(ErrMsg))<br>
@@ -486,8 +491,8 @@ bool LTOCodeGenerator::optimize(bool Dis<br>
     PMB.Inliner = createFunctionInliningPass();<br>
   PMB.LibraryInfo = new TargetLibraryInfoImpl(TargetTriple);<br>
   PMB.OptLevel = OptLevel;<br>
-  PMB.VerifyInput = true;<br>
-  PMB.VerifyOutput = true;<br>
+  PMB.VerifyInput = !DisableVerify;<br>
+  PMB.VerifyOutput = !DisableVerify;<br>
<br>
   PMB.populateLTOPassManager(passes);<br>
<br>
<br>
Added: llvm/trunk/test/LTO/X86/disable-verify.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/LTO/X86/disable-verify.ll?rev=247729&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/LTO/X86/disable-verify.ll?rev=247729&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/LTO/X86/disable-verify.ll (added)<br>
+++ llvm/trunk/test/LTO/X86/disable-verify.ll Tue Sep 15 17:26:11 2015<br>
@@ -0,0 +1,18 @@<br>
+; RUN: llvm-as < %s >%t.bc<br>
+; RUN: llvm-lto -debug-pass=Arguments -exported-symbol=_f -o /dev/null %t.bc 2>&1 -disable-verify | FileCheck %s<br>
+; RUN: llvm-lto -debug-pass=Arguments -exported-symbol=_f -o /dev/null %t.bc 2>&1 | FileCheck %s -check-prefix=VERIFY<br>
+<br>
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-apple-macosx10.10.0"<br>
+<br>
+; -disable-verify should disable verification from the optimization pipeline.<br>
+; CHECK: Pass Arguments: -verify -internalize<br>
+; CHECK-NOT: -verify<br>
+<br>
+; VERIFY: Pass Arguments: -verify -internalize<br>
+; VERIFY: Pass Arguments: {{.*}} -verify {{.*}} -verify<br>
+<br>
+define void @f() {<br>
+entry:<br>
+  ret void<br>
+}<br>
<br>
Modified: llvm/trunk/tools/llvm-lto/llvm-lto.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto/llvm-lto.cpp?rev=247729&r1=247728&r2=247729&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto/llvm-lto.cpp?rev=247729&r1=247728&r2=247729&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-lto/llvm-lto.cpp (original)<br>
+++ llvm/trunk/tools/llvm-lto/llvm-lto.cpp Tue Sep 15 17:26:11 2015<br>
@@ -36,6 +36,10 @@ OptLevel("O",<br>
          cl::ZeroOrMore,<br>
          cl::init('2'));<br>
<br>
+static cl::opt<bool> DisableVerify(<br>
+    "disable-verify", cl::init(false),<br>
+    cl::desc("Do not run the verifier during the optimization pipeline"));<br>
+<br>
 static cl::opt<bool><br>
 DisableInline("disable-inlining", cl::init(false),<br>
   cl::desc("Do not run the inliner pass"));<br>
@@ -248,7 +252,7 @@ int main(int argc, char **argv) {<br>
<br>
   if (!OutputFilename.empty()) {<br>
     std::string ErrorInfo;<br>
-    if (!CodeGen.optimize(DisableInline, DisableGVNLoadPRE,<br>
+    if (!CodeGen.optimize(DisableVerify, DisableInline, DisableGVNLoadPRE,<br>
                           DisableLTOVectorization, ErrorInfo)) {<br>
       errs() << argv[0] << ": error optimizing the code: " << ErrorInfo << "\n";<br>
       return 1;<br>
@@ -285,7 +289,7 @@ int main(int argc, char **argv) {<br>
<br>
     std::string ErrorInfo;<br>
     const char *OutputName = nullptr;<br>
-    if (!CodeGen.compile_to_file(&OutputName, DisableInline,<br>
+    if (!CodeGen.compile_to_file(&OutputName, DisableVerify, DisableInline,<br>
                                  DisableGVNLoadPRE, DisableLTOVectorization,<br>
                                  ErrorInfo)) {<br>
       errs() << argv[0]<br>
<br>
Modified: llvm/trunk/tools/lto/lto.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=247729&r1=247728&r2=247729&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=247729&r1=247728&r2=247729&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/lto/lto.cpp (original)<br>
+++ llvm/trunk/tools/lto/lto.cpp Tue Sep 15 17:26:11 2015<br>
@@ -43,6 +43,16 @@ static cl::opt<bool><br>
 DisableLTOVectorization("disable-lto-vectorization", cl::init(false),<br>
   cl::desc("Do not run loop or slp vectorization during LTO"));<br>
<br>
+#ifdef NDEBUG<br>
+static bool VerifyByDefault = false;<br>
+#else<br>
+static bool VerifyByDefault = true;<br>
+#endif<br>
+<br>
+static cl::opt<bool> DisableVerify(<br>
+    "disable-llvm-verifier", cl::init(!VerifyByDefault),<br>
+    cl::desc("Don't run the LLVM verifier during the optimization pipeline"));<br>
+<br>
 // Holds most recent error string.<br>
 // *** Not thread safe ***<br>
 static std::string sLastErrorString;<br>
@@ -321,8 +331,9 @@ bool lto_codegen_write_merged_modules(lt<br>
 const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) {<br>
   maybeParseOptions(cg);<br>
   LibLTOCodeGenerator *CG = unwrap(cg);<br>
-  CG->NativeObjectFile = CG->compile(DisableInline, DisableGVNLoadPRE,<br>
-                                     DisableLTOVectorization, sLastErrorString);<br>
+  CG->NativeObjectFile =<br>
+      CG->compile(DisableVerify, DisableInline, DisableGVNLoadPRE,<br>
+                  DisableLTOVectorization, sLastErrorString);<br>
   if (!CG->NativeObjectFile)<br>
     return nullptr;<br>
   *length = CG->NativeObjectFile->getBufferSize();<br>
@@ -331,9 +342,8 @@ const void *lto_codegen_compile(lto_code<br>
<br>
 bool lto_codegen_optimize(lto_code_gen_t cg) {<br>
   maybeParseOptions(cg);<br>
-  return !unwrap(cg)->optimize(DisableInline,<br>
-                               DisableGVNLoadPRE, DisableLTOVectorization,<br>
-                               sLastErrorString);<br>
+  return !unwrap(cg)->optimize(DisableVerify, DisableInline, DisableGVNLoadPRE,<br>
+                               DisableLTOVectorization, sLastErrorString);<br>
 }<br>
<br>
 const void *lto_codegen_compile_optimized(lto_code_gen_t cg, size_t *length) {<br>
@@ -349,7 +359,7 @@ const void *lto_codegen_compile_optimize<br>
 bool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) {<br>
   maybeParseOptions(cg);<br>
   return !unwrap(cg)->compile_to_file(<br>
-      name, DisableInline, DisableGVNLoadPRE,<br>
+      name, DisableVerify, DisableInline, DisableGVNLoadPRE,<br>
       DisableLTOVectorization, sLastErrorString);<br>
 }<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>