Skip to content

Commit 0e703e5

Browse files
committed
[WHLSL] Improve default constructor and emit fewer pointers in metal codegen
https://bugs.webkit.org/show_bug.cgi?id=200995 Reviewed by Myles C. Maxfield. This patch makes it so that we: 1. Emit less code for copy constructors by omitting an unused variable. 2. Emit ternary expressions instead of if statements for conditional assignments. 3. Don't copy pointers for producing an lvalue from DereferenceExpression. 4. Lazily produce lvalues for GlobalVariableReference. * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp: (WebCore::WHLSL::Metal::FunctionDefinitionWriter::visit): * Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp: (WebCore::WHLSL::Metal::inlineNativeFunction): Canonical link: https://commits.webkit.org/214732@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248994 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 6745d3d commit 0e703e5

3 files changed

Lines changed: 32 additions & 27 deletions

File tree

Source/WebCore/ChangeLog

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1+
2019-08-21 Saam Barati <sbarati@apple.com>
2+
3+
[WHLSL] Improve default constructor and emit fewer pointers in metal codegen
4+
https://bugs.webkit.org/show_bug.cgi?id=200995
5+
6+
Reviewed by Myles C. Maxfield.
7+
8+
This patch makes it so that we:
9+
1. Emit less code for copy constructors by omitting an unused variable.
10+
2. Emit ternary expressions instead of if statements for conditional assignments.
11+
3. Don't copy pointers for producing an lvalue from DereferenceExpression.
12+
4. Lazily produce lvalues for GlobalVariableReference.
13+
14+
* Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp:
15+
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::visit):
16+
* Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp:
17+
(WebCore::WHLSL::Metal::inlineNativeFunction):
18+
119
2019-08-21 Myles C. Maxfield <mmaxfield@apple.com>
220

321
[WHLSL] Vertex shader and fragment shader need to be able to come from two different programs

Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -535,12 +535,11 @@ void FunctionDefinitionWriter::visit(AST::GlobalVariableReference& globalVariabl
535535
m_stringBuilder.append(
536536
m_indent, mangledTypeName, ' ', valueName, " = ", structVariable, "->", mangledFieldName, ";\n");
537537

538-
Indentation<4> indent = m_indent;
539538
appendLeftValue(globalVariableReference, valueName, { }, Nullability::NotNull,
540-
[this, mangledTypeName, structVariable, mangledFieldName, indent] {
539+
[this, mangledTypeName, structVariable, mangledFieldName] {
541540
auto pointerName = generateNextVariableName();
542541
m_stringBuilder.append(
543-
indent, "thread ", mangledTypeName, "* ", pointerName, " = &", structVariable, "->", mangledFieldName, ";\n");
542+
m_indent, "thread ", mangledTypeName, "* ", pointerName, " = &", structVariable, "->", mangledFieldName, ";\n");
544543
return pointerName;
545544
});
546545
}
@@ -649,21 +648,15 @@ void FunctionDefinitionWriter::visit(AST::DereferenceExpression& dereferenceExpr
649648
checkErrorAndVisit(dereferenceExpression.pointer());
650649
auto [inputPointer, nullability] = takeLastValueAndNullability();
651650
auto resultValue = generateNextVariableName();
652-
auto resultPointer = generateNextVariableName();
651+
auto resultType = m_typeNamer.mangledNameForType(dereferenceExpression.resolvedType());
653652

654-
m_stringBuilder.append(
655-
m_indent, m_typeNamer.mangledNameForType(dereferenceExpression.pointer().resolvedType()), ' ', resultPointer, " = ", inputPointer, ";\n",
656-
m_indent, m_typeNamer.mangledNameForType(dereferenceExpression.resolvedType()), ' ', resultValue, ";\n");
657653
if (nullability == Nullability::CanBeNull) {
658654
m_stringBuilder.append(
659-
m_indent, "if (", resultPointer, ")\n",
660-
m_indent, " ", resultValue, " = *", resultPointer, ";\n",
661-
m_indent, "else\n",
662-
m_indent, " ", resultValue, " = { };\n"
663-
);
655+
m_indent, resultType , ' ', resultValue, " = ", inputPointer, " ? ", '*', inputPointer, " : ", resultType, "{ };\n");
664656
} else
665657
m_stringBuilder.append(m_indent, resultValue, " = *", inputPointer, ";\n");
666-
appendLeftValue(dereferenceExpression, resultValue, resultPointer, nullability);
658+
659+
appendLeftValue(dereferenceExpression, resultValue, inputPointer, nullability);
667660
}
668661

