Changeset 248994 in webkit


Ignore:
Timestamp:
Aug 21, 2019 7:55:32 PM (5 years ago)
Author:
sbarati@apple.com
Message:

[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):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r248993 r248994  
     12019-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
    1192019-08-21  Myles C. Maxfield  <mmaxfield@apple.com>
    220
  • trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp

    r248993 r248994  
    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        });
     
    650649    auto [inputPointer, nullability] = takeLastValueAndNullability();
    651650    auto resultValue = generateNextVariableName();
    652     auto resultPointer = generateNextVariableName();
    653 
    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");
     651    auto resultType = m_typeNamer.mangledNameForType(dereferenceExpression.resolvedType());
     652
    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
     
    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;
     
    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        });
  • trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp

    r248920 r248994  
    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) {
     
    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");
     
    174173                        indent, "}\n");
    175174                }
    176             }
    177 
    178             stringBuilder.append(indent, returnName, " = static_cast<", metalReturnTypeName, ">(", variableName, ");\n");
     175                stringBuilder.append(indent, returnName, " = static_cast<", metalReturnTypeName, ">(", variableName, ");\n");
     176            } else
     177                stringBuilder.append(indent, returnName, " = static_cast<", metalReturnTypeName, ">(", args[0], ");\n");
     178
    179179            return;
    180180        }
Note: See TracChangeset for help on using the changeset viewer.