summaryrefslogtreecommitdiffstats
path: root/mlir/test/Examples/Toy/Ch7/ast.toy
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/test/Examples/Toy/Ch7/ast.toy')
-rw-r--r--mlir/test/Examples/Toy/Ch7/ast.toy76
1 files changed, 76 insertions, 0 deletions
diff --git a/mlir/test/Examples/Toy/Ch7/ast.toy b/mlir/test/Examples/Toy/Ch7/ast.toy
new file mode 100644
index 00000000000..b32410e58e7
--- /dev/null
+++ b/mlir/test/Examples/Toy/Ch7/ast.toy
@@ -0,0 +1,76 @@
+# RUN: toyc-ch7 %s -emit=ast 2>&1 | FileCheck %s
+
+# User defined generic function that operates on unknown shaped arguments.
+def multiply_transpose(a, b) {
+ return transpose(a) * transpose(b);
+}
+
+def main() {
+ # Define a variable `a` with shape <2, 3>, initialized with the literal value.
+ # The shape is inferred from the supplied literal.
+ var a = [[1, 2, 3], [4, 5, 6]];
+ # b is identical to a, the literal array is implicitly reshaped: defining new
+ # variables is the way to reshape arrays (element count in literal must match
+ # the size of specified shape).
+ var b<2, 3> = [1, 2, 3, 4, 5, 6];
+
+ # This call will specialize `multiply_transpose` with <2, 3> for both
+ # arguments and deduce a return type of <2, 2> in initialization of `c`.
+ var c = multiply_transpose(a, b);
+ # A second call to `multiply_transpose` with <2, 3> for both arguments will
+ # reuse the previously specialized and inferred version and return `<2, 2>`
+ var d = multiply_transpose(b, a);
+ # A new call with `<2, 2>` for both dimension will trigger another
+ # specialization of `multiply_transpose`.
+ var e = multiply_transpose(b, c);
+ # Finally, calling into `multiply_transpose` with incompatible shape will
+ # trigger a shape inference error.
+ var e = multiply_transpose(transpose(a), c);
+}
+
+
+# CHECK: Module:
+# CHECK-NEXT: Function
+# CHECK-NEXT: Proto 'multiply_transpose' @{{.*}}ast.toy:4:1'
+# CHECK-NEXT: Params: [a, b]
+# CHECK-NEXT: Block {
+# CHECK-NEXT: Return
+# CHECK-NEXT: BinOp: * @{{.*}}ast.toy:5:25
+# CHECK-NEXT: Call 'transpose' [ @{{.*}}ast.toy:5:10
+# CHECK-NEXT: var: a @{{.*}}ast.toy:5:20
+# CHECK-NEXT: ]
+# CHECK-NEXT: Call 'transpose' [ @{{.*}}ast.toy:5:25
+# CHECK-NEXT: var: b @{{.*}}ast.toy:5:35
+# CHECK-NEXT: ]
+# CHECK-NEXT: } // Block
+# CHECK-NEXT: Function
+# CHECK-NEXT: Proto 'main' @{{.*}}ast.toy:8:1'
+# CHECK-NEXT: Params: []
+# CHECK-NEXT: Block {
+# CHECK-NEXT: VarDecl a<> @{{.*}}ast.toy:11:3
+# CHECK-NEXT: Literal: <2, 3>[ <3>[ 1.000000e+00, 2.000000e+00, 3.000000e+00], <3>[ 4.000000e+00, 5.000000e+00, 6.000000e+00]] @{{.*}}ast.toy:11:11
+# CHECK-NEXT: VarDecl b<2, 3> @{{.*}}ast.toy:15:3
+# CHECK-NEXT: Literal: <6>[ 1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00, 5.000000e+00, 6.000000e+00] @{{.*}}ast.toy:15:17
+# CHECK-NEXT: VarDecl c<> @{{.*}}ast.toy:19:3
+# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:19:11
+# CHECK-NEXT: var: a @{{.*}}ast.toy:19:30
+# CHECK-NEXT: var: b @{{.*}}ast.toy:19:33
+# CHECK-NEXT: ]
+# CHECK-NEXT: VarDecl d<> @{{.*}}ast.toy:22:3
+# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:22:11
+# CHECK-NEXT: var: b @{{.*}}ast.toy:22:30
+# CHECK-NEXT: var: a @{{.*}}ast.toy:22:33
+# CHECK-NEXT: ]
+# CHECK-NEXT: VarDecl e<> @{{.*}}ast.toy:25:3
+# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:25:11
+# CHECK-NEXT: var: b @{{.*}}ast.toy:25:30
+# CHECK-NEXT: var: c @{{.*}}ast.toy:25:33
+# CHECK-NEXT: ]
+# CHECK-NEXT: VarDecl e<> @{{.*}}ast.toy:28:3
+# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:28:11
+# CHECK-NEXT: Call 'transpose' [ @{{.*}}ast.toy:28:30
+# CHECK-NEXT: var: a @{{.*}}ast.toy:28:40
+# CHECK-NEXT: ]
+# CHECK-NEXT: var: c @{{.*}}ast.toy:28:44
+# CHECK-NEXT: ]
+
OpenPOWER on IntegriCloud