669662
void FunctionDefinitionWriter::visit(AST::LogicalExpression& logicalExpression)
@@ -711,12 +704,7 @@ void FunctionDefinitionWriter::visit(AST::MakeArrayReferenceExpression& makeArra
711704
if (is<AST::PointerType>(makeArrayReferenceExpression.leftValue().resolvedType())) {
712705
auto ptrValue = takeLastValue();
713706
m_stringBuilder.append(
714-
m_indent, mangledTypeName, ' ', variableName, ";\n",
715-
m_indent, "if (", ptrValue, ")\n",
716-
m_indent, " ", variableName, " = { ", ptrValue, ", 1};\n",
717-
m_indent, "else\n",
718-
m_indent, " ", variableName, " = { nullptr, 0 };\n"
719-
);
707+
m_indent, mangledTypeName, ' ', variableName, " = ", ptrValue, " ? ", mangledTypeName, "{ ", ptrValue, ", 1 } : ", mangledTypeName, "{ nullptr, 0 };\n");
720708
} else if (is<AST::ArrayType>(makeArrayReferenceExpression.leftValue().resolvedType())) {
721709
auto lValue = takeLastLeftValue().value;
722710
auto& arrayType = downcast<AST::ArrayType>(makeArrayReferenceExpression.leftValue().resolvedType());
@@ -765,11 +753,10 @@ void FunctionDefinitionWriter::visit(AST::VariableReference& variableReference)
765753

766754
MangledVariableName variableName = iterator->value;
767755

768-
Indentation<4> indent = m_indent;
769756
appendLeftValue(variableReference, variableName, { }, Nullability::NotNull,
770-
[this, &variableReference, variableName, indent] {
757+
[this, &variableReference, variableName] {
771758
auto pointerName = generateNextVariableName();
772-
m_stringBuilder.append(indent, "thread ", m_typeNamer.mangledNameForType(variableReference.resolvedType()), "* ", pointerName, " = &", variableName, ";\n");
759+
m_stringBuilder.append(m_indent, "thread ", m_typeNamer.mangledNameForType(variableReference.resolvedType()), "* ", pointerName, " = &", variableName, ";\n");
773760
return pointerName;
774761
});
775762
}

Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,14 @@ void inlineNativeFunction(StringBuilder& stringBuilder, AST::NativeFunctionDecla
146146
if (nativeFunctionDeclaration.parameters().size() == 1) {
147147
auto& parameterType = *nativeFunctionDeclaration.parameters()[0]->type();
148148
auto metalParameterTypeName = typeNamer.mangledNameForType(parameterType);
149-
auto variableName = generateNextVariableName();
150-
151-
stringBuilder.append(indent, metalParameterTypeName, ' ', variableName, " = ", args[0], ";\n");
152149

153150
auto isEnumerationDefinition = [] (auto& type) {
154151
return is<AST::NamedType>(type) && is<AST::EnumerationDefinition>(downcast<AST::NamedType>(type));
155152
};
156153
auto& unifiedReturnType = returnType.unifyNode();
157154
if (isEnumerationDefinition(unifiedReturnType) && !isEnumerationDefinition(parameterType.unifyNode())) {
155+
auto variableName = generateNextVariableName();
156+
stringBuilder.append(indent, metalParameterTypeName, ' ', variableName, " = ", args[0], ";\n");
158157
auto& enumerationDefinition = downcast<AST::EnumerationDefinition>(downcast<AST::NamedType>(unifiedReturnType));
159158
stringBuilder.append(indent, "switch (", variableName, ") {\n");
160159
{
@@ -173,9 +172,10 @@ void inlineNativeFunction(StringBuilder& stringBuilder, AST::NativeFunctionDecla
173172
indent, " break;\n",
174173
indent, "}\n");
175174
}
176-
}
175+
stringBuilder.append(indent, returnName, " = static_cast<", metalReturnTypeName, ">(", variableName, ");\n");
176+
} else
177+
stringBuilder.append(indent, returnName, " = static_cast<", metalReturnTypeName, ">(", args[0], ");\n");
177178

178-
stringBuilder.append(indent, returnName, " = static_cast<", metalReturnTypeName, ">(", variableName, ");\n");
179179
return;
180180
}
181181

0 commit comments

Comments
 (0)