From 4da278ee49b91d34120747c6763c248ad52da7b7 Mon Sep 17 00:00:00 2001 From: Pierre Ducroquet Date: Mon, 2 Jul 2018 13:44:10 +0200 Subject: [PATCH] Introduce opt1 in LLVM/JIT, and force it with deforming --- src/backend/jit/llvm/llvmjit.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c index 5d0cdab1fc..025319e9c1 100644 --- a/src/backend/jit/llvm/llvmjit.c +++ b/src/backend/jit/llvm/llvmjit.c @@ -91,10 +91,12 @@ static const char *llvm_layout = NULL; static LLVMTargetMachineRef llvm_opt0_targetmachine; +static LLVMTargetMachineRef llvm_opt1_targetmachine; static LLVMTargetMachineRef llvm_opt3_targetmachine; static LLVMTargetRef llvm_targetref; static LLVMOrcJITStackRef llvm_opt0_orc; +static LLVMOrcJITStackRef llvm_opt1_orc; static LLVMOrcJITStackRef llvm_opt3_orc; @@ -277,6 +279,8 @@ llvm_get_function(LLVMJitContext *context, const char *funcname) #if LLVM_VERSION_MAJOR < 5 if ((addr = LLVMOrcGetSymbolAddress(llvm_opt0_orc, funcname))) return (void *) (uintptr_t) addr; + if ((addr = LLVMOrcGetSymbolAddress(llvm_opt1_orc, funcname))) + return (void *) (uintptr_t) addr; if ((addr = LLVMOrcGetSymbolAddress(llvm_opt3_orc, funcname))) return (void *) (uintptr_t) addr; #else @@ -284,6 +288,10 @@ llvm_get_function(LLVMJitContext *context, const char *funcname) elog(ERROR, "failed to look up symbol \"%s\"", funcname); if (addr) return (void *) (uintptr_t) addr; + if (LLVMOrcGetSymbolAddress(llvm_opt1_orc, &addr, funcname)) + elog(ERROR, "failed to look up symbol \"%s\"", funcname); + if (addr) + return (void *) (uintptr_t) addr; if (LLVMOrcGetSymbolAddress(llvm_opt3_orc, &addr, funcname)) elog(ERROR, "failed to look up symbol \"%s\"", funcname); if (addr) @@ -420,6 +428,8 @@ llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module) if (context->base.flags & PGJIT_OPT3) compile_optlevel = 3; + else if (context->base.flags & PGJIT_DEFORM) + compile_optlevel = 1; else compile_optlevel = 0; @@ -491,6 +501,8 @@ llvm_compile_module(LLVMJitContext *context) if (context->base.flags & PGJIT_OPT3) compile_orc = llvm_opt3_orc; + else if (context->base.flags & PGJIT_DEFORM) + compile_orc = llvm_opt1_orc; else compile_orc = llvm_opt0_orc; @@ -646,6 +658,11 @@ llvm_session_initialize(void) LLVMCodeGenLevelNone, LLVMRelocDefault, LLVMCodeModelJITDefault); + llvm_opt1_targetmachine = + LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, features, + LLVMCodeGenLevelLess, + LLVMRelocDefault, + LLVMCodeModelJITDefault); llvm_opt3_targetmachine = LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, features, LLVMCodeGenLevelAggressive, @@ -661,12 +678,14 @@ llvm_session_initialize(void) LLVMLoadLibraryPermanently(NULL); llvm_opt0_orc = LLVMOrcCreateInstance(llvm_opt0_targetmachine); + llvm_opt1_orc = LLVMOrcCreateInstance(llvm_opt1_targetmachine); llvm_opt3_orc = LLVMOrcCreateInstance(llvm_opt3_targetmachine); #if defined(HAVE_DECL_LLVMORCREGISTERGDB) && HAVE_DECL_LLVMORCREGISTERGDB if (jit_debugging_support) { LLVMOrcRegisterGDB(llvm_opt0_orc); + LLVMOrcRegisterGDB(llvm_opt1_orc); LLVMOrcRegisterGDB(llvm_opt3_orc); } #endif @@ -674,6 +693,7 @@ llvm_session_initialize(void) if (jit_profiling_support) { LLVMOrcRegisterPerf(llvm_opt0_orc); + LLVMOrcRegisterPerf(llvm_opt1_orc); LLVMOrcRegisterPerf(llvm_opt3_orc); } #endif @@ -700,6 +720,16 @@ llvm_shutdown(int code, Datum arg) llvm_opt3_orc = NULL; } + if (llvm_opt1_orc) + { +#if defined(HAVE_DECL_LLVMORCREGISTERPERF) && HAVE_DECL_LLVMORCREGISTERPERF + if (jit_profiling_support) + LLVMOrcUnregisterPerf(llvm_opt1_orc); +#endif + LLVMOrcDisposeInstance(llvm_opt1_orc); + llvm_opt1_orc = NULL; + } + if (llvm_opt0_orc) { #if defined(HAVE_DECL_LLVMORCREGISTERPERF) && HAVE_DECL_LLVMORCREGISTERPERF -- 2.18.0