summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-inline.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-08-30 11:45:47 -0700
committerGitHub <noreply@github.com>2023-08-30 11:45:47 -0700
commitbb15f5b494b20e957127f0ffa6040c94349da0d0 (patch)
treeb060f2b5751cc56c5f1fd8f7b37434e56b6b4e5b /source/slang/slang-ir-inline.cpp
parent019f702e24d2d1d6ecf53d71f87776a83db96608 (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.cpp44
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;