From f216b77752b9e4aea52882b2110ceb1cc64a2171 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 13 Sep 2022 13:11:48 -0700 Subject: Deduplicate AST type nodes and cache lookup operations. (#2397) * wip: dedup AST type nodes and cache lookup. * Fix. * Remove profiling. * Fixes. Co-authored-by: Yong He --- source/slang/slang-syntax.cpp | 98 ++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 47 deletions(-) (limited to 'source/slang/slang-syntax.cpp') diff --git a/source/slang/slang-syntax.cpp b/source/slang/slang-syntax.cpp index 957d4e661..9a7200e9d 100644 --- a/source/slang/slang-syntax.cpp +++ b/source/slang/slang-syntax.cpp @@ -355,6 +355,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt DeclRef createDefaultSubstitutionsIfNeeded( ASTBuilder* astBuilder, + SemanticsVisitor* semantics, DeclRef declRef) { // It is possible that `declRef` refers to a generic type, @@ -413,7 +414,8 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt if(!foundSubst) { Substitutions* newSubst = createDefaultSubstitutionsForGeneric( - astBuilder, + astBuilder, + semantics, genericParentDecl, nullptr); @@ -436,7 +438,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt ASTBuilder* astBuilder, DeclRef declRef) { - declRef = createDefaultSubstitutionsIfNeeded(astBuilder, declRef); + declRef = createDefaultSubstitutionsIfNeeded(astBuilder, nullptr, declRef); if (auto builtinMod = declRef.getDecl()->findModifier()) { @@ -458,58 +460,60 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt if (magicMod->magicName == "SamplerState") { - auto type = astBuilder->create(); + auto type = astBuilder->getOrCreate(SamplerStateFlavor(magicMod->tag)); type->declRef = declRef; - type->flavor = SamplerStateFlavor(magicMod->tag); return type; } else if (magicMod->magicName == "Vector") { - SLANG_ASSERT(subst && subst->args.getCount() == 2); - auto vecType = astBuilder->create(); + SLANG_ASSERT(subst && subst->getArgs().getCount() == 2); + auto vecType = astBuilder->getOrCreate(ExtractGenericArgType(subst->getArgs()[0]), ExtractGenericArgInteger(subst->getArgs()[1])); vecType->declRef = declRef; - vecType->elementType = ExtractGenericArgType(subst->args[0]); - vecType->elementCount = ExtractGenericArgInteger(subst->args[1]); + vecType->elementType = ExtractGenericArgType(subst->getArgs()[0]); + vecType->elementCount = ExtractGenericArgInteger(subst->getArgs()[1]); return vecType; } else if (magicMod->magicName == "Matrix") { - SLANG_ASSERT(subst && subst->args.getCount() == 3); - auto matType = astBuilder->create(); + SLANG_ASSERT(subst && subst->getArgs().getCount() == 3); + auto matType = astBuilder->getOrCreate( + ExtractGenericArgType(subst->getArgs()[0]), + ExtractGenericArgInteger(subst->getArgs()[1]), + ExtractGenericArgInteger(subst->getArgs()[2])); matType->declRef = declRef; return matType; } else if (magicMod->magicName == "Texture") { - SLANG_ASSERT(subst && subst->args.getCount() >= 1); - auto textureType = astBuilder->create( + SLANG_ASSERT(subst && subst->getArgs().getCount() >= 1); + auto textureType = astBuilder->getOrCreate( TextureFlavor(magicMod->tag), - ExtractGenericArgType(subst->args[0])); + ExtractGenericArgType(subst->getArgs()[0])); textureType->declRef = declRef; return textureType; } else if (magicMod->magicName == "TextureSampler") { - SLANG_ASSERT(subst && subst->args.getCount() >= 1); + SLANG_ASSERT(subst && subst->getArgs().getCount() >= 1); auto textureType = astBuilder->create( TextureFlavor(magicMod->tag), - ExtractGenericArgType(subst->args[0])); + ExtractGenericArgType(subst->getArgs()[0])); textureType->declRef = declRef; return textureType; } else if (magicMod->magicName == "GLSLImageType") { - SLANG_ASSERT(subst && subst->args.getCount() >= 1); - auto textureType = astBuilder->create( + SLANG_ASSERT(subst && subst->getArgs().getCount() >= 1); + auto textureType = astBuilder->getOrCreate( TextureFlavor(magicMod->tag), - ExtractGenericArgType(subst->args[0])); + ExtractGenericArgType(subst->getArgs()[0])); textureType->declRef = declRef; return textureType; } else if (magicMod->magicName == "FeedbackType") { SLANG_ASSERT(subst == nullptr); - auto type = astBuilder->create(); + auto type = astBuilder->getOrCreateWithDefaultCtor(magicMod->tag); type->declRef = declRef; type->kind = FeedbackType::Kind(magicMod->tag); return type; @@ -519,11 +523,13 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt // and we can drive the dispatch with a table instead // of this ridiculously slow `if` cascade. - #define CASE(n,T) \ - else if(magicMod->magicName == #n) { \ - auto type = astBuilder->create(); \ - type->declRef = declRef; \ - return type; \ + #define CASE(n, T) \ + else if (magicMod->magicName == #n) \ + { \ + auto type = astBuilder->getOrCreateWithDefaultCtor( \ + declRef.decl, declRef.substitutions.substitutions); \ + type->declRef = declRef; \ + return type; \ } CASE(HLSLInputPatchType, HLSLInputPatchType) @@ -531,14 +537,16 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt #undef CASE - #define CASE(n,T) \ - else if(magicMod->magicName == #n) { \ - SLANG_ASSERT(subst && subst->args.getCount() == 1); \ - auto type = astBuilder->create(); \ - type->elementType = ExtractGenericArgType(subst->args[0]); \ - type->declRef = declRef; \ - return type; \ - } + #define CASE(n, T) \ + else if (magicMod->magicName == #n) \ + { \ + SLANG_ASSERT(subst && subst->getArgs().getCount() == 1); \ + auto type = \ + astBuilder->getOrCreateWithDefaultCtor(ExtractGenericArgType(subst->getArgs()[0])); \ + type->elementType = ExtractGenericArgType(subst->getArgs()[0]); \ + type->declRef = declRef; \ + return type; \ + } CASE(ConstantBuffer, ConstantBufferType) CASE(TextureBuffer, TextureBufferType) @@ -561,8 +569,8 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt // "magic" builtin types which have no generic parameters #define CASE(n,T) \ - else if(magicMod->magicName == #n) { \ - auto type = astBuilder->create(); \ + else if(magicMod->magicName == #n) { \ + auto type = astBuilder->getOrCreate(); \ type->declRef = declRef; \ return type; \ } @@ -601,7 +609,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt } else { - return astBuilder->create(declRef); + return astBuilder->getOrCreateDeclRefType(declRef.decl, declRef.substitutions.substitutions); } } @@ -786,10 +794,8 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt substsToApply, &diff); - GenericSubstitution* firstSubst = astBuilder->create(); - firstSubst->genericDecl = ancestorGenericDecl; - firstSubst->args = appGenericSubst->args; - firstSubst->outer = restSubst; + GenericSubstitution* firstSubst = astBuilder->getOrCreateGenericSubstitution( + ancestorGenericDecl, appGenericSubst->getArgs(), restSubst); (*ioDiff)++; return firstSubst; @@ -849,10 +855,8 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt substsToApply, &diff); - ThisTypeSubstitution* firstSubst = astBuilder->create(); - firstSubst->interfaceDecl = ancestorInterfaceDecl; - firstSubst->witness = appThisTypeSubst->witness; - firstSubst->outer = restSubst; + ThisTypeSubstitution* firstSubst = astBuilder->getOrCreateThisTypeSubstitution( + ancestorInterfaceDecl, appThisTypeSubst->witness, restSubst); (*ioDiff)++; return firstSubst; @@ -1013,12 +1017,12 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt Type* HLSLPatchType::getElementType() { - return as(findInnerMostGenericSubstitution(declRef.substitutions)->args[0]); + return as(findInnerMostGenericSubstitution(declRef.substitutions)->getArgs()[0]); } IntVal* HLSLPatchType::getElementCount() { - return as(findInnerMostGenericSubstitution(declRef.substitutions)->args[1]); + return as(findInnerMostGenericSubstitution(declRef.substitutions)->getArgs()[1]); } // Constructors for types @@ -1047,7 +1051,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt ASTBuilder* astBuilder, DeclRef const& declRef) { - DeclRef specializedDeclRef = createDefaultSubstitutionsIfNeeded(astBuilder, declRef).as(); + DeclRef specializedDeclRef = createDefaultSubstitutionsIfNeeded(astBuilder, nullptr, declRef).as(); return astBuilder->create(specializedDeclRef); } @@ -1179,7 +1183,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt { out << "<"; bool isFirst = true; - for (const auto& it : genericSubstitution->args) + for (const auto& it : genericSubstitution->getArgs()) { if (!isFirst) out << ", "; -- cgit v1.2.3