summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-strip.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-strip.cpp')
-rw-r--r--source/slang/slang-ir-strip.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/source/slang/slang-ir-strip.cpp b/source/slang/slang-ir-strip.cpp
index e9fbbceb6..6c64bfca2 100644
--- a/source/slang/slang-ir-strip.cpp
+++ b/source/slang/slang-ir-strip.cpp
@@ -51,4 +51,34 @@ void stripFrontEndOnlyInstructions(IRModule* module, IRStripOptions const& optio
_stripFrontEndOnlyInstructionsRec(module->getModuleInst(), options);
}
+void stripImportedWitnessTable(IRModule* module)
+{
+ for (auto globalInst : module->getGlobalInsts())
+ {
+ auto inst = globalInst;
+ switch (globalInst->getOp())
+ {
+ case kIROp_Generic:
+ inst = findInnerMostGenericReturnVal(as<IRGeneric>(globalInst));
+ break;
+ case kIROp_WitnessTable:
+ break;
+ default:
+ continue;
+ }
+ if (inst->getOp() != kIROp_WitnessTable)
+ continue;
+ if (!globalInst->findDecoration<IRImportDecoration>())
+ continue;
+ IRInst* nextChild = nullptr;
+ for (auto child = inst->getFirstChild(); child;)
+ {
+ nextChild = child->getNextInst();
+ if (child->getOp() == kIROp_WitnessTable)
+ child->removeAndDeallocate();
+ child = nextChild;
+ }
+ }
+}
+
} // namespace Slang