On Thu, Jan 15, 2026 at 2:51 PM Andres Freund <[email protected]> wrote: > I'm strongly against removing the always inline pass, I see absolutely no > reason for doing that. The whole point of always inline is that it happens > unconditionally. It's not an expensive pass either.
I've looked into more details on what was provided by 'default<O0>', and it turns out it includes an always-inline pass[0]. This is also visible when using debug-pass-manager: llvm-as < /dev/null | opt -disable-output --passes='default<O0>' -debug-pass-manager Running analysis: InnerAnalysisManagerProxy<FunctionAnalysisManager, Module> on [module] Running pass: AlwaysInlinerPass on [module] Running analysis: ProfileSummaryAnalysis on [module] Running pass: CoroConditionalWrapper on [module] Running pass: VerifierPass on [module] Running analysis: VerifierAnalysis on [module] With the pre-LLVM17 legacy pass manager, that doesn't seem to be the case[1] (despite the confusing comment? Inliner is only set by LLVMPassManagerBuilderUseInlinerWithThreshold). So, with 'default<O0>,mem2reg', we replicate the same behaviour as pre-LLVM17 as it includes the always-inline pass. I've updated the patch to only add the inline pass when PGJIT_INLINE is on. I've also added a comment to mention that always-inline is included in O0. [0]: https://github.com/llvm/llvm-project/blob/701040d48f759369dce755f185a21aa6b92ba3ae/llvm/lib/Passes/PassBuilderPipelines.cpp#L2360-L2365 [1]: https://github.com/llvm/llvm-project/blob/release/16.x/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp#L290-L313
v3-0001-Add-missing-JIT-inline-pass-for-llvm-17.patch
Description: Binary data
