Title: [248994] trunk/Source/WebCore
Revision
248994
Author
[email protected]
Date
2019-08-21 19:55:32 -0700 (Wed, 21 Aug 2019)

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

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (248993 => 248994)


--- trunk/Source/WebCore/ChangeLog	2019-08-22 02:50:21 UTC (rev 248993)
+++ trunk/Source/WebCore/ChangeLog	2019-08-22 02:55:32 UTC (rev 248994)
@@ -1,3 +1,21 @@
+2019-08-21  Saam Barati  <[email protected]>
+
+        [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):
+
 2019-08-21  Myles C. Maxfield  <[email protected]>
 
         [WHLSL] Vertex shader and fragment shader need to be able to come from two different programs

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp (248993 => 248994)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp	2019-08-22 02:50:21 UTC (rev 248993)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp	2019-08-22 02:55:32 UTC (rev 248994)
@@ -535,12 +535,11 @@
     m_stringBuilder.append(
         m_indent, mangledTypeName, ' ', valueName, " = ", structVariable, "->", mangledFieldName, ";\n");
 
-    Indentation<4> indent = m_indent;
     appendLeftValue(globalVariableReference, valueName, { }, Nullability::NotNull,
-        [this, mangledTypeName, structVariable, mangledFieldName, indent] {
+        [this, mangledTypeName, structVariable, mangledFieldName] {
             auto pointerName = generateNextVariableName();
             m_stringBuilder.append(
-                indent, "thread ", mangledTypeName, "* ", pointerName, " = &", structVariable, "->", mangledFieldName, ";\n");
+                m_indent, "thread ", mangledTypeName, "* ", pointerName, " = &", structVariable, "->", mangledFieldName, ";\n");
             return pointerName;
         });
 }
@@ -649,21 +648,15 @@
     checkErrorAndVisit(dereferenceExpression.pointer());
     auto [inputPointer, nullability] = takeLastValueAndNullability();
     auto resultValue = generateNextVariableName();
-    auto resultPointer = generateNextVariableName();
+    auto resultType = m_typeNamer.mangledNameForType(dereferenceExpression.resolvedType());
 
-    m_stringBuilder.append(
-        m_indent, m_typeNamer.mangledNameForType(dereferenceExpression.pointer().resolvedType()), ' ', resultPointer, " = ", inputPointer, ";\n",
-        m_indent, m_typeNamer.mangledNameForType(dereferenceExpression.resolvedType()), ' ', resultValue, ";\n");
     if (nullability == Nullability::CanBeNull) {
         m_stringBuilder.append(
-            m_indent, "if (", resultPointer, ")\n",
-            m_indent, "    ", resultValue, " = *", resultPointer, ";\n",
-            m_indent, "else\n",
-            m_indent, "    ", resultValue, " = { };\n"
-        );
+            m_indent, resultType , ' ', resultValue, " = ", inputPointer, " ? ", '*', inputPointer, " : ", resultType, "{ };\n");
     } else
         m_stringBuilder.append(m_indent, resultValue, " = *", inputPointer, ";\n");
-    appendLeftValue(dereferenceExpression, resultValue, resultPointer, nullability);
+
+    appendLeftValue(dereferenceExpression, resultValue, inputPointer, nullability);
 }
 
 void FunctionDefinitionWriter::visit(AST::LogicalExpression& logicalExpression)
@@ -711,12 +704,7 @@
     if (is<AST::PointerType>(makeArrayReferenceExpression.leftValue().resolvedType())) {
         auto ptrValue = takeLastValue();
         m_stringBuilder.append(
-            m_indent, mangledTypeName, ' ', variableName, ";\n",
-            m_indent, "if (", ptrValue, ")\n",
-            m_indent, "    ", variableName, " = { ", ptrValue, ", 1};\n",
-            m_indent, "else\n",
-            m_indent, "    ", variableName, " = { nullptr, 0 };\n"
-        );
+            m_indent, mangledTypeName, ' ', variableName, " = ", ptrValue, " ? ", mangledTypeName, "{ ", ptrValue, ", 1 } : ", mangledTypeName, "{ nullptr, 0 };\n");
     } else if (is<AST::ArrayType>(makeArrayReferenceExpression.leftValue().resolvedType())) {
         auto lValue = takeLastLeftValue().value;
         auto& arrayType = downcast<AST::ArrayType>(makeArrayReferenceExpression.leftValue().resolvedType());
@@ -765,11 +753,10 @@
 
     MangledVariableName variableName = iterator->value;
 
-    Indentation<4> indent = m_indent;
     appendLeftValue(variableReference, variableName, { }, Nullability::NotNull,
-        [this, &variableReference, variableName, indent] {
+        [this, &variableReference, variableName] {
             auto pointerName = generateNextVariableName();
-            m_stringBuilder.append(indent, "thread ", m_typeNamer.mangledNameForType(variableReference.resolvedType()), "* ", pointerName, " = &", variableName, ";\n");
+            m_stringBuilder.append(m_indent, "thread ", m_typeNamer.mangledNameForType(variableReference.resolvedType()), "* ", pointerName, " = &", variableName, ";\n");
             return pointerName;
         });
 }

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp (248993 => 248994)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp	2019-08-22 02:50:21 UTC (rev 248993)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp	2019-08-22 02:55:32 UTC (rev 248994)
@@ -146,15 +146,14 @@
         if (nativeFunctionDeclaration.parameters().size() == 1) {
             auto& parameterType = *nativeFunctionDeclaration.parameters()[0]->type();
             auto metalParameterTypeName = typeNamer.mangledNameForType(parameterType);
-            auto variableName = generateNextVariableName();
 
-            stringBuilder.append(indent, metalParameterTypeName, ' ', variableName, " = ", args[0], ";\n");
-
             auto isEnumerationDefinition = [] (auto& type) {
                 return is<AST::NamedType>(type) && is<AST::EnumerationDefinition>(downcast<AST::NamedType>(type));
             };
             auto& unifiedReturnType = returnType.unifyNode();
             if (isEnumerationDefinition(unifiedReturnType) && !isEnumerationDefinition(parameterType.unifyNode())) {
+                auto variableName = generateNextVariableName();
+                stringBuilder.append(indent, metalParameterTypeName, ' ', variableName, " = ", args[0], ";\n");
                 auto& enumerationDefinition = downcast<AST::EnumerationDefinition>(downcast<AST::NamedType>(unifiedReturnType));
                 stringBuilder.append(indent, "switch (", variableName, ") {\n");
                 {
@@ -173,9 +172,10 @@
                         indent, "    break;\n",
                         indent, "}\n");
                 }
-            }
+                stringBuilder.append(indent, returnName, " = static_cast<", metalReturnTypeName, ">(", variableName, ");\n");
+            } else
+                stringBuilder.append(indent, returnName, " = static_cast<", metalReturnTypeName, ">(", args[0], ");\n");
 
-            stringBuilder.append(indent, returnName, " = static_cast<", metalReturnTypeName, ">(", variableName, ");\n");
             return;
         }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to