Don't use TIntermSymbol nodes for function parameters
Parameter nodes are not needed - it's simpler to just create a
TVariable object for each parameter when the TFunction is initialized.
With this change we also store only one object per each parameter type
used in built-in functions, instead of one array of TConstParameter
entries for each unique parameter sequence.
This simplifies code and reduces binary size and compiler memory use.
Compiler perf does not seem to be significantly affected.
BUG=angleproject:2267
TEST=angle_unittests
Change-Id: I2b82400dd594731074309f92a705e75135a4c82c
Reviewed-on: https://chromium-review.googlesource.com/955589
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/compiler/translator/RemoveDynamicIndexing.cpp b/src/compiler/translator/RemoveDynamicIndexing.cpp
index 2b77ab3..1357676 100644
--- a/src/compiler/translator/RemoveDynamicIndexing.cpp
+++ b/src/compiler/translator/RemoveDynamicIndexing.cpp
@@ -65,13 +65,6 @@
return nameSink.str();
}
-TIntermSymbol *CreateParameterSymbol(const TConstParameter ¶meter, TSymbolTable *symbolTable)
-{
- TVariable *variable =
- new TVariable(symbolTable, parameter.name, parameter.type, SymbolType::AngleInternal);
- return new TIntermSymbol(variable);
-}
-
TIntermConstantUnion *CreateIntConstantNode(int i)
{
TConstantUnion *constant = new TConstantUnion();
@@ -180,15 +173,12 @@
std::string functionName = GetIndexFunctionName(type, write);
TIntermFunctionPrototype *prototypeNode = CreateInternalFunctionPrototypeNode(func);
- TIntermSymbol *baseParam = CreateParameterSymbol(func.getParam(0), symbolTable);
- prototypeNode->getSequence()->push_back(baseParam);
- TIntermSymbol *indexParam = CreateParameterSymbol(func.getParam(1), symbolTable);
- prototypeNode->getSequence()->push_back(indexParam);
+ TIntermSymbol *baseParam = new TIntermSymbol(func.getParam(0));
+ TIntermSymbol *indexParam = new TIntermSymbol(func.getParam(1));
TIntermSymbol *valueParam = nullptr;
if (write)
{
- valueParam = CreateParameterSymbol(func.getParam(2), symbolTable);
- prototypeNode->getSequence()->push_back(valueParam);
+ valueParam = new TIntermSymbol(func.getParam(2));
}
TIntermBlock *statementList = new TIntermBlock();
@@ -408,9 +398,10 @@
indexingFunction =
new TFunction(mSymbolTable, indexingFunctionName, SymbolType::AngleInternal,
GetFieldType(type), true);
+ indexingFunction->addParameter(new TVariable(
+ mSymbolTable, kBaseName, GetBaseType(type, false), SymbolType::AngleInternal));
indexingFunction->addParameter(
- TConstParameter(kBaseName, GetBaseType(type, false)));
- indexingFunction->addParameter(TConstParameter(kIndexName, kIndexType));
+ new TVariable(mSymbolTable, kIndexName, kIndexType, SymbolType::AngleInternal));
mIndexedVecAndMatrixTypes[type] = indexingFunction;
}
else
@@ -458,13 +449,16 @@
indexedWriteFunction =
new TFunction(mSymbolTable, functionName, SymbolType::AngleInternal,
StaticType::GetBasic<EbtVoid>(), false);
- indexedWriteFunction->addParameter(
- TConstParameter(kBaseName, GetBaseType(type, true)));
- indexedWriteFunction->addParameter(TConstParameter(kIndexName, kIndexType));
+ indexedWriteFunction->addParameter(new TVariable(mSymbolTable, kBaseName,
+ GetBaseType(type, true),
+ SymbolType::AngleInternal));
+ indexedWriteFunction->addParameter(new TVariable(
+ mSymbolTable, kIndexName, kIndexType, SymbolType::AngleInternal));
TType *valueType = GetFieldType(type);
valueType->setQualifier(EvqIn);
- indexedWriteFunction->addParameter(
- TConstParameter(kValueName, static_cast<const TType *>(valueType)));
+ indexedWriteFunction->addParameter(new TVariable(
+ mSymbolTable, kValueName, static_cast<const TType *>(valueType),
+ SymbolType::AngleInternal));
mWrittenVecAndMatrixTypes[type] = indexedWriteFunction;
}
else