summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-peephole.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-09-26 23:56:06 -0700
committerGitHub <noreply@github.com>2023-09-27 14:56:06 +0800
commitebe8ddefc48478307d5f206cd3e40c41d28a36e3 (patch)
tree8e13977979909a26394eea532d8b95cd5ad0f6d1 /source/slang/slang-ir-peephole.cpp
parentc5c8cfbb360d9a763f549df48636effde839eacd (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.cpp41
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);