From ebe8ddefc48478307d5f206cd3e40c41d28a36e3 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 26 Sep 2023 23:56:06 -0700 Subject: 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 Co-authored-by: Ellie Hermaszewska --- source/slang/slang-ir-peephole.cpp | 41 +++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'source/slang/slang-ir-peephole.cpp') 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(as(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(element->getDataType())) + { + auto vecSize = as(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); -- cgit v1.2.3