From bb15f5b494b20e957127f0ffa6040c94349da0d0 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 30 Aug 2023 11:45:47 -0700 Subject: Fix memory barrier intrinsics. (#3166) * Fix memory barrier intrinsics. Makes them produce the same spirv code as dxc. * Fix. * filecheck barrier test for spirv backend. * Fix glsl intrinsic definition. * Fix intrinsics. * Fix intrinsics. * Fix. * Fix. --------- Co-authored-by: Yong He --- source/slang/slang-ir-inline.cpp | 44 +++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 10 deletions(-) (limited to 'source/slang/slang-ir-inline.cpp') 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()) - 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(getResolvedInstForDecorations(info.callee)); + if (!func) + return false; + if (func->findDecorationImpl(kIROp_RequireSPIRVCapabilityDecoration)) + return false; + auto returnInst = as(func->getFirstBlock()->getTerminator()); + if (!returnInst) + return false; + auto firstInst = as(func->getFirstBlock()->getFirstOrdinaryInst()); + return returnInst->getVal() == firstInst; + } +}; + +void performIntrinsicFunctionFunctionInlining(IRModule* module) +{ + IntrinsicFunctionInliningPass pass(module); + pass.considerAllCallSites(); +} + struct CustomInliningPass : InliningPassBase { typedef InliningPassBase Super; -- cgit v1.2.3