Title: [221448] trunk/Tools
Revision
221448
Author
fpi...@apple.com
Date
2017-08-31 15:15:18 -0700 (Thu, 31 Aug 2017)

Log Message

WSL EPtr does not need to carry around the type
https://bugs.webkit.org/show_bug.cgi?id=176188

Reviewed by Saam Barati.
        
To validate that the interpreter is modeling a statically typed execution environment, it's
really best if values don't know their types at all. A pointer is just a pointer (i.e a buffer
and offset in our world), and it's the job of the AST node that uses it to figure out what its
type should be.
        
I think this makes the code simpler overall.

* WebGPUShadingLanguageRI/All.js:
* WebGPUShadingLanguageRI/CallFunction.js:
(callFunctionByRef):
(callFunction):
* WebGPUShadingLanguageRI/Checker.js:
(Checker.prototype.visitProtocolDecl.set throw):
* WebGPUShadingLanguageRI/EBufferBuilder.js:
(EBufferBuilder.prototype._createEPtr):
* WebGPUShadingLanguageRI/EPtr.js:
(EPtr):
(EPtr.box):
(EPtr.prototype.copyFrom):
(EPtr.prototype.toString):
* WebGPUShadingLanguageRI/EValue.js: Removed.
* WebGPUShadingLanguageRI/Evaluator.js:
(Evaluator.prototype.visitFunctionLikeBlock):
(Evaluator.prototype.visitVariableDecl):
(Evaluator.prototype.visitAssignment):
(Evaluator.prototype.visitIntLiteral):
* WebGPUShadingLanguageRI/Intrinsics.js:
(Intrinsics):
* WebGPUShadingLanguageRI/Rewriter.js:
(Rewriter.prototype.visitAssignment):
* WebGPUShadingLanguageRI/StructType.js:
(StructType.prototype.instantiate):
* WebGPUShadingLanguageRI/Test.js:
(checkInt):

Modified Paths

Removed Paths

Diff

Modified: trunk/Tools/ChangeLog (221447 => 221448)


--- trunk/Tools/ChangeLog	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/ChangeLog	2017-08-31 22:15:18 UTC (rev 221448)
@@ -1,5 +1,47 @@
 2017-08-31  Filip Pizlo  <fpi...@apple.com>
 
+        WSL EPtr does not need to carry around the type
+        https://bugs.webkit.org/show_bug.cgi?id=176188
+
+        Reviewed by Saam Barati.
+        
+        To validate that the interpreter is modeling a statically typed execution environment, it's
+        really best if values don't know their types at all. A pointer is just a pointer (i.e a buffer
+        and offset in our world), and it's the job of the AST node that uses it to figure out what its
+        type should be.
+        
+        I think this makes the code simpler overall.
+
+        * WebGPUShadingLanguageRI/All.js:
+        * WebGPUShadingLanguageRI/CallFunction.js:
+        (callFunctionByRef):
+        (callFunction):
+        * WebGPUShadingLanguageRI/Checker.js:
+        (Checker.prototype.visitProtocolDecl.set throw):
+        * WebGPUShadingLanguageRI/EBufferBuilder.js:
+        (EBufferBuilder.prototype._createEPtr):
+        * WebGPUShadingLanguageRI/EPtr.js:
+        (EPtr):
+        (EPtr.box):
+        (EPtr.prototype.copyFrom):
+        (EPtr.prototype.toString):
+        * WebGPUShadingLanguageRI/EValue.js: Removed.
+        * WebGPUShadingLanguageRI/Evaluator.js:
+        (Evaluator.prototype.visitFunctionLikeBlock):
+        (Evaluator.prototype.visitVariableDecl):
+        (Evaluator.prototype.visitAssignment):
+        (Evaluator.prototype.visitIntLiteral):
+        * WebGPUShadingLanguageRI/Intrinsics.js:
+        (Intrinsics):
+        * WebGPUShadingLanguageRI/Rewriter.js:
+        (Rewriter.prototype.visitAssignment):
+        * WebGPUShadingLanguageRI/StructType.js:
+        (StructType.prototype.instantiate):
+        * WebGPUShadingLanguageRI/Test.js:
+        (checkInt):
+
+2017-08-31  Filip Pizlo  <fpi...@apple.com>
+
         WSL doesn't need to wrap primitives like ints and floats in specialized classes like EInt and EFloat
         https://bugs.webkit.org/show_bug.cgi?id=176184
 

