From 46a4d98baa1d43b33717b4377aefeeaf46b9c2ff Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 23 Jan 2023 06:59:25 -0800 Subject: Full address insts elimination for backward autodiff. (#2604) Co-authored-by: Yong He --- source/slang/slang-ir-util.cpp | 62 +++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-) (limited to 'source/slang/slang-ir-util.cpp') diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp index 881f041c0..319a23989 100644 --- a/source/slang/slang-ir-util.cpp +++ b/source/slang/slang-ir-util.cpp @@ -219,12 +219,20 @@ void moveInstChildren(IRInst* dest, IRInst* src) } } +String dumpIRToString(IRInst* root) +{ + StringBuilder sb; + StringWriter writer(&sb, Slang::WriterFlag::AutoFlush); + dumpIR(root, IRDumpOptions(), nullptr, &writer); + return sb.ToString(); +} + struct GenericChildrenMigrationContextImpl { IRCloneEnv cloneEnv; IRGeneric* srcGeneric; IRGeneric* dstGeneric; - Dictionary deduplicateMap; + DeduplicateContext deduplicateContext; void init(IRGeneric* genericSrc, IRGeneric* genericDst, IRInst* insertBefore) { @@ -251,42 +259,34 @@ struct GenericChildrenMigrationContextImpl inst = inst->getNextInst()) { IRInstKey key = { inst }; - deduplicateMap.AddIfNotExists(key, inst); + deduplicateContext.deduplicateMap.AddIfNotExists(key, inst); } } } IRInst* deduplicate(IRInst* value) { - if (!value) return nullptr; - if (value->getParent() != dstGeneric->getFirstBlock()) - return value; - switch (value->getOp()) - { - case kIROp_Param: - case kIROp_StructType: - case kIROp_StructKey: - case kIROp_InterfaceType: - case kIROp_ClassType: - case kIROp_Func: - case kIROp_Generic: - return value; - default: - break; - } - if (as(value)) - return value; - - for (UInt i = 0; i < value->getOperandCount(); i++) - { - value->setOperand(i, deduplicate(value->getOperand(i))); - } - value->setFullType((IRType*)deduplicate(value->getFullType())); - IRInstKey key = { value }; - if (auto newValue = deduplicateMap.TryGetValue(key)) - return *newValue; - deduplicateMap[key] = value; - return value; + return deduplicateContext.deduplicate(value, [this](IRInst* inst) + { + if (inst->getParent() != dstGeneric->getFirstBlock()) + return false; + switch (inst->getOp()) + { + case kIROp_Param: + case kIROp_StructType: + case kIROp_StructKey: + case kIROp_InterfaceType: + case kIROp_ClassType: + case kIROp_Func: + case kIROp_Generic: + return false; + default: + break; + } + if (as(inst)) + return false; + return true; + }); } IRInst* cloneInst(IRBuilder* builder, IRInst* src) -- cgit v1.2.3