diff options
| author | Yong He <yonghe@outlook.com> | 2023-08-28 21:24:49 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-28 21:24:49 -0700 |
| commit | c787c4b82ba76f87069911f203eb192060b5264f (patch) | |
| tree | 2aa98326ce8d4c9f2011d79ee9f6d34db14716e7 /source/slang/slang-ir-inline.cpp | |
| parent | af363c02bf0fa2502c14f454965adff87170ff15 (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.cpp | 26 |
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>()) |