Modified: trunk/Tools/WebGPUShadingLanguageRI/All.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/All.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/All.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -31,7 +31,6 @@
 load("_expression_.js");
 load("Rewriter.js");
 load("Visitor.js");
-load("EValue.js");
 
 load("AddressSpace.js");
 load("ArrayRefType.js");

Modified: trunk/Tools/WebGPUShadingLanguageRI/CallFunction.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/CallFunction.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/CallFunction.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -27,18 +27,14 @@
 // This allows you to pass structs and arrays in-place, but it's a more annoying API.
 function callFunctionByRef(program, name, typeArguments, argumentList)
 {
-    let argumentTypes = argumentList.map(argument => {
-        let result = argument.type.elementType;
-        if (!result)
-            throw new Error("Argument has no element type: " + argument);
-        return result;
-    });
+    let argumentTypes = argumentList.map(argument => argument.type);
     let func = resolveInlinedFunction(program, name, typeArguments, argumentTypes);
     if (!func)
         throw new WTypeError("<callFunction>", "Cannot resolve function call " + name + "<" + typeArguments + ">(" + argumentList + ")");
     for (let i = 0; i < func.parameters.length; ++i)
-        func.parameters[i].ePtr.copyFrom(argumentList[i]);
-    return new Evaluator(program).visitFunctionBody(func.body);
+        func.parameters[i].ePtr.copyFrom(argumentList[i].value, argumentTypes[i].size);
+    let result = new Evaluator(program).visitFunctionBody(func.body);
+    return new TypedValue(func.returnType, result);
 }
 
 // This uses the simplified TypedValue object for wrapping values like integers and doubles.
@@ -46,6 +42,6 @@
 {
     let result = callFunctionByRef(
         program, name, typeArguments,
-        argumentList.map(argument => EPtr.box(argument.type, argument.value)));
-    return new TypedValue(result.type.elementType, result.loadValue());
+        argumentList.map(argument => new TypedValue(argument.type, EPtr.box(argument.value))));
+    return new TypedValue(result.type, result.value.loadValue());
 }

Modified: trunk/Tools/WebGPUShadingLanguageRI/Checker.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/Checker.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Checker.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -128,6 +128,7 @@
         let rhsType = node.rhs.visit(this);
         if (!lhsType.equals(rhsType))
             throw new WTypeError(node.origin.originString, "Type mismatch in assignment: " + lhsType + " versus " + rhsType);
+        node.type = lhsType;
         return lhsType;
     }
     

Modified: trunk/Tools/WebGPUShadingLanguageRI/EBufferBuilder.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/EBufferBuilder.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/EBufferBuilder.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -36,7 +36,7 @@
         type = type.instantiatedType;
         let buffer = new EBuffer(type.size);
         type.populateDefaultValue(buffer, 0);
-        return new EPtr(new PtrType(null, "thread", type), buffer, 0);
+        return new EPtr(buffer, 0);
     }
     
     _createEPtrForNode(node)

Modified: trunk/Tools/WebGPUShadingLanguageRI/EPtr.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/EPtr.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/EPtr.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -24,12 +24,9 @@
  */
 "use strict";
 
-class EPtr extends EValue {
-    constructor(type, buffer, offset)
+class EPtr {
+    constructor(buffer, offset)
     {
-        super(type);
-        if (!(type.unifyNode instanceof PtrType))
-            throw new Error("Cannot create EPtr with non-ptr type: " + type);
         this._buffer = buffer;
         this._offset = offset;
     }
@@ -39,13 +36,11 @@
     // function is here to help.
     //
     // In a real execution environment, uses of this manifest as SSA temporaries.
-    static box(type, value)
+    static box(value)
     {
-        if (!type || !value)
-            throw new Error("Need both type and value");
         let buffer = new EBuffer(1);
         buffer.set(0, value);
-        return new EPtr(new PtrType(null, "thread", type), buffer, 0);
+        return new EPtr(buffer, 0);
     }
     
     get buffer() { return this._buffer; }
@@ -56,12 +51,9 @@
         return this.buffer.get(this.offset);
     }
     
-    copyFrom(other)
+    copyFrom(other, size)
     {
-        let elementType = this.type.elementType;
-        if (!elementType)
-            throw new Error("No element type: " + this);
-        for (let i = elementType.size; i--;)
+        for (let i = size; i--;)
             this.buffer.set(i, other.buffer.get(i));
     }
     
@@ -69,7 +61,7 @@
     {
         if (!this.buffer)
             return "null";
-        return this.type + "B" + this.buffer.index + ":" + this.offset;
+        return "B" + this.buffer.index + ":" + this.offset;
     }
 }
 

