diff options
| author | Yong He <yonghe@outlook.com> | 2023-09-26 23:56:06 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-27 14:56:06 +0800 |
| commit | ebe8ddefc48478307d5f206cd3e40c41d28a36e3 (patch) | |
| tree | 8e13977979909a26394eea532d8b95cd5ad0f6d1 /source/slang/slang-ir-peephole.cpp | |
| parent | c5c8cfbb360d9a763f549df48636effde839eacd (diff) | |
Various SPIRV fixes. (#3231)
* Various SPIRV fixes.
- Geometry shader support (WIP).
- Fix texture get dimension and load.
- Fold global GetElement(MakeArray/MakeVector) insts.
- Call spvopt to inline all functions.
- Translate OpImageSubscript.
- Emit struct member names and global variable names.
- Fix lowering of OpBitNot -> OpNot, instead of OpBitReverse.
* Fix test.
* Fix geometry shader.
* Fix geometry shader emit.
* Add atomic Image access test.
* Fix tests.
* don't fail if spirv-opt fails.
* Update comments.
* Fix test.
* Cleanups.
* indentation
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir-peephole.cpp')
| -rw-r--r-- | source/slang/slang-ir-peephole.cpp | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/source/slang/slang-ir-peephole.cpp b/source/slang/slang-ir-peephole.cpp index d344590b1..a7e89eb4f 100644 --- a/source/slang/slang-ir-peephole.cpp +++ b/source/slang/slang-ir-peephole.cpp @@ -334,7 +334,46 @@ struct PeepholeContext : InstPassBase changed = true; } } - else if (inst->getOperand(0)->getOp() == kIROp_MakeArrayFromElement) + else if (inst->getOperand(0)->getOp() == kIROp_MakeVector) + { + auto index = as<IRIntLit>(as<IRGetElement>(inst)->getIndex()); + if (!index) + break; + auto opCount = inst->getOperand(0)->getOperandCount(); + IRIntegerValue startIndex = 0; + for (UInt i = 0; i < opCount; i++) + { + auto element = inst->getOperand(0)->getOperand(i); + if (auto elementVecType = as<IRVectorType>(element->getDataType())) + { + auto vecSize = as<IRIntLit>(elementVecType->getElementCount()); + if (!vecSize) + break; + if (index->getValue() >= startIndex && index->getValue() < startIndex + vecSize->getValue()) + { + IRBuilder builder(module); + builder.setInsertBefore(inst); + auto newElement = builder.emitElementExtract(element, builder.getIntValue(builder.getIntType(), index->getValue() - startIndex)); + inst->replaceUsesWith(newElement); + maybeRemoveOldInst(inst); + changed = true; + break; + } + } + else + { + if (startIndex == index->getValue()) + { + inst->replaceUsesWith(element); + maybeRemoveOldInst(inst); + changed = true; + break; + } + startIndex++; + } + } + } + else if (inst->getOperand(0)->getOp() == kIROp_MakeArrayFromElement || inst->getOperand(0)->getOp() == kIROp_MakeVectorFromScalar) { inst->replaceUsesWith(inst->getOperand(0)->getOperand(0)); maybeRemoveOldInst(inst); |
