1d33a9dccSMehdi Amini# RUN: toyc-ch4 %s -emit=ast 2>&1 | FileCheck %s 2d33a9dccSMehdi Amini 31ba9bb05SRiver Riddle# User defined generic function that operates on unknown shaped arguments. 4d33a9dccSMehdi Aminidef multiply_transpose(a, b) { 5941a1c43SRiver Riddle return transpose(a) * transpose(b); 6d33a9dccSMehdi Amini} 7d33a9dccSMehdi Amini 8d33a9dccSMehdi Aminidef main() { 9d33a9dccSMehdi Amini # Define a variable `a` with shape <2, 3>, initialized with the literal value. 10d33a9dccSMehdi Amini # The shape is inferred from the supplied literal. 11d33a9dccSMehdi Amini var a = [[1, 2, 3], [4, 5, 6]]; 123940b90dSSana Damani # b is identical to a, the literal array is implicitly reshaped: defining new 131ba9bb05SRiver Riddle # variables is the way to reshape arrays (element count in literal must match 141ba9bb05SRiver Riddle # the size of specified shape). 15d33a9dccSMehdi Amini var b<2, 3> = [1, 2, 3, 4, 5, 6]; 161ba9bb05SRiver Riddle 17d33a9dccSMehdi Amini # This call will specialize `multiply_transpose` with <2, 3> for both 18d33a9dccSMehdi Amini # arguments and deduce a return type of <2, 2> in initialization of `c`. 19d33a9dccSMehdi Amini var c = multiply_transpose(a, b); 20d33a9dccSMehdi Amini # A second call to `multiply_transpose` with <2, 3> for both arguments will 21d33a9dccSMehdi Amini # reuse the previously specialized and inferred version and return `<2, 2>` 22d33a9dccSMehdi Amini var d = multiply_transpose(b, a); 23d33a9dccSMehdi Amini # A new call with `<2, 2>` for both dimension will trigger another 24d33a9dccSMehdi Amini # specialization of `multiply_transpose`. 25d33a9dccSMehdi Amini var e = multiply_transpose(b, c); 26d33a9dccSMehdi Amini # Finally, calling into `multiply_transpose` with incompatible shape will 27d33a9dccSMehdi Amini # trigger a shape inference error. 289f89c34fSAart Bik var f = multiply_transpose(transpose(a), c); 29d33a9dccSMehdi Amini} 30d33a9dccSMehdi Amini 31d33a9dccSMehdi Amini 32d33a9dccSMehdi Amini# CHECK: Module: 33d33a9dccSMehdi Amini# CHECK-NEXT: Function 34*5633813bSRahul Joshi# CHECK-NEXT: Proto 'multiply_transpose' @{{.*}}ast.toy:4:1 35d33a9dccSMehdi Amini# CHECK-NEXT: Params: [a, b] 36d33a9dccSMehdi Amini# CHECK-NEXT: Block { 371bdfc9e7SRiver Riddle# CHECK-NEXT: Return 38941a1c43SRiver Riddle# CHECK-NEXT: BinOp: * @{{.*}}ast.toy:5:25 39941a1c43SRiver Riddle# CHECK-NEXT: Call 'transpose' [ @{{.*}}ast.toy:5:10 40941a1c43SRiver Riddle# CHECK-NEXT: var: a @{{.*}}ast.toy:5:20 41941a1c43SRiver Riddle# CHECK-NEXT: ] 42941a1c43SRiver Riddle# CHECK-NEXT: Call 'transpose' [ @{{.*}}ast.toy:5:25 43941a1c43SRiver Riddle# CHECK-NEXT: var: b @{{.*}}ast.toy:5:35 44d33a9dccSMehdi Amini# CHECK-NEXT: ] 45d33a9dccSMehdi Amini# CHECK-NEXT: } // Block 46d33a9dccSMehdi Amini# CHECK-NEXT: Function 47*5633813bSRahul Joshi# CHECK-NEXT: Proto 'main' @{{.*}}ast.toy:8:1 48d33a9dccSMehdi Amini# CHECK-NEXT: Params: [] 49d33a9dccSMehdi Amini# CHECK-NEXT: Block { 501ba9bb05SRiver Riddle# CHECK-NEXT: VarDecl a<> @{{.*}}ast.toy:11:3 511ba9bb05SRiver 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 5206b0db53SRiver Riddle# CHECK-NEXT: VarDecl b<2, 3> @{{.*}}ast.toy:15:3 5306b0db53SRiver 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 541ba9bb05SRiver Riddle# CHECK-NEXT: VarDecl c<> @{{.*}}ast.toy:19:3 551ba9bb05SRiver Riddle# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:19:11 561ba9bb05SRiver Riddle# CHECK-NEXT: var: a @{{.*}}ast.toy:19:30 571ba9bb05SRiver Riddle# CHECK-NEXT: var: b @{{.*}}ast.toy:19:33 58d33a9dccSMehdi Amini# CHECK-NEXT: ] 591ba9bb05SRiver Riddle# CHECK-NEXT: VarDecl d<> @{{.*}}ast.toy:22:3 601ba9bb05SRiver Riddle# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:22:11 611ba9bb05SRiver Riddle# CHECK-NEXT: var: b @{{.*}}ast.toy:22:30 621ba9bb05SRiver Riddle# CHECK-NEXT: var: a @{{.*}}ast.toy:22:33 63d33a9dccSMehdi Amini# CHECK-NEXT: ] 641ba9bb05SRiver Riddle# CHECK-NEXT: VarDecl e<> @{{.*}}ast.toy:25:3 651ba9bb05SRiver Riddle# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:25:11 661ba9bb05SRiver Riddle# CHECK-NEXT: var: b @{{.*}}ast.toy:25:30 671ba9bb05SRiver Riddle# CHECK-NEXT: var: c @{{.*}}ast.toy:25:33 68d33a9dccSMehdi Amini# CHECK-NEXT: ] 699f89c34fSAart Bik# CHECK-NEXT: VarDecl f<> @{{.*}}ast.toy:28:3 701ba9bb05SRiver Riddle# CHECK-NEXT: Call 'multiply_transpose' [ @{{.*}}ast.toy:28:11 711ba9bb05SRiver Riddle# CHECK-NEXT: Call 'transpose' [ @{{.*}}ast.toy:28:30 721ba9bb05SRiver Riddle# CHECK-NEXT: var: a @{{.*}}ast.toy:28:40 73d33a9dccSMehdi Amini# CHECK-NEXT: ] 741ba9bb05SRiver Riddle# CHECK-NEXT: var: c @{{.*}}ast.toy:28:44 75d33a9dccSMehdi Amini# CHECK-NEXT: ] 76d33a9dccSMehdi Amini 77