From cea46ada56a8b2d4f77dfda09738635596d89f51 Mon Sep 17 00:00:00 2001 From: Maksim Panchenko Date: Wed, 22 Apr 2015 14:33:23 -0700 Subject: [PATCH] Miscellaneous optimization options for LLVM backend. Summary: Add a full set of module passes that closely correspond to clang's and opt's "-O2", and additional options to control vectorizers and load-combine. Reviewed By: @swtaarrs Differential Revision: D2011480 --- hphp/runtime/base/runtime-option.cpp | 5 +++++ hphp/runtime/base/runtime-option.h | 7 +++++-- hphp/runtime/vm/jit/vasm-llvm.cpp | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/hphp/runtime/base/runtime-option.cpp b/hphp/runtime/base/runtime-option.cpp index e270c8e101b..776cc22ec64 100644 --- a/hphp/runtime/base/runtime-option.cpp +++ b/hphp/runtime/base/runtime-option.cpp @@ -459,6 +459,11 @@ static inline uint32_t jitLLVMDefault() { #endif } +static inline bool jitLLVMSLPVectorizeDefault() { + return RuntimeOption::EvalJitLLVMOptLevel > 1 && + RuntimeOption::EvalJitLLVMSizeLevel < 2; +} + static inline bool hugePagesSoundNice() { return RuntimeOption::ServerExecutionMode(); } diff --git a/hphp/runtime/base/runtime-option.h b/hphp/runtime/base/runtime-option.h index f7d94f96621..dd0294fa2da 100644 --- a/hphp/runtime/base/runtime-option.h +++ b/hphp/runtime/base/runtime-option.h @@ -397,18 +397,21 @@ public: F(bool, SimulateARM, simulateARMDefault()) \ F(uint32_t, JitLLVM, jitLLVMDefault()) \ F(uint32_t, JitLLVMKeepSize, 0) \ + F(uint32_t, JitLLVMOptLevel, 2) \ + F(uint32_t, JitLLVMSizeLevel, 0) \ + F(bool, JitLLVMBBVectorize, false) \ F(bool, JitLLVMBasicOpt, true) \ F(string, JitLLVMCompare, "") \ F(bool, JitLLVMCondTail, true) \ F(bool, JitLLVMCounters, false) \ F(bool, JitLLVMDiscard, false) \ F(bool, JitLLVMFastISel, false) \ + F(bool, JitLLVMLoadCombine, false) \ F(bool, JitLLVMMinSize, true) \ - F(uint32_t, JitLLVMOptLevel, 2) \ F(bool, JitLLVMOptSize, true) \ F(bool, JitLLVMPrintAfterAll, false) \ F(bool, JitLLVMRetOpt, true) \ - F(uint32_t, JitLLVMSizeLevel, 0) \ + F(bool, JitLLVMSLPVectorize, jitLLVMSLPVectorizeDefault()) \ F(uint32_t, JitLLVMSplitHotCold, 1) \ F(bool, JitLLVMVolatileIncDec, true) \ F(string, JitLLVMAttrs, "") \ diff --git a/hphp/runtime/vm/jit/vasm-llvm.cpp b/hphp/runtime/vm/jit/vasm-llvm.cpp index c70e6119908..b6b42d882b4 100644 --- a/hphp/runtime/vm/jit/vasm-llvm.cpp +++ b/hphp/runtime/vm/jit/vasm-llvm.cpp @@ -40,6 +40,7 @@ #ifdef USE_LLVM +#include #include #include #include @@ -56,10 +57,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -70,6 +73,7 @@ #include #include #include +#include #include #include #include @@ -516,7 +520,7 @@ struct LLVMEmitter { llvm::Type::getVoidTy(m_context), std::vector(3, llvm::IntegerType::get(m_context, 64)), false), - llvm::Function::ExternalLinkage, "", m_module.get())) + llvm::Function::ExternalLinkage, "tracelet", m_module.get())) , m_irb(m_context, llvm::ConstantFolder(), IRBuilderVasmInserter(*this)) @@ -730,6 +734,25 @@ struct LLVMEmitter { .create()); always_assert_flog(ee, "ExecutionEngine creation failed: {}\n", errStr); + llvm::PassManager pm; + if (!RuntimeOption::EvalJitLLVMBasicOpt) { + auto TLI = + new llvm::TargetLibraryInfo(llvm::Triple(module->getTargetTriple())); + pm.add(TLI); + auto& Registry = *llvm::PassRegistry::getPassRegistry(); + llvm::initializeCore(Registry); + llvm::initializeScalarOpts(Registry); + llvm::initializeVectorization(Registry); + llvm::initializeIPO(Registry); + llvm::initializeAnalysis(Registry); + llvm::initializeIPA(Registry); + llvm::initializeTransformUtils(Registry); + llvm::initializeInstCombine(Registry); + llvm::initializeTarget(Registry); + llvm::initializeCodeGenPreparePass(Registry); + llvm::initializeAtomicExpandLoadLinkedPass(Registry); + } + llvm::LLVMTargetMachine* targetMachine = static_cast(ee->getTargetMachine()); @@ -760,7 +783,13 @@ struct LLVMEmitter { llvm::PassManagerBuilder PM; PM.OptLevel = RuntimeOption::EvalJitLLVMOptLevel; PM.SizeLevel = RuntimeOption::EvalJitLLVMSizeLevel; + PM.Inliner = llvm::createFunctionInliningPass(PM.OptLevel, PM.SizeLevel); + PM.DisableUnitAtATime = false; + PM.SLPVectorize = RuntimeOption::EvalJitLLVMSLPVectorize; + PM.BBVectorize = RuntimeOption::EvalJitLLVMBBVectorize; + PM.LoadCombine = RuntimeOption::EvalJitLLVMLoadCombine; PM.populateFunctionPassManager(*fpm); + PM.populateModulePassManager(pm); } { @@ -770,7 +799,9 @@ struct LLVMEmitter { fpm->run(*it); } fpm->doFinalization(); + pm.run(*module); } + FTRACE(2, "{:-^80}\n{}\n", " LLVM IR after optimizing ", showModule(module)); -- 2.11.4.GIT