From 73eba2697046eeb3984f144555bb0b32e13162b7 Mon Sep 17 00:00:00 2001 From: Luc Vlaming Date: Mon, 12 Apr 2021 11:05:05 +0200 Subject: [PATCH v3 1/2] Improve jitting performance by not emitting the LLVMPassManagerBuilderUseInlinerWithThreshold pass. This pass contains some very expensive parts which in experiments so far do not gain us much compared to the runtime we gain afterwards when running queries. Instead now emit the simpler inliner passes also for PGJIT_OPT3. To monitor how many modules are now created an extra statistic is added so we can test effectively how much performance is gained / lost because of this. --- src/backend/commands/explain.c | 1 + src/backend/jit/llvm/llvmjit.c | 17 ++++++----------- src/include/jit/jit.h | 3 +++ 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index b62a76e7e5..ac97e9b44b 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -894,6 +894,7 @@ ExplainPrintJIT(ExplainState *es, int jit_flags, JitInstrumentation *ji) appendStringInfoString(es->str, "JIT:\n"); es->indent++; + ExplainPropertyInteger("Modules", NULL, ji->created_modules, es); ExplainPropertyInteger("Functions", NULL, ji->created_functions, es); ExplainIndentText(es); diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c index 98a27f08bf..18797e696b 100644 --- a/src/backend/jit/llvm/llvmjit.c +++ b/src/backend/jit/llvm/llvmjit.c @@ -241,6 +241,8 @@ llvm_mutable_module(LLVMJitContext *context) context->module = LLVMModuleCreateWithName("pg"); LLVMSetTarget(context->module, llvm_triple); LLVMSetDataLayout(context->module, llvm_layout); + + context->base.instr.created_modules++; } return context->module; @@ -578,12 +580,7 @@ llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module) LLVMPassManagerBuilderSetOptLevel(llvm_pmb, compile_optlevel); llvm_fpm = LLVMCreateFunctionPassManagerForModule(module); - if (context->base.flags & PGJIT_OPT3) - { - /* TODO: Unscientifically determined threshold */ - LLVMPassManagerBuilderUseInlinerWithThreshold(llvm_pmb, 512); - } - else + if (!(context->base.flags & PGJIT_OPT3)) { /* we rely on mem2reg heavily, so emit even in the O0 case */ LLVMAddPromoteMemoryToRegisterPass(llvm_fpm); @@ -611,11 +608,9 @@ llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module) LLVMPassManagerBuilderPopulateModulePassManager(llvm_pmb, llvm_mpm); /* always use always-inliner pass */ - if (!(context->base.flags & PGJIT_OPT3)) - LLVMAddAlwaysInlinerPass(llvm_mpm); - /* if doing inlining, but no expensive optimization, add inlining pass */ - if (context->base.flags & PGJIT_INLINE - && !(context->base.flags & PGJIT_OPT3)) + LLVMAddAlwaysInlinerPass(llvm_mpm); + /* if doing inlining, add inlining pass */ + if (context->base.flags & PGJIT_INLINE) LLVMAddFunctionInliningPass(llvm_mpm); LLVMRunPassManager(llvm_mpm, context->module); LLVMDisposePassManager(llvm_mpm); diff --git a/src/include/jit/jit.h b/src/include/jit/jit.h index b634df30b9..7a080074c0 100644 --- a/src/include/jit/jit.h +++ b/src/include/jit/jit.h @@ -26,6 +26,9 @@ typedef struct JitInstrumentation { + /* number of emitted modules */ + size_t created_modules; + /* number of emitted functions */ size_t created_functions; -- 2.25.1