diff options
Diffstat (limited to 'source/slang/slang-ir-inline.cpp')
| -rw-r--r-- | source/slang/slang-ir-inline.cpp | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/source/slang/slang-ir-inline.cpp b/source/slang/slang-ir-inline.cpp index e171e2dd3..4308d16f0 100644 --- a/source/slang/slang-ir-inline.cpp +++ b/source/slang/slang-ir-inline.cpp @@ -246,13 +246,6 @@ struct InliningPassBase // outCallSite.callee = calleeFunc; - if (callee->findDecoration<IRIntrinsicOpDecoration>()) - return true; - - // We cannot inline a function that is defined by a generic asm inst. - if (hasGenericAsmInst(callee)) - return false; - for (auto decor : callee->getDecorations()) { switch (decor->getOp()) @@ -260,13 +253,15 @@ struct InliningPassBase case kIROp_IntrinsicOpDecoration: return true; case kIROp_RequireSPIRVCapabilityDecoration: - case kIROp_RequireSPIRVVersionDecoration: - case kIROp_RequireGLSLExtensionDecoration: - case kIROp_RequireGLSLVersionDecoration: + // Don't inline a function with spirv capability decoration to avoid losing it. return false; } } + // We cannot inline a function that is defined by a generic asm inst. + if (hasGenericAsmInst(callee)) + return false; + // At this point the `CallSiteInfo` is complete and // could be used for inlining, but we have additional // checks to make. @@ -883,6 +878,35 @@ void performGLSLResourceReturnFunctionInlining(IRModule* module) } } +struct IntrinsicFunctionInliningPass : InliningPassBase +{ + typedef InliningPassBase Super; + + IntrinsicFunctionInliningPass(IRModule* module) + : Super(module) + {} + + bool shouldInline(CallSiteInfo const& info) + { + auto func = as<IRFunc>(getResolvedInstForDecorations(info.callee)); + if (!func) + return false; + if (func->findDecorationImpl(kIROp_RequireSPIRVCapabilityDecoration)) + return false; + auto returnInst = as<IRReturn>(func->getFirstBlock()->getTerminator()); + if (!returnInst) + return false; + auto firstInst = as<IRSPIRVAsm>(func->getFirstBlock()->getFirstOrdinaryInst()); + return returnInst->getVal() == firstInst; + } +}; + +void performIntrinsicFunctionFunctionInlining(IRModule* module) +{ + IntrinsicFunctionInliningPass pass(module); + pass.considerAllCallSites(); +} + struct CustomInliningPass : InliningPassBase { typedef InliningPassBase Super; |
