diff options
| author | Yong He <yonghe@outlook.com> | 2023-08-30 11:45:47 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-30 11:45:47 -0700 |
| commit | bb15f5b494b20e957127f0ffa6040c94349da0d0 (patch) | |
| tree | b060f2b5751cc56c5f1fd8f7b37434e56b6b4e5b /source/slang/slang-ir-inline.cpp | |
| parent | 019f702e24d2d1d6ecf53d71f87776a83db96608 (diff) | |
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 <yhe@nvidia.com>
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; |
