diff options
| author | kaizhangNV <149626564+kaizhangNV@users.noreply.github.com> | 2025-10-02 15:24:46 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-02 15:24:46 -0700 |
| commit | 0c778339d7e3c39f600af2cc049f13f661d3434b (patch) | |
| tree | c7927a86fb2ae6e8df2fa781583179d59346e342 /source/slang/slang-ir-util.cpp | |
| parent | bffac95febd7a29cfac0becfcb019cd057b53765 (diff) | |
Relax the inst definition order rule (#8588)
Close #8572.
The root cause of the issue is that in `_replaceInstUsesWith` call,
if the use of the inst is a generic parameter, and the inst is the data
type of that generic parameter, we could end up of moving the data type
before the generic parameter. This will break the layout of generic
parameters, where all the generic parameters should be laid consecutively
at the beginning of the first block of the generic.
Therefore, we don't make that relocation for such case.
Diffstat (limited to 'source/slang/slang-ir-util.cpp')
| -rw-r--r-- | source/slang/slang-ir-util.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp index 551a72fc7..12e37f42a 100644 --- a/source/slang/slang-ir-util.cpp +++ b/source/slang/slang-ir-util.cpp @@ -2744,4 +2744,23 @@ bool isPointerToImmutableLocation(IRInst* loc) } return false; } + +bool isGenericParameter(IRInst* inst) +{ + // The generic parameter must be in the first block + bool isParam = inst->getOp() == kIROp_Param; + bool isGeneric = false; + if (auto irBlock = as<IRBlock>(inst->parent)) + { + isGeneric = as<IRGeneric>(irBlock->getParent()) != nullptr; + } + return isParam && isGeneric; +} + +bool canRelaxInstOrderRule(IRInst* inst, IRInst* useOfInst) +{ + bool isSameBlock = (inst->getParent() == useOfInst->getParent()); + return isSameBlock && isGenericParameter(useOfInst) && (useOfInst->getDataType() == inst); +} + } // namespace Slang |
