summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-inline.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-08-28 21:24:49 -0700
committerGitHub <noreply@github.com>2023-08-28 21:24:49 -0700
commitc787c4b82ba76f87069911f203eb192060b5264f (patch)
tree2aa98326ce8d4c9f2011d79ee9f6d34db14716e7 /source/slang/slang-ir-inline.cpp
parentaf363c02bf0fa2502c14f454965adff87170ff15 (diff)
Add `target_switch` and `intrinsic_asm` statement. (#3154)
* Add `target_switch` and `__intrinsic_asm` statement. * Cleanup. * WaveGetActiveMask, WaveGetActiveMask, WaveCountBits. * WaveIsFirstLane. * More wave intrinsics. * wave intrinsics. * merge fix. * Fix. * Fix. * Update test. * update test. * 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.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/source/slang/slang-ir-inline.cpp b/source/slang/slang-ir-inline.cpp
index df245f555..f3fa213da 100644
--- a/source/slang/slang-ir-inline.cpp
+++ b/source/slang/slang-ir-inline.cpp
@@ -654,6 +654,19 @@ struct InliningPassBase
};
+static bool hasGenericAsmInst(IRInst* func)
+{
+ auto f = as<IRFunc>(getResolvedInstForDecorations(func));
+ if (!f)
+ return false;
+ for (auto b : f->getBlocks())
+ {
+ if (as<IRGenericAsm>(b->getTerminator()))
+ return true;
+ }
+ return false;
+}
+
/// An inlining pass that inlines calls to `[unsafeForceInlineEarly]` functions
struct MandatoryEarlyInliningPass : InliningPassBase
{
@@ -665,10 +678,15 @@ struct MandatoryEarlyInliningPass : InliningPassBase
bool shouldInline(CallSiteInfo const& info)
{
- if(info.callee->findDecoration<IRUnsafeForceInlineEarlyDecoration>())
- return true;
if (info.callee->findDecoration<IRIntrinsicOpDecoration>())
return true;
+
+ // Never inline a callee that has genericASM instruction.
+ if (hasGenericAsmInst(info.callee))
+ return false;
+
+ if(info.callee->findDecoration<IRUnsafeForceInlineEarlyDecoration>())
+ return true;
return false;
}
};
@@ -782,6 +800,10 @@ struct ForceInliningPass : InliningPassBase
bool shouldInline(CallSiteInfo const& info)
{
+ // Never inline a callee that has genericASM instruction.
+ if (hasGenericAsmInst(info.callee))
+ return false;
+
if (info.callee->findDecoration<IRForceInlineDecoration>() ||
info.callee->findDecoration<IRUnsafeForceInlineEarlyDecoration>()||
info.callee->findDecoration<IRIntrinsicOpDecoration>())