[LTO] Add configuartion option to use default optimization pipeline
authorJoseph Huber <jhuber6@vols.utk.edu>
Tue, 22 Mar 2022 13:28:12 +0000 (09:28 -0400)
committerJoseph Huber <jhuber6@vols.utk.edu>
Tue, 22 Mar 2022 13:28:45 +0000 (09:28 -0400)
This patch adds a configuration option to simply use the default pass
pipeline in favor of the LTO-specific one. We observed some severe
performance penalties when uding device-side LTO for OpenMP offloading
applications caused by the LTO-pass pipeline. This is primarily because
OpenMP uses an LLVM bitcode library to implement a GPU runtime library.
In a standard compilation we link this bitcode library into each source
file and optimize it with the default pipeline. When performing LTO we
link it late with all the files, but the bitcode library never has the
regular optimization pipeline applied to it so we miss a few
optimizations just using the LTO pipeline to optimize it.

I'm not committed to this solution, but it's the easiest method to solve
this performance regression when using LTO without changing the
optimizatin pipeline for other users.

Reviewed By: tianshilei1992

Differential Revision: https://reviews.llvm.org/D122133

clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
llvm/include/llvm/LTO/Config.h
llvm/lib/LTO/LTOBackend.cpp

index a64648e6fe1553719aa099365427ffd3e7db954c..e9f616653d33e3848fcc4536f971ce613c963bbd 100644 (file)
@@ -860,6 +860,7 @@ std::unique_ptr<lto::LTO> createLTO(
   // TODO: Handle index-only thin-LTO
   Backend = lto::createInProcessThinBackend(
       llvm::heavyweight_hardware_concurrency(1));
+  Conf.UseDefaultPipeline = true;
 
   Conf.CPU = Arch.str();
   Conf.Options = codegen::InitTargetOptionsFromCodeGenFlags(TheTriple);
index eb793d62907e27db27b7a5c3dfbe0c9dc8974717..0cf84de7b9f8719a2a116fd1c1d22aa00e8975de 100644 (file)
@@ -60,6 +60,9 @@ struct Config {
   /// Use the new pass manager
   bool UseNewPM = LLVM_ENABLE_NEW_PASS_MANAGER;
 
+  /// Use the standard optimization pipeline.
+  bool UseDefaultPipeline = false;
+
   /// Flag to indicate that the optimizer should not assume builtins are present
   /// on the target.
   bool Freestanding = false;
index 3877def53c3f173cb08083c4687b27987670a3b1..91807b151eb9eb90544414faa05fa76e627c79e0 100644 (file)
@@ -298,6 +298,8 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM,
       report_fatal_error(Twine("unable to parse pass pipeline description '") +
                          Conf.OptPipeline + "': " + toString(std::move(Err)));
     }
+  } else if (Conf.UseDefaultPipeline) {
+    MPM.addPass(PB.buildPerModuleDefaultPipeline(OL));
   } else if (IsThinLTO) {
     MPM.addPass(PB.buildThinLTODefaultPipeline(OL, ImportSummary));
   } else {