1// RUN: toyc-ch6 %s -emit=mlir-affine 2>&1 | FileCheck %s 2// RUN: toyc-ch6 %s -emit=mlir-affine -opt 2>&1 | FileCheck %s --check-prefix=OPT 3 4func @main() { 5 %0 = toy.constant dense<[[1.000000e+00, 2.000000e+00, 3.000000e+00], [4.000000e+00, 5.000000e+00, 6.000000e+00]]> : tensor<2x3xf64> 6 %2 = toy.transpose(%0 : tensor<2x3xf64>) to tensor<3x2xf64> 7 %3 = toy.mul %2, %2 : tensor<3x2xf64> 8 toy.print %3 : tensor<3x2xf64> 9 toy.return 10} 11 12// CHECK-LABEL: func @main() 13// CHECK: [[VAL_0:%.*]] = constant 1.000000e+00 : f64 14// CHECK: [[VAL_1:%.*]] = constant 2.000000e+00 : f64 15// CHECK: [[VAL_2:%.*]] = constant 3.000000e+00 : f64 16// CHECK: [[VAL_3:%.*]] = constant 4.000000e+00 : f64 17// CHECK: [[VAL_4:%.*]] = constant 5.000000e+00 : f64 18// CHECK: [[VAL_5:%.*]] = constant 6.000000e+00 : f64 19// CHECK: [[VAL_6:%.*]] = alloc() : memref<3x2xf64> 20// CHECK: [[VAL_7:%.*]] = alloc() : memref<3x2xf64> 21// CHECK: [[VAL_8:%.*]] = alloc() : memref<2x3xf64> 22// CHECK: affine.store [[VAL_0]], [[VAL_8]][0, 0] : memref<2x3xf64> 23// CHECK: affine.store [[VAL_1]], [[VAL_8]][0, 1] : memref<2x3xf64> 24// CHECK: affine.store [[VAL_2]], [[VAL_8]][0, 2] : memref<2x3xf64> 25// CHECK: affine.store [[VAL_3]], [[VAL_8]][1, 0] : memref<2x3xf64> 26// CHECK: affine.store [[VAL_4]], [[VAL_8]][1, 1] : memref<2x3xf64> 27// CHECK: affine.store [[VAL_5]], [[VAL_8]][1, 2] : memref<2x3xf64> 28// CHECK: affine.for [[VAL_9:%.*]] = 0 to 3 { 29// CHECK: affine.for [[VAL_10:%.*]] = 0 to 2 { 30// CHECK: [[VAL_11:%.*]] = affine.load [[VAL_8]]{{\[}}[[VAL_10]], [[VAL_9]]] : memref<2x3xf64> 31// CHECK: affine.store [[VAL_11]], [[VAL_7]]{{\[}}[[VAL_9]], [[VAL_10]]] : memref<3x2xf64> 32// CHECK: affine.for [[VAL_12:%.*]] = 0 to 3 { 33// CHECK: affine.for [[VAL_13:%.*]] = 0 to 2 { 34// CHECK: [[VAL_14:%.*]] = affine.load [[VAL_7]]{{\[}}[[VAL_12]], [[VAL_13]]] : memref<3x2xf64> 35// CHECK: [[VAL_15:%.*]] = affine.load [[VAL_7]]{{\[}}[[VAL_12]], [[VAL_13]]] : memref<3x2xf64> 36// CHECK: [[VAL_16:%.*]] = mulf [[VAL_14]], [[VAL_15]] : f64 37// CHECK: affine.store [[VAL_16]], [[VAL_6]]{{\[}}[[VAL_12]], [[VAL_13]]] : memref<3x2xf64> 38// CHECK: toy.print [[VAL_6]] : memref<3x2xf64> 39// CHECK: dealloc [[VAL_8]] : memref<2x3xf64> 40// CHECK: dealloc [[VAL_7]] : memref<3x2xf64> 41// CHECK: dealloc [[VAL_6]] : memref<3x2xf64> 42 43// OPT-LABEL: func @main() 44// OPT: [[VAL_0:%.*]] = constant 1.000000e+00 : f64 45// OPT: [[VAL_1:%.*]] = constant 2.000000e+00 : f64 46// OPT: [[VAL_2:%.*]] = constant 3.000000e+00 : f64 47// OPT: [[VAL_3:%.*]] = constant 4.000000e+00 : f64 48// OPT: [[VAL_4:%.*]] = constant 5.000000e+00 : f64 49// OPT: [[VAL_5:%.*]] = constant 6.000000e+00 : f64 50// OPT: [[VAL_6:%.*]] = alloc() : memref<3x2xf64> 51// OPT: [[VAL_7:%.*]] = alloc() : memref<2x3xf64> 52// OPT: affine.store [[VAL_0]], [[VAL_7]][0, 0] : memref<2x3xf64> 53// OPT: affine.store [[VAL_1]], [[VAL_7]][0, 1] : memref<2x3xf64> 54// OPT: affine.store [[VAL_2]], [[VAL_7]][0, 2] : memref<2x3xf64> 55// OPT: affine.store [[VAL_3]], [[VAL_7]][1, 0] : memref<2x3xf64> 56// OPT: affine.store [[VAL_4]], [[VAL_7]][1, 1] : memref<2x3xf64> 57// OPT: affine.store [[VAL_5]], [[VAL_7]][1, 2] : memref<2x3xf64> 58// OPT: affine.for [[VAL_8:%.*]] = 0 to 3 { 59// OPT: affine.for [[VAL_9:%.*]] = 0 to 2 { 60// OPT: [[VAL_10:%.*]] = affine.load [[VAL_7]]{{\[}}[[VAL_9]], [[VAL_8]]] : memref<2x3xf64> 61// OPT: [[VAL_11:%.*]] = mulf [[VAL_10]], [[VAL_10]] : f64 62// OPT: affine.store [[VAL_11]], [[VAL_6]]{{\[}}[[VAL_8]], [[VAL_9]]] : memref<3x2xf64> 63// OPT: toy.print [[VAL_6]] : memref<3x2xf64> 64// OPT: dealloc [[VAL_7]] : memref<2x3xf64> 65// OPT: dealloc [[VAL_6]] : memref<3x2xf64> 66