xref: /llvm-project/mlir/test/Examples/Toy/Ch7/ast.toy (revision 5633813bf376ef12056cc8ce34c03c445d0dbce5)
16b4e30b7SRiver Riddle# RUN: toyc-ch7 %s -emit=ast 2>&1 | FileCheck %s
26b4e30b7SRiver Riddle
36b4e30b7SRiver Riddle# User defined generic function that operates on unknown shaped arguments.
46b4e30b7SRiver Riddledef multiply_transpose(a, b) {
56b4e30b7SRiver Riddle  return transpose(a) * transpose(b);
66b4e30b7SRiver Riddle}
76b4e30b7SRiver Riddle
86b4e30b7SRiver Riddledef main() {
96b4e30b7SRiver Riddle  # Define a variable `a` with shape <2, 3>, initialized with the literal value.
106b4e30b7SRiver Riddle  # The shape is inferred from the supplied literal.
116b4e30b7SRiver Riddle  var a = [[1, 2, 3], [4, 5, 6]];
126b4e30b7SRiver Riddle  # b is identical to a, the literal array is implicitly reshaped: defining new
136b4e30b7SRiver Riddle  # variables is the way to reshape arrays (element count in literal must match
146b4e30b7SRiver Riddle  # the size of specified shape).
156b4e30b7SRiver Riddle  var b<2, 3> = [1, 2, 3, 4, 5, 6];
166b4e30b7SRiver Riddle
176b4e30b7SRiver Riddle  # This call will specialize `multiply_transpose` with <2, 3> for both
186b4e30b7SRiver Riddle  # arguments and deduce a return type of <2, 2> in initialization of `c`.
196b4e30b7SRiver Riddle  var c = multiply_transpose(a, b);
206b4e30b7SRiver Riddle  # A second call to `multiply_transpose` with <2, 3> for both arguments will
216b4e30b7SRiver Riddle  # reuse the previously specialized and inferred version and return `<2, 2>`
226b4e30b7SRiver Riddle  var d = multiply_transpose(b, a);
236b4e30b7SRiver Riddle  # A new call with `<2, 2>` for both dimension will trigger another
246b4e30b7SRiver Riddle  # specialization of `multiply_transpose`.
256b4e30b7SRiver Riddle  var e = multiply_transpose(b, c);
266b4e30b7SRiver Riddle  # Finally, calling into `multiply_transpose` with incompatible shape will
276b4e30b7SRiver Riddle  # trigger a shape inference error.
289f89c34fSAart Bik  var f = multiply_transpose(transpose(a), c);
296b4e30b7SRiver Riddle}
306b4e30b7SRiver Riddle
316b4e30b7SRiver Riddle
326b4e30b7SRiver Riddle# CHECK: Module:
336b4e30b7SRiver Riddle# CHECK-NEXT:     Function
34*5633813bSRahul Joshi# CHECK-NEXT:       Proto 'multiply_transpose' @{{.*}}ast.toy:4:1
356b4e30b7SRiver Riddle# CHECK-NEXT:       Params: [a, b]
366b4e30b7SRiver Riddle# CHECK-NEXT:       Block {
376b4e30b7SRiver Riddle# CHECK-NEXT:         Return
386b4e30b7SRiver Riddle# CHECK-NEXT:           BinOp: * @{{.*}}ast.toy:5:25
396b4e30b7SRiver Riddle# CHECK-NEXT:             Call 'transpose' [ @{{.*}}ast.toy:5:10
406b4e30b7SRiver Riddle# CHECK-NEXT:               var: a @{{.*}}ast.toy:5:20
416b4e30b7SRiver Riddle# CHECK-NEXT:             ]
426b4e30b7SRiver Riddle# CHECK-NEXT:             Call 'transpose' [ @{{.*}}ast.toy:5:25
436b4e30b7SRiver Riddle# CHECK-NEXT:               var: b @{{.*}}ast.toy:5:35
446b4e30b7SRiver Riddle# CHECK-NEXT:             ]
456b4e30b7SRiver Riddle# CHECK-NEXT:       } // Block
466b4e30b7SRiver Riddle# CHECK-NEXT:     Function
47*5633813bSRahul Joshi# CHECK-NEXT:       Proto 'main' @{{.*}}ast.toy:8:1
486b4e30b7SRiver Riddle# CHECK-NEXT:       Params: []
496b4e30b7SRiver Riddle# CHECK-NEXT:       Block {
506b4e30b7SRiver Riddle# CHECK-NEXT:         VarDecl a<> @{{.*}}ast.toy:11:3
516b4e30b7SRiver Riddle# 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
526b4e30b7SRiver Riddle# CHECK-NEXT:         VarDecl b<2, 3> @{{.*}}ast.toy:15:3
536b4e30b7SRiver Riddle# 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
546b4e30b7SRiver Riddle# CHECK-NEXT:         VarDecl c<> @{{.*}}ast.toy:19:3
556b4e30b7SRiver Riddle# CHECK-NEXT:           Call 'multiply_transpose' [ @{{.*}}ast.toy:19:11
566b4e30b7SRiver Riddle# CHECK-NEXT:             var: a @{{.*}}ast.toy:19:30
576b4e30b7SRiver Riddle# CHECK-NEXT:             var: b @{{.*}}ast.toy:19:33
586b4e30b7SRiver Riddle# CHECK-NEXT:           ]
596b4e30b7SRiver Riddle# CHECK-NEXT:         VarDecl d<> @{{.*}}ast.toy:22:3
606b4e30b7SRiver Riddle# CHECK-NEXT:           Call 'multiply_transpose' [ @{{.*}}ast.toy:22:11
616b4e30b7SRiver Riddle# CHECK-NEXT:             var: b @{{.*}}ast.toy:22:30
626b4e30b7SRiver Riddle# CHECK-NEXT:             var: a @{{.*}}ast.toy:22:33
636b4e30b7SRiver Riddle# CHECK-NEXT:           ]
646b4e30b7SRiver Riddle# CHECK-NEXT:         VarDecl e<> @{{.*}}ast.toy:25:3
656b4e30b7SRiver Riddle# CHECK-NEXT:           Call 'multiply_transpose' [ @{{.*}}ast.toy:25:11
666b4e30b7SRiver Riddle# CHECK-NEXT:             var: b @{{.*}}ast.toy:25:30
676b4e30b7SRiver Riddle# CHECK-NEXT:             var: c @{{.*}}ast.toy:25:33
686b4e30b7SRiver Riddle# CHECK-NEXT:           ]
699f89c34fSAart Bik# CHECK-NEXT:         VarDecl f<> @{{.*}}ast.toy:28:3
706b4e30b7SRiver Riddle# CHECK-NEXT:           Call 'multiply_transpose' [ @{{.*}}ast.toy:28:11
716b4e30b7SRiver Riddle# CHECK-NEXT:             Call 'transpose' [ @{{.*}}ast.toy:28:30
726b4e30b7SRiver Riddle# CHECK-NEXT:               var: a @{{.*}}ast.toy:28:40
736b4e30b7SRiver Riddle# CHECK-NEXT:             ]
746b4e30b7SRiver Riddle# CHECK-NEXT:             var: c @{{.*}}ast.toy:28:44
756b4e30b7SRiver Riddle# CHECK-NEXT:           ]
766b4e30b7SRiver Riddle
77