LLVMJIT: Check for 'noinline' attribute in recursively inlined functions.
authorAndres Freund
Wed, 25 Jul 2018 23:23:59 +0000 (16:23 -0700)
committerAndres Freund
Wed, 25 Jul 2018 23:23:59 +0000 (16:23 -0700)
Previously the attribute was only checked for external functions
inlined, not "static" functions that had to be inlined as
dependencies.

This isn't really a bug, but makes debugging a bit harder. The new
behaviour also makes more sense. Therefore backpatch.

Author: Andres Freund
Backpatch: 11-, where JIT compilation was added

src/backend/jit/llvm/llvmjit_inline.cpp

index 130e2ab415e54eff871964970e3897f4477ec6ea..b33a32141d1cd46174a5cea24f78bcf9e5ac1647 100644 (file)
@@ -287,14 +287,6 @@ llvm_build_inline_plan(llvm::Module *mod)
            Assert(!funcDef->isDeclaration());
            Assert(funcDef->hasExternalLinkage());
 
-           /* don't inline functions marked as noinline */
-           if (funcDef->getAttributes().hasFnAttribute(llvm::Attribute::NoInline))
-           {
-               ilog(DEBUG1, "ineligibile to import %s due to noinline",
-                    symbolName.data());
-               continue;
-           }
-
            llvm::StringSet<> importVars;
            llvm::SmallPtrSet visitedFunctions;
            int running_instcount = 0;
@@ -600,6 +592,13 @@ function_inlinable(llvm::Function &F,
    if (F.materialize())
        elog(FATAL, "failed to materialize metadata");
 
+   if (F.getAttributes().hasFnAttribute(llvm::Attribute::NoInline))
+   {
+       ilog(DEBUG1, "ineligibile to import %s due to noinline",
+            F.getName().data());
+       return false;
+   }
+
    function_references(F, running_instcount, referencedVars, referencedFunctions);
 
    for (llvm::GlobalVariable* rv: referencedVars)