From fc54adee1f7f0ba18591fc84ce5d51ac23afa954 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 26 Apr 2023 17:37:04 -0700 Subject: Autodiff support for dynamically dispatched generic method. (#2846) * Autodiff support for dynamically dispatched generic method. * Fix. * Support dynamically dispatched generic type. --------- Co-authored-by: Yong He --- source/slang/slang-lower-to-ir.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'source/slang/slang-lower-to-ir.cpp') diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index d644d01c7..c8a41c7c7 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -7429,7 +7429,12 @@ struct DeclLoweringVisitor : DeclVisitor } else { - if (auto callableDecl = as(requirementDecl)) + CallableDecl* callableDecl = nullptr; + if (auto genDecl = as(requirementDecl)) + callableDecl = as(genDecl->inner); + else + callableDecl = as(requirementDecl); + if (callableDecl) { // Differentiable functions has additional requirements for the derivatives. for (auto diffDecl : callableDecl->getMembersOfType()) @@ -8369,7 +8374,12 @@ struct DeclLoweringVisitor : DeclVisitor LoweredValInfo lowerFuncDeclInContext(IRGenContext* subContext, IRBuilder* subBuilder, FunctionDeclBase* decl, bool emitBody = true) { - auto outerGeneric = emitOuterGenerics(subContext, decl, decl); + IRGeneric* outerGeneric = nullptr; + + if (auto derivativeRequirement = as(decl)) + outerGeneric = emitOuterGenerics(subContext, derivativeRequirement->originalRequirementDecl, derivativeRequirement->originalRequirementDecl); + else + outerGeneric = emitOuterGenerics(subContext, decl, decl); // need to create an IR function here -- cgit v1.2.3