summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-shader.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-09-13 13:11:48 -0700
committerGitHub <noreply@github.com>2022-09-13 13:11:48 -0700
commitf216b77752b9e4aea52882b2110ceb1cc64a2171 (patch)
treefbb33485b7260bc0f89b406e1be6fb8196f94196 /source/slang/slang-check-shader.cpp
parent9f3e83cf0d664c87a618edf08d834829178030e6 (diff)
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 <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-check-shader.cpp')
-rw-r--r--source/slang/slang-check-shader.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/source/slang/slang-check-shader.cpp b/source/slang/slang-check-shader.cpp
index 2e577b6d5..d7200d47c 100644
--- a/source/slang/slang-check-shader.cpp
+++ b/source/slang/slang-check-shader.cpp
@@ -1120,7 +1120,7 @@ namespace Slang
if(!intVal)
{
sink->diagnose(param.loc, Diagnostics::expectedValueOfTypeForSpecializationArg, paramDecl->getType(), paramDecl);
- intVal = getLinkage()->getASTBuilder()->create<ConstantIntVal>(m_astBuilder->getIntType(), 0);
+ intVal = getLinkage()->getASTBuilder()->getOrCreate<ConstantIntVal>(m_astBuilder->getIntType(), 0);
}
ModuleSpecializationInfo::GenericArgInfo expandedArg;
@@ -1192,15 +1192,18 @@ namespace Slang
auto genericDeclRef = m_funcDeclRef.getParent().as<GenericDecl>();
SLANG_ASSERT(genericDeclRef); // otherwise we wouldn't have generic parameters
- GenericSubstitution* genericSubst = getLinkage()->getASTBuilder()->create<GenericSubstitution>();
- genericSubst->outer = genericDeclRef.substitutions.substitutions;
- genericSubst->genericDecl = genericDeclRef.getDecl();
+ List<Val*> genericArgs;
for(Index ii = 0; ii < genericSpecializationParamCount; ++ii)
{
auto specializationArg = args[ii];
- genericSubst->args.add(specializationArg.val);
+ genericArgs.add(specializationArg.val);
}
+ GenericSubstitution* genericSubst =
+ getLinkage()->getASTBuilder()->getOrCreateGenericSubstitution(
+ genericDeclRef.getDecl(),
+ genericArgs,
+ genericDeclRef.substitutions.substitutions);
for( auto constraintDecl : genericDeclRef.getDecl()->getMembersOfType<GenericTypeConstraintDecl>() )
{
@@ -1218,7 +1221,7 @@ namespace Slang
auto subTypeWitness = visitor.tryGetSubtypeWitness(sub, sup);
if(subTypeWitness)
{
- genericSubst->args.add(subTypeWitness);
+ genericArgs.add(subTypeWitness);
}
else
{
@@ -1228,6 +1231,11 @@ namespace Slang
}
}
+ genericSubst =
+ getLinkage()->getASTBuilder()->getOrCreateGenericSubstitution(
+ genericDeclRef.getDecl(),
+ genericArgs,
+ genericDeclRef.substitutions.substitutions);
specializedFuncDeclRef.substitutions.substitutions = genericSubst;
}