jit: Add missing inline pass for LLVM >= 17.
authorThomas Munro <tmunro@postgresql.org>
Thu, 22 Jan 2026 02:43:13 +0000 (15:43 +1300)
committerThomas Munro <tmunro@postgresql.org>
Thu, 22 Jan 2026 03:03:47 +0000 (16:03 +1300)
With LLVM >= 17, transform passes are provided as a string to
LLVMRunPasses. Only two strings were used: "default<O3>" and
"default<O0>,mem2reg".

With previous LLVM versions, an additional inline pass was added when
JIT inlining was enabled without optimization. With LLVM >= 17, the code
would go through llvm_inline, prepare the functions for inlining, but
the generated bitcode would be the same due to the missing inline pass.

This patch restores the previous behavior by adding an inline pass when
inlining is enabled but no optimization is done.

This fixes an oversight introduced by 76200e5e when support for LLVM 17
was added.

Backpatch-through: 14
Author: Anthonin Bonnefoy <anthonin.bonnefoy@datadoghq.com>
Reviewed-by: Thomas Munro <thomas.munro@gmail.com>
Reviewed-by: Andreas Karlsson <andreas@proxel.se>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Álvaro Herrera <alvherre@kurilemu.de>
Reviewed-by: Pierre Ducroquet <p.psql@pinaraf.info>
Reviewed-by: Matheus Alcantara <matheusssilv97@gmail.com>
Discussion: https://postgr.es/m/CAO6_XqrNjJnbn15ctPv7o4yEAT9fWa-dK15RSyun6QNw9YDtKg%40mail.gmail.com

src/backend/jit/llvm/llvmjit.c

index 8d009dd5cf784576ca2108e0d671d5df81dafe5c..2e8aa4749dbc1f55f7929fdbc160b4bc2edc3fcd 100644 (file)
@@ -674,7 +674,11 @@ llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module)
 
    if (context->base.flags & PGJIT_OPT3)
        passes = "default<O3>";
+   else if (context->base.flags & PGJIT_INLINE)
+       /* if doing inlining, but no expensive optimization, add inline pass */
+       passes = "default<O0>,mem2reg,inline";
    else
+       /* default<O0> includes always-inline pass */
        passes = "default<O0>,mem2reg";
 
    options = LLVMCreatePassBuilderOptions();