Deleted: trunk/Tools/WebGPUShadingLanguageRI/EValue.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/EValue.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/EValue.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class EValue {
-    constructor(type)
-    {
-        if (!type)
-            throw new Error("No type");
-        this._type = type.unifyNode;
-    }
-    
-    get type() { return this._type; }
-}
-

Modified: trunk/Tools/WebGPUShadingLanguageRI/Evaluator.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/Evaluator.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Evaluator.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -50,8 +50,11 @@
     
     visitFunctionLikeBlock(node)
     {
-        for (let i = 0; i < node.argumentList.length; ++i)
-            node.parameters[i].ePtr.copyFrom(node.argumentList[i].visit(this));
+        for (let i = 0; i < node.argumentList.length; ++i) {
+            node.parameters[i].ePtr.copyFrom(
+                node.argumentList[i].visit(this),
+                node.parameters[i].type.size);
+        }
         return this.visitFunctionBody(node.body);
     }
     
@@ -62,15 +65,17 @@
     
     visitVariableDecl(node)
     {
+        if (!node.ePtr.buffer)
+            throw new Error("eptr without buffer in " + node);
         node.type.populateDefaultValue(node.ePtr.buffer, node.ePtr.offset);
         if (node.initializer)
-            node.ePtr.copyFrom(node.initializer.visit(this));
+            node.ePtr.copyFrom(node.initializer.visit(this), node.type.size);
     }
     
     visitAssignment(node)
     {
         let result = node.lhs.visit(this);
-        result.copyFrom(node.rhs.visit(this));
+        result.copyFrom(node.rhs.visit(this), node.type.size);
         return result;
     }
     
@@ -89,7 +94,7 @@
     
     visitIntLiteral(node)
     {
-        return EPtr.box(this._program.intrinsics.int32, node.value);
+        return EPtr.box(node.value);
     }
     
     visitCallExpression(node)

Modified: trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -62,7 +62,7 @@
             "native int operator+<>(int,int)",
             (func) => {
                 func.implementation =
-                    ([left, right]) => EPtr.box(this.int32, (left.loadValue() + right.loadValue()) | 0);
+                    ([left, right]) => EPtr.box((left.loadValue() + right.loadValue()) | 0);
             });
     }
     

Modified: trunk/Tools/WebGPUShadingLanguageRI/Rewriter.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/Rewriter.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Rewriter.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -138,7 +138,9 @@
     
     visitAssignment(node)
     {
-        return new Assignment(node.origin, node.lhs.visit(this), node.rhs.visit(this));
+        let result = new Assignment(node.origin, node.lhs.visit(this), node.rhs.visit(this));
+        result.type = node.type.visit(this);
+        return result;
     }
     
     visitVariableRef(node)

Modified: trunk/Tools/WebGPUShadingLanguageRI/StructType.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/StructType.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/StructType.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -61,6 +61,9 @@
         if (typeArguments.length != this.typeParameters.length)
             throw new WTypeError(origin.originString, "Wrong number of type arguments to instantiation");
         
+        if (!typeArguments.length)
+            return this;
+        
         let substitution = Substitution.mapping(this.typeParameters, typeArguments);
         let instantiateImmediates = new InstantiateImmediates();
         let result = new StructType(this.origin, this.name, []);

Modified: trunk/Tools/WebGPUShadingLanguageRI/Test.js (221447 => 221448)


--- trunk/Tools/WebGPUShadingLanguageRI/Test.js	2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Test.js	2017-08-31 22:15:18 UTC (rev 221448)
@@ -38,7 +38,7 @@
 
 function checkInt(program, result, expected)
 {
-    if (result.type != program.intrinsics.int32)
+    if (!result.type.equals(program.intrinsics.int32))
         throw new Error("Wrong result type; result: " + result);
     if (result.value != expected)
         throw new Error("Wrong result: " + result + " (expected " + expected + ")");
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to