From 59ce1e834a9adb1cd15484df6fd81015e8e8fe80 Mon Sep 17 00:00:00 2001 From: Luc Vlaming Date: Wed, 30 Dec 2020 11:35:12 +0100 Subject: [PATCH v2 1/2] improve jitting performance somewhat --- 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 43f9b01e83..4a6a9dfb67 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -858,6 +858,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 9c4fc75f65..dd23a09f40 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 5a77f7d4a0..a0c29a76c8 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