diff --git a/test/mlir/krnl/constant.mlir b/test/mlir/krnl/constant.mlir index b2d501b..6068ecb 100644 --- a/test/mlir/krnl/constant.mlir +++ b/test/mlir/krnl/constant.mlir @@ -1,5 +1,7 @@ // RUN: onnx-mlir-opt --shape-inference --lower-frontend --lower-krnl --lower-all-llvm %s -split-input-file | FileCheck %s +// ----- + func @test_constant(%arg0 : tensor<1xf32>) -> tensor<*xf32> { %0 = "onnx.Constant"() {value = dense<[[0.0, 0.0], [1.0, 1.1], [2.0, 2.1]]> : tensor<3x2xf32>} : () -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () diff --git a/test/mlir/krnl/ops.mlir b/test/mlir/krnl/ops.mlir index 11bbc70..2e7c89d 100644 --- a/test/mlir/krnl/ops.mlir +++ b/test/mlir/krnl/ops.mlir @@ -1,6 +1,8 @@ // RUN: onnx-mlir-opt %s -mlir-print-op-generic | FileCheck -check-prefix=GENERIC %s // RUN: onnx-mlir-opt %s | FileCheck %s +// ----- + // GENERIC-DAG: #{{.*}} = affine_map<() -> (0)> // GENERIC-DAG: #{{.*}} = affine_map<() -> (10)> // GENERIC-DAG: #{{.*}} = affine_map<() -> (1)> @@ -46,6 +48,8 @@ func @simple_iterate(%N : index) { return } +// ----- + func @affine_map_bound(%N : index) { %ii, %ij, %ik = krnl.define_loops 3 %oi, %oj, %ok = krnl.optimize_loops { @@ -72,4 +76,4 @@ func @affine_map_bound(%N : index) { } return -} \ No newline at end of file +} diff --git a/test/mlir/krnl/reshape.mlir b/test/mlir/krnl/reshape.mlir index ddc9883..42e183a 100644 --- a/test/mlir/krnl/reshape.mlir +++ b/test/mlir/krnl/reshape.mlir @@ -1,5 +1,7 @@ // RUN: onnx-mlir-opt --shape-inference --lower-frontend --lower-krnl --lower-all-llvm %s -split-input-file | FileCheck %s +// ----- + func @test_reshape(%arg0 : tensor, %arg1 : tensor<4xi32>) -> tensor<*xf32> { %0 = "onnx.Reshape"(%arg0, %arg1) : (tensor, tensor<4xi32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () diff --git a/test/mlir/onnx/onnx_canonicalization.mlir b/test/mlir/onnx/onnx_canonicalization.mlir index a839253..eb27b39 100644 --- a/test/mlir/onnx/onnx_canonicalization.mlir +++ b/test/mlir/onnx/onnx_canonicalization.mlir @@ -1,5 +1,7 @@ // RUN: onnx-mlir-opt --canonicalize %s -split-input-file | FileCheck %s +// ----- + // CHECK-LABEL: func @test_matmul_add_fused(%{{.*}}: tensor<10x10xf32>, %{{.*}}: tensor<10x10xf32>, %{{.*}}: tensor<10x10xf32>) -> tensor<10x10xf32> { func @test_matmul_add_fused(%a0: tensor<10x10xf32>, %a1: tensor<10x10xf32>, %a2: tensor<10x10xf32>) -> tensor<10x10xf32> { // CHECK-NEXT: %{{[0-9]+}} = "onnx.Gemm"(%{{.*}}, %{{.*}}, %{{.*}}) {alpha = 1.000000e+00 : f32, beta = 1.000000e+00 : f32, transA = 0 : i64, transB = 0 : i64} : (tensor<10x10xf32>, tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32> @@ -8,6 +10,8 @@ func @test_matmul_add_fused(%a0: tensor<10x10xf32>, %a1: tensor<10x10xf32>, %a2: "std.return"(%1) : (tensor<10x10xf32>) -> () } +// ----- + // onnx.MatMul ops for non 2-D matrices should not get fused because Gemm only supports 2-D matrices. // CHECK-LABEL: func @test_matmul_add_not_fused(%{{.*}}: tensor<10x10x10xf32>, %{{.*}}: tensor<10x10x10xf32>, %{{.*}}: tensor<10x10x10xf32>) -> tensor<10x10x10xf32> { func @test_matmul_add_not_fused(%a0: tensor<10x10x10xf32>, %a1: tensor<10x10x10xf32>, %a2: tensor<10x10x10xf32>) -> tensor<10x10x10xf32> { @@ -17,6 +21,7 @@ func @test_matmul_add_not_fused(%a0: tensor<10x10x10xf32>, %a1: tensor<10x10x10x "std.return"(%1) : (tensor<10x10x10xf32>) -> () } +// ----- // onnx.MatMul ops with more than one result uses should not get fused. // CHECK-LABEL: func @test_sigmoid_add(%{{.*}}: tensor<10x10xf32>, %{{.*}}: tensor<10x10xf32>, %{{.*}}: tensor<10x10xf32>) -> tensor<10x10xf32> @@ -29,6 +34,8 @@ func @test_sigmoid_add(%a0: tensor<10x10xf32>, %a1: tensor<10x10xf32>, %a2: tens "std.return"(%3) : (tensor<10x10xf32>) -> () } +// ----- + // CHECK-LABEL: @test_identity_identity(%{{.*}}: tensor<10x10xf32>, %{{.*}}: tensor<10x10xf32>) -> tensor<10x10xf32> func @test_identity_identity(%a0: tensor<10x10xf32>, %a1: tensor<10x10xf32>) -> tensor<10x10xf32> { // CHECK-NEXT: %{{[0-9]+}} = "onnx.Add"(%{{.*}}, %{{.*}}) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32> @@ -38,6 +45,8 @@ func @test_identity_identity(%a0: tensor<10x10xf32>, %a1: tensor<10x10xf32>) -> "std.return"(%2) : (tensor<10x10xf32>) -> () } +// ----- + // CHECK-LABEL: @test_constant_pad(%{{.*}}: tensor) -> tensor<*xf32> { func @test_constant_pad(%arg0 : tensor) -> tensor<*xf32> { // CHECK-NEXT: [[SQUARE:%.+]] = "onnx.PadConstantValuePad"(%arg0) {constant_value = 0.000000e+00 : f32, mode = "constant", pads = [0, 2, 0, 0]} : (tensor) -> tensor<*xf32> @@ -46,6 +55,8 @@ func @test_constant_pad(%arg0 : tensor) -> tensor<*xf32> { "std.return"(%2) : (tensor<*xf32>) -> () } +// ----- + // CHECK-LABEL: @test_conv_split(%{{.*}}: tensor<1x9x32x64xf32>, %{{.*}}: tensor<5x9x6x7xf32>) -> tensor<*xf32> { func @test_conv_split(%arg0 : tensor<1x9x32x64xf32>, %arg1 : tensor<5x9x6x7xf32>) -> tensor<*xf32> { %cst = constant unit @@ -57,6 +68,8 @@ func @test_conv_split(%arg0 : tensor<1x9x32x64xf32>, %arg1 : tensor<5x9x6x7xf32> // CHECK-NEXT: return %1 : tensor<*xf32> } +// ----- + //CHECK-LABEL: @test_gemm_add_fusion(%{{.*}}: tensor<128x128xf32>, %{{.*}}: tensor<128x128xf32>, %{{.*}}: tensor<128xf32>) -> tensor<*xf32> { func @test_gemm_add_fusion(%arg0: tensor<128x128xf32>, %arg1: tensor<128x128xf32>, %arg2: tensor<128xf32>) -> tensor<*xf32> { %cst = constant unit @@ -68,6 +81,8 @@ func @test_gemm_add_fusion(%arg0: tensor<128x128xf32>, %arg1: tensor<128x128xf32 // return [[GEMM]] : tensor<*xf32> } +// ----- + //CHECK-LABEL: @test_gemm_add_fusion_rank3(%{{.*}}: tensor<128x128x256xf32>, %{{.*}}: tensor<128x128x256xf32>, %{{.*}}: tensor<256xf32>) -> tensor<*xf32> { func @test_gemm_add_fusion_rank3(%arg0: tensor<128x128x256xf32>, %arg1: tensor<128x128x256xf32>, %arg2: tensor<256xf32>) -> tensor<*xf32> { %cst = constant unit @@ -79,6 +94,8 @@ func @test_gemm_add_fusion_rank3(%arg0: tensor<128x128x256xf32>, %arg1: tensor<1 // return [[GEMM]] : tensor<*xf32> } +// ----- + //CHECK-LABEL: @test_maxpoolsingleout_split(%{{.*}}: tensor<5x5x32x32xf32>) -> tensor<5x5x36x38xf32> { func @test_maxpoolsingleout_split(%arg0: tensor<5x5x32x32xf32>) -> tensor<5x5x36x38xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [5,3], pads = [1, 2, 3, 4] } : (tensor<5x5x32x32xf32>) -> tensor<5x5x36x38xf32> @@ -89,6 +106,8 @@ func @test_maxpoolsingleout_split(%arg0: tensor<5x5x32x32xf32>) -> tensor<5x5x36 // CHECK-NEXT: return %1 : tensor<5x5x36x38xf32> } +// ----- + //CHECK-LABEL: @test_maxpoolsingleout_split_unknown_dims(%{{.*}}: tensor<*xf32>) -> tensor<*xf32> { func @test_maxpoolsingleout_split_unknown_dims(%arg0: tensor<*xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [5,3], pads = [1, 2, 3, 4] } : (tensor<*xf32>) -> tensor<*xf32> diff --git a/test/mlir/onnx/onnx_decompose.mlir b/test/mlir/onnx/onnx_decompose.mlir index 8d58663..3ae9384 100644 --- a/test/mlir/onnx/onnx_decompose.mlir +++ b/test/mlir/onnx/onnx_decompose.mlir @@ -1,5 +1,7 @@ // RUN: onnx-mlir-opt --decompose-onnx %s -split-input-file | FileCheck %s +// ----- + // CHECK-LABEL: @test_reducel1(%{{.*}}: tensor) -> tensor<*xf32> func @test_reducel1(%arg0 : tensor) -> tensor<*xf32> { %0 ="onnx.ReduceL1"(%arg0) {axes=[1], keepdims = 0 : i64} : (tensor)-> tensor<*xf32> @@ -9,6 +11,8 @@ func @test_reducel1(%arg0 : tensor) -> tensor<*xf32> { // CHECK-NEXT: %{{[0-9]+}} = "onnx.ReduceSum"([[ABS]]) {axes = [1], keepdims = 0 : i64} : (tensor<*xf32>) -> tensor<*xf32> } +// ----- + // CHECK-LABEL: @test_reducel2(%{{.*}}: tensor) -> tensor<*xf32> func @test_reducel2(%arg0 : tensor) -> tensor<*xf32> { %0 ="onnx.ReduceL2"(%arg0) {axes=[1], keepdims = 0 : i64} : (tensor)-> tensor<*xf32> @@ -19,6 +23,8 @@ func @test_reducel2(%arg0 : tensor) -> tensor<*xf32> { // CHECK-NEXT: [[SQRT:%.+]] = "onnx.Sqrt"([[REDUCE_SUM]]) : (tensor<*xf32>) -> tensor<*xf32> } +// ----- + // CHECK-LABEL: @test_reducelogsum(%{{.*}}: tensor) -> tensor<*xf32> func @test_reducelogsum(%arg0 : tensor) -> tensor<*xf32> { %0 ="onnx.ReduceLogSum"(%arg0) {axes=[1], keepdims = 0 : i64} : (tensor)-> tensor<*xf32> @@ -28,6 +34,8 @@ func @test_reducelogsum(%arg0 : tensor) -> tensor<*xf32> { // CHECK-NEXT: [[LOG:%.+]] = "onnx.Log"([[REDUCE_SUM]]) : (tensor<*xf32>) -> tensor<*xf32> } +// ----- + // CHECK-LABEL: @test_reducelogsumexp(%{{.*}}: tensor) -> tensor<*xf32> func @test_reducelogsumexp(%arg0 : tensor) -> tensor<*xf32> { %0 ="onnx.ReduceLogSumExp"(%arg0) {axes=[1], keepdims = 0 : i64} : (tensor)-> tensor<*xf32> @@ -38,6 +46,8 @@ func @test_reducelogsumexp(%arg0 : tensor) -> tensor<*xf32> { // CHECK-NEXT: [[LOG:%.+]] = "onnx.Log"([[REDUCE_SUM]]) : (tensor<*xf32>) -> tensor<*xf32> } +// ----- + // CHECK-LABEL: @test_reducesumsquare(%{{.*}}: tensor) -> tensor<*xf32> func @test_reducesumsquare(%arg0 : tensor) -> tensor<*xf32> { %0 ="onnx.ReduceSumSquare"(%arg0) {axes=[1], keepdims = 0 : i64} : (tensor)-> tensor<*xf32> diff --git a/test/mlir/onnx/onnx_lowering.mlir b/test/mlir/onnx/onnx_lowering.mlir index 36a3e16..9f0af27 100644 --- a/test/mlir/onnx/onnx_lowering.mlir +++ b/test/mlir/onnx/onnx_lowering.mlir @@ -1,5 +1,7 @@ // RUN: onnx-mlir-opt --shape-inference --lower-frontend %s -split-input-file | FileCheck %s +// ----- + func @test_add(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Add"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -18,6 +20,8 @@ func @test_add(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<* // CHECK: return [[RES]] : memref<10x10xf32> } +// ----- + func @test_mul(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Mul"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -36,6 +40,8 @@ func @test_mul(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<* // CHECK: return [[RES]] : memref<10x10xf32> } +// ----- + func @test_div(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Div"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -54,6 +60,8 @@ func @test_div(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<* // CHECK: return [[RES]] : memref<10x10xf32> } +// ----- + func @test_sub(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Sub"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -72,6 +80,8 @@ func @test_sub(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<* // CHECK: return [[RES]] : memref<10x10xf32> } +// ----- + func @test_and(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*xi32> { %0 = "onnx.And"(%arg0, %arg1) : (tensor<10x10xi32>, tensor<10x10xi32>) -> tensor<*xi32> "std.return"(%0) : (tensor<*xi32>) -> () @@ -90,6 +100,8 @@ func @test_and(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<* // CHECK: return [[RES]] : memref<10x10xi32> } +// ----- + func @test_or(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*xi32> { %0 = "onnx.Or"(%arg0, %arg1) : (tensor<10x10xi32>, tensor<10x10xi32>) -> tensor<*xi32> "std.return"(%0) : (tensor<*xi32>) -> () @@ -108,6 +120,8 @@ func @test_or(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*x // CHECK: return [[RES]] : memref<10x10xi32> } +// ----- + func @test_xor(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*xi32> { %0 = "onnx.Xor"(%arg0, %arg1) : (tensor<10x10xi32>, tensor<10x10xi32>) -> tensor<*xi32> "std.return"(%0) : (tensor<*xi32>) -> () @@ -126,6 +140,8 @@ func @test_xor(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<* // CHECK: return [[RES]] : memref<10x10xi32> } +// ----- + func @test_exp(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Exp"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -145,6 +161,8 @@ func @test_exp(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_tanh(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Tanh"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -170,6 +188,8 @@ func @test_tanh(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_sinh(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Sinh"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -195,6 +215,8 @@ func @test_sinh(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_cosh(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Cosh"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -220,6 +242,8 @@ func @test_cosh(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_cos(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Cos"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -239,6 +263,8 @@ func @test_cos(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_log(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Log"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -258,6 +284,8 @@ func @test_log(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_sigmoid(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Sigmoid"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -282,6 +310,8 @@ func @test_sigmoid(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_relu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Relu"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -303,6 +333,8 @@ func @test_relu(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_reshape(%arg0 : tensor, %arg1 : tensor<4xi32>) -> tensor<*xf32> { %0 = "onnx.Reshape"(%arg0, %arg1) : (tensor, tensor<4xi32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -374,6 +406,8 @@ func @test_reshape(%arg0 : tensor, %arg1 : tensor<4xi32>) -> tensor<*x // CHECK: return [[ALLOC]] : memref } +// ----- + func @test_sum(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Sum"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -392,6 +426,8 @@ func @test_sum(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<* // CHECK: return [[RES]] : memref<10x10xf32> } +// ----- + func @test_max(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Max"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -411,6 +447,8 @@ func @test_max(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<* // CHECK: return [[RES]] : memref<10x10xf32> } +// ----- + func @test_min(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Min"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -430,6 +468,8 @@ func @test_min(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<* // CHECK: return [[RES]] : memref<10x10xf32> } +// ----- + func @test_elu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Elu"(%arg0) {alpha=2.0:f32} : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -456,6 +496,8 @@ func @test_elu(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_leakyrelu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.LeakyRelu"(%arg0) {alpha=1.0:f32} : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -479,6 +521,8 @@ func @test_leakyrelu(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_selu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Selu"(%arg0) {alpha=1.0:f32, gamma=2.0:f32} : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -506,6 +550,8 @@ func @test_selu(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_hardsigmoid(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.HardSigmoid"(%arg0) {alpha=1.0:f32, beta=2.0:f32} : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -534,6 +580,8 @@ func @test_hardsigmoid(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_reciprocal(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Reciprocal"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -554,6 +602,8 @@ func @test_reciprocal(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_softplus(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Softplus"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -576,6 +626,8 @@ func @test_softplus(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_softsign(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Softsign"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -598,6 +650,8 @@ func @test_softsign(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_add_with_broadcasting(%arg0 : tensor, %arg1 : tensor) -> tensor<*xf32> { %0 = "onnx.Add"(%arg0, %arg1) : (tensor, tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -624,6 +678,8 @@ func @test_add_with_broadcasting(%arg0 : tensor, %arg1 : tensor // CHECK: return [[RES]] : memref } +// ----- + func @test_reducemax(%arg0 : tensor<3x2x2xf32>) -> tensor<*xf32> { %0 ="onnx.ReduceMax"(%arg0) {axes=[1], keepdims = 0 : i64} : (tensor<3x2x2xf32>)-> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -652,6 +708,8 @@ func @test_reducemax(%arg0 : tensor<3x2x2xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : memref<3x2xf32> } +// ----- + func @test_reducemin(%arg0 : tensor<3x2x2xf32>) -> tensor<*xf32> { %0 ="onnx.ReduceMin"(%arg0) {axes=[1], keepdims = 0 : i64} : (tensor<3x2x2xf32>)-> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -680,6 +738,8 @@ func @test_reducemin(%arg0 : tensor<3x2x2xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : memref<3x2xf32> } +// ----- + func @test_reduceprod(%arg0 : tensor<3x2x2xf32>) -> tensor<*xf32> { %0 ="onnx.ReduceProd"(%arg0) {axes=[1], keepdims = 0 : i64} : (tensor<3x2x2xf32>)-> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -707,6 +767,8 @@ func @test_reduceprod(%arg0 : tensor<3x2x2xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : memref<3x2xf32> } +// ----- + func @test_reducesum(%arg0 : tensor<3x2x2xf32>) -> tensor<*xf32> { %0 ="onnx.ReduceSum"(%arg0) {axes=[1], keepdims = 0 : i64} : (tensor<3x2x2xf32>)-> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -734,6 +796,8 @@ func @test_reducesum(%arg0 : tensor<3x2x2xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : memref<3x2xf32> } +// ----- + func @test_softmax(%arg0 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Softmax"(%arg0) {axis=1:i64} : (tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -780,6 +844,8 @@ func @test_softmax(%arg0 : tensor<10x10xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : memref<10x10xf32> } +// ----- + func @test_gemm(%arg0 : tensor<5x10xf32>, %arg1 : tensor<5x10xf32>, %arg2: tensor<10xf32>) -> tensor<*xf32> { %0 ="onnx.Gemm"(%arg0, %arg1, %arg2) {alpha = 1.0 : f32, beta = 5.0 : f32, transA = 1, transB = 0} : (tensor<5x10xf32>, tensor<5x10xf32>, tensor<10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -812,6 +878,8 @@ func @test_gemm(%arg0 : tensor<5x10xf32>, %arg1 : tensor<5x10xf32>, %arg2: tenso // CHECK: } } +// ----- + func @test_sqrt(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Sqrt"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -831,6 +899,8 @@ func @test_sqrt(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_unsqueeze(%arg0 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Unsqueeze"(%arg0) {axes=[0,3]} : (tensor<10x10xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -850,6 +920,8 @@ func @test_unsqueeze(%arg0 : tensor<10x10xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : memref<1x10x10x1xf32> } +// ----- + func @test_transpose(%arg0 : tensor<10x20x30x40xf32>) -> tensor<*xf32> { %0 = "onnx.Transpose"(%arg0) : (tensor<10x20x30x40xf32>) -> tensor<*xf32> %1 = "onnx.Transpose"(%0) {perm = [0, 3, 1, 2]} : (tensor<*xf32>) -> tensor<*xf32> @@ -879,6 +951,8 @@ func @test_transpose(%arg0 : tensor<10x20x30x40xf32>) -> tensor<*xf32> { // CHECK: return [[RES0]] : memref<40x10x30x20xf32> } +// ----- + func @test_identity(%arg0 : tensor<10x20x30x40xf32>) -> tensor<*xf32> { %0 = "onnx.Identity"(%arg0) : (tensor<10x20x30x40xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -887,6 +961,8 @@ func @test_identity(%arg0 : tensor<10x20x30x40xf32>) -> tensor<*xf32> { // CHECK: return %arg0 : memref<10x20x30x40xf32> } +// ----- + func @test_sign_f(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Sign"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -912,6 +988,8 @@ func @test_sign_f(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_sign_i(%arg0 : tensor) -> tensor<*xi32> { %0 = "onnx.Sign"(%arg0) : (tensor) -> tensor<*xi32> "std.return"(%0) : (tensor<*xi32>) -> () @@ -937,6 +1015,8 @@ func @test_sign_i(%arg0 : tensor) -> tensor<*xi32> { // CHECK: return [[RES]] : memref } +// ----- + // 2-D x 2-D func @test_matmul1(%arg0 : tensor<10x5xf32>, %arg1 : tensor<5x10xf32>) -> tensor<*xf32> { %0 ="onnx.MatMul"(%arg0, %arg1) : (tensor<10x5xf32>, tensor<5x10xf32>) -> tensor<*xf32> @@ -967,6 +1047,8 @@ func @test_matmul1(%arg0 : tensor<10x5xf32>, %arg1 : tensor<5x10xf32>) -> tensor // CHECK: return [[RES]] : memref<10x10xf32> } +// ----- + // 2-D x N-D func @test_matmul2(%arg0 : tensor<10x5xf32>, %arg1 : tensor<2x3x5x10xf32>) -> tensor<*xf32> { %0 ="onnx.MatMul"(%arg0, %arg1) : (tensor<10x5xf32>, tensor<2x3x5x10xf32>) -> tensor<*xf32> @@ -999,6 +1081,8 @@ func @test_matmul2(%arg0 : tensor<10x5xf32>, %arg1 : tensor<2x3x5x10xf32>) -> te // CHECK: return [[RES]] : memref<2x3x10x10xf32> } +// ----- + // N-D x N-D func @test_matmul3(%arg0 : tensor<2x3x10x5xf32>, %arg1 : tensor<2x3x5x10xf32>) -> tensor<*xf32> { %0 ="onnx.MatMul"(%arg0, %arg1) : (tensor<2x3x10x5xf32>, tensor<2x3x5x10xf32>) -> tensor<*xf32> @@ -1031,6 +1115,8 @@ func @test_matmul3(%arg0 : tensor<2x3x10x5xf32>, %arg1 : tensor<2x3x5x10xf32>) - // CHECK: return [[RES]] : memref<2x3x10x10xf32> } +// ----- + // 1-D x 2-D func @test_matmul4(%arg0 : tensor<5xf32>, %arg1 : tensor<5x10xf32>) -> tensor<*xf32> { %0 ="onnx.MatMul"(%arg0, %arg1) : (tensor<5xf32>, tensor<5x10xf32>) -> tensor<*xf32> @@ -1061,6 +1147,8 @@ func @test_matmul4(%arg0 : tensor<5xf32>, %arg1 : tensor<5x10xf32>) -> tensor<*x // CHECK: return [[RES]] : memref<10xf32> } +// ----- + // 1-D x N-D func @test_matmul5(%arg0 : tensor<5xf32>, %arg1 : tensor) -> tensor<*xf32> { %0 ="onnx.MatMul"(%arg0, %arg1) : (tensor<5xf32>, tensor) -> tensor<*xf32> @@ -1095,6 +1183,8 @@ func @test_matmul5(%arg0 : tensor<5xf32>, %arg1 : tensor) -> tensor< // CHECK: return [[RES]] : memref } +// ----- + // N-D x 1-D func @test_matmul6(%arg0 : tensor, %arg1 : tensor<5xf32>) -> tensor<*xf32> { %0 ="onnx.MatMul"(%arg0, %arg1) : (tensor, tensor<5xf32>) -> tensor<*xf32> @@ -1129,6 +1219,8 @@ func @test_matmul6(%arg0 : tensor, %arg1 : tensor<5xf32>) -> tensor< // CHECK: return [[RES]] : memref } +// ----- + // 1-D x 1-D func @test_matmul7(%arg0 : tensor<5xf32>, %arg1 : tensor<5xf32>) -> tensor<*xf32> { %0 ="onnx.MatMul"(%arg0, %arg1) : (tensor<5xf32>, tensor<5xf32>) -> tensor<*xf32> @@ -1154,6 +1246,8 @@ func @test_matmul7(%arg0 : tensor<5xf32>, %arg1 : tensor<5xf32>) -> tensor<*xf32 // CHECK: return [[RES]] : memref<1xf32> } +// ----- + func @test_conv_no_bias_no_pad(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7xf32>) -> tensor<*xf32> { %cst = constant unit %0 = "onnx.Conv"(%arg0, %arg1, %cst) {auto_pad = "NOTSET", group = 1 : i64} : (tensor<1x2x32x64xf32>, tensor<5x2x6x7xf32>, none) -> tensor<*xf32> @@ -1198,6 +1292,8 @@ func @test_conv_no_bias_no_pad(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2 // CHECK: return [[RES]] : memref<1x5x27x58xf32> } +// ----- + func @test_conv_bias_no_pad(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7xf32>, %arg2 : tensor<5xf32>) -> tensor<*xf32> { %0 = "onnx.Conv"(%arg0, %arg1, %arg2) {auto_pad = "NOTSET", group = 1 : i64} : (tensor<1x2x32x64xf32>, tensor<5x2x6x7xf32>, tensor<5xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -1244,6 +1340,8 @@ func @test_conv_bias_no_pad(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x // CHECK: return [[RES]] : memref<1x5x27x58xf32> } +// ----- + func @test_conv_no_bias_no_pad_w_group(%arg0 : tensor<1x9x32x64xf32>, %arg1 : tensor<5x3x6x7xf32>) -> tensor<*xf32> { %cst = constant unit %0 = "onnx.Conv"(%arg0, %arg1, %cst) {auto_pad = "NOTSET", group = 3 : i64} : (tensor<1x9x32x64xf32>, tensor<5x3x6x7xf32>, none) -> tensor<*xf32> @@ -1292,6 +1390,8 @@ func @test_conv_no_bias_no_pad_w_group(%arg0 : tensor<1x9x32x64xf32>, %arg1 : te // CHECK: return [[RES]] : memref<1x5x27x58xf32> } +// ----- + func @test_conv_no_bias_no_pad_w_strides(%arg0 : tensor<1x9x32x64xf32>, %arg1 : tensor<5x9x6x7xf32>) -> tensor<*xf32> { %cst = constant unit %0 = "onnx.Conv"(%arg0, %arg1, %cst) {auto_pad = "NOTSET", group = 1 : i64, strides = [2, 2]} : (tensor<1x9x32x64xf32>, tensor<5x9x6x7xf32>, none) -> tensor<*xf32> @@ -1340,6 +1440,8 @@ func @test_conv_no_bias_no_pad_w_strides(%arg0 : tensor<1x9x32x64xf32>, %arg1 : // CHECK: return [[RES]] : memref<1x5x14x29xf32> } +// ----- + func @test_batchnorm_testmode_Nd(%arg0: tensor<1x2x1x3xf32>, %arg1: tensor<2xf32>, %arg2: tensor<2xf32>, %arg3: tensor<2xf32>, %arg4: tensor<2xf32>) -> tensor<1x2x1x3xf32> { %0 = "onnx.BatchNormalizationTestMode"(%arg0, %arg1, %arg2, %arg3, %arg4) : (tensor<1x2x1x3xf32>, tensor<2xf32>, tensor<2xf32>, tensor<2xf32>, tensor<2xf32>) -> tensor<1x2x1x3xf32> return %0 : tensor<1x2x1x3xf32> @@ -1370,6 +1472,8 @@ func @test_batchnorm_testmode_Nd(%arg0: tensor<1x2x1x3xf32>, %arg1: tensor<2xf32 // CHECK: return [[RES]] : memref<1x2x1x3xf32> } +// ----- + func @test_batchnorm_testmode_1d(%arg0: tensor<10xf32>, %arg1: tensor<1xf32>, %arg2: tensor<1xf32>, %arg3: tensor<1xf32>, %arg4: tensor<1xf32>) -> tensor<10xf32> { %0 = "onnx.BatchNormalizationTestMode"(%arg0, %arg1, %arg2, %arg3, %arg4) : (tensor<10xf32>, tensor<1xf32>, tensor<1xf32>, tensor<1xf32>, tensor<1xf32>) -> tensor<10xf32> return %0 : tensor<10xf32> @@ -1399,6 +1503,8 @@ func @test_batchnorm_testmode_1d(%arg0: tensor<10xf32>, %arg1: tensor<1xf32>, %a // CHECK: return [[RES]] : memref<10xf32> } +// ----- + func @test_maxpooling_singleout_no_pad(%arg0 : tensor<1x3x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", kernel_shape = [2, 2]} : (tensor<1x3x32x32xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -1429,6 +1535,8 @@ func @test_maxpooling_singleout_no_pad(%arg0 : tensor<1x3x32x32xf32>) -> tensor< // CHECK: return [[RES]] : memref<1x3x31x31xf32> } +// ----- + func @test_maxpooling_singleout_no_pad_w_strides(%arg0 : tensor<1x3x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", kernel_shape = [2, 2], strides = [2, 2]} : (tensor<1x3x32x32xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -1463,6 +1571,8 @@ func @test_maxpooling_singleout_no_pad_w_strides(%arg0 : tensor<1x3x32x32xf32>) // CHECK: return [[RES]] : memref<1x3x16x16xf32> } +// ----- + func @test_maxpooling_singleout_no_pad_w_strides_w_ceil_mode(%arg0 : tensor<1x3x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", kernel_shape = [3, 3], strides = [2, 2], ceil_mode = 1} : (tensor<1x3x32x32xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -1505,6 +1615,8 @@ func @test_maxpooling_singleout_no_pad_w_strides_w_ceil_mode(%arg0 : tensor<1x3x // CHECK: return [[RES]] : memref<1x3x16x16xf32> } +// ----- + func @test_maxpooling_singleout_no_pad_w_strides_w_dilation(%arg0 : tensor<1x3x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", kernel_shape = [3, 3], strides = [2, 2], dilations = [2, 2]} : (tensor<1x3x32x32xf32>) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -1551,6 +1663,8 @@ func @test_maxpooling_singleout_no_pad_w_strides_w_dilation(%arg0 : tensor<1x3x3 // CHECK: return [[RES]] : memref<1x3x14x14xf32> } +// ----- + func @test_maxpooling_singleout_no_pad_w_strides_w_ceil_mode_w_unknown_dims(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", kernel_shape = [3, 3], strides = [2, 2], ceil_mode = 1} : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -1614,6 +1728,8 @@ func @test_maxpooling_singleout_no_pad_w_strides_w_ceil_mode_w_unknown_dims(%arg // CHECK: return [[RES]] : memref } +// ----- + func @test_abs_float(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Abs"(%arg0) : (tensor) -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -1633,6 +1749,8 @@ func @test_abs_float(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_abs_int(%arg0 : tensor) -> tensor<*xi32> { %0 = "onnx.Abs"(%arg0) : (tensor) -> tensor<*xi32> "std.return"(%0) : (tensor<*xi32>) -> () @@ -1655,6 +1773,8 @@ func @test_abs_int(%arg0 : tensor) -> tensor<*xi32> { // CHECK: return [[RES]] : memref } +// ----- + func @test_constant_pad1(%arg0: tensor<16x16xf32>) -> tensor<18x20xf32> { %0 = "onnx.PadConstantValuePad"(%arg0) {constant_value = 0.000000e+00 : f32, mode = "constant", pads = [0, 3, 2, 1]} : (tensor<16x16xf32>) -> tensor<18x20xf32> return %0 : tensor<18x20xf32> @@ -1680,6 +1800,8 @@ func @test_constant_pad1(%arg0: tensor<16x16xf32>) -> tensor<18x20xf32> { // CHECK: } } +// ----- + func @test_constant_dense_2d_value(%arg0: tensor<1xf32>) -> tensor<*xf32> { %0 = "onnx.Constant"() {value = dense<[[0.0, 0.0], [1.0, 1.1], [2.0, 2.1]]> : tensor<3x2xf32>} : () -> tensor<*xf32> "std.return"(%0) : (tensor<*xf32>) -> () @@ -1689,6 +1811,8 @@ func @test_constant_dense_2d_value(%arg0: tensor<1xf32>) -> tensor<*xf32> { } +// ----- + func @test_concat_1(%arg0 : tensor<5x5x1x32xf32>, %arg1 : tensor<5x5x3x32xf32>, %arg2 : tensor<5x5x5x32xf32>) -> tensor<5x5x9x32xf32> { %1 = "onnx.Concat"(%arg0, %arg1, %arg2) { axis = 2 } : (tensor<5x5x1x32xf32>, tensor<5x5x3x32xf32>, tensor<5x5x5x32xf32>) -> tensor<5x5x9x32xf32> "std.return"(%1) : (tensor<5x5x9x32xf32>) -> () diff --git a/test/mlir/onnx/onnx_lowering_with_dealloc.mlir b/test/mlir/onnx/onnx_lowering_with_dealloc.mlir index b81430d..831cac9 100644 --- a/test/mlir/onnx/onnx_lowering_with_dealloc.mlir +++ b/test/mlir/onnx/onnx_lowering_with_dealloc.mlir @@ -1,5 +1,7 @@ // RUN: onnx-mlir-opt --shape-inference --lower-frontend %s -split-input-file | FileCheck %s +// ----- + func @test_add_add(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Add"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> %1 = "onnx.Add"(%0, %arg1) : (tensor<*xf32>, tensor<10x10xf32>) -> tensor<*xf32> @@ -37,6 +39,7 @@ func @test_add_add(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tens // CHECK: return [[RET_RES]] : memref<10x10xf32> } +// ----- func @test_mul_mul(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Mul"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> @@ -75,6 +78,8 @@ func @test_mul_mul(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tens // CHECK: return [[RET_RES]] : memref<10x10xf32> } +// ----- + func @test_div_div(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Div"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> %1 = "onnx.Div"(%0, %arg1) : (tensor<*xf32>, tensor<10x10xf32>) -> tensor<*xf32> @@ -112,6 +117,8 @@ func @test_div_div(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tens // CHECK: return [[RET_RES]] : memref<10x10xf32> } +// ----- + func @test_sub_sub(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Sub"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> %1 = "onnx.Sub"(%0, %arg1) : (tensor<*xf32>, tensor<10x10xf32>) -> tensor<*xf32> @@ -149,6 +156,8 @@ func @test_sub_sub(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tens // CHECK: return [[RET_RES]] : memref<10x10xf32> } +// ----- + func @test_and_and(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*xi32> { %0 = "onnx.And"(%arg0, %arg1) : (tensor<10x10xi32>, tensor<10x10xi32>) -> tensor<*xi32> %1 = "onnx.And"(%0, %arg1) : (tensor<*xi32>, tensor<10x10xi32>) -> tensor<*xi32> @@ -186,6 +195,8 @@ func @test_and_and(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tens // CHECK: return [[RET_RES]] : memref<10x10xi32> } +// ----- + func @test_or_or(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*xi32> { %0 = "onnx.Or"(%arg0, %arg1) : (tensor<10x10xi32>, tensor<10x10xi32>) -> tensor<*xi32> %1 = "onnx.Or"(%0, %arg1) : (tensor<*xi32>, tensor<10x10xi32>) -> tensor<*xi32> @@ -223,6 +234,8 @@ func @test_or_or(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor // CHECK: return [[RET_RES]] : memref<10x10xi32> } +// ----- + func @test_xor_xor(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tensor<*xi32> { %0 = "onnx.Xor"(%arg0, %arg1) : (tensor<10x10xi32>, tensor<10x10xi32>) -> tensor<*xi32> %1 = "onnx.Xor"(%0, %arg1) : (tensor<*xi32>, tensor<10x10xi32>) -> tensor<*xi32> @@ -260,6 +273,8 @@ func @test_xor_xor(%arg0 : tensor<10x10xi32>, %arg1 : tensor<10x10xi32>) -> tens // CHECK: return [[RET_RES]] : memref<10x10xi32> } +// ----- + func @test_exp_exp(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Exp"(%arg0) : (tensor) -> tensor<*xf32> %1 = "onnx.Exp"(%0) : (tensor<*xf32>) -> tensor<*xf32> @@ -299,6 +314,8 @@ func @test_exp_exp(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_tanh_tanh(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Tanh"(%arg0) : (tensor) -> tensor<*xf32> %1 = "onnx.Tanh"(%0) : (tensor<*xf32>) -> tensor<*xf32> @@ -350,6 +367,8 @@ func @test_tanh_tanh(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_sinh_sinh(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Sinh"(%arg0) : (tensor) -> tensor<*xf32> %1 = "onnx.Sinh"(%0) : (tensor<*xf32>) -> tensor<*xf32> @@ -401,6 +420,8 @@ func @test_sinh_sinh(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_cosh_cosh(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Cosh"(%arg0) : (tensor) -> tensor<*xf32> %1 = "onnx.Cosh"(%0) : (tensor<*xf32>) -> tensor<*xf32> @@ -452,6 +473,8 @@ func @test_cosh_cosh(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_sigmoid_sigmoid(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Sigmoid"(%arg0) : (tensor) -> tensor<*xf32> %1 = "onnx.Sigmoid"(%0) : (tensor<*xf32>) -> tensor<*xf32> @@ -501,6 +524,8 @@ func @test_sigmoid_sigmoid(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_relu_relu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Relu"(%arg0) : (tensor) -> tensor<*xf32> %1 = "onnx.Relu"(%0) : (tensor<*xf32>) -> tensor<*xf32> @@ -544,6 +569,8 @@ func @test_relu_relu(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_sum_sum(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Sum"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> %1 = "onnx.Sum"(%0, %arg1) : (tensor<*xf32>, tensor<10x10xf32>) -> tensor<*xf32> @@ -581,6 +608,8 @@ func @test_sum_sum(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tens // CHECK: return [[RET_RES]] : memref<10x10xf32> } +// ----- + func @test_max_max(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Max"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> %1 = "onnx.Max"(%0, %arg1) : (tensor<*xf32>, tensor<10x10xf32>) -> tensor<*xf32> @@ -620,6 +649,8 @@ func @test_max_max(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tens // CHECK: return [[RET_RES]] : memref<10x10xf32> } +// ----- + func @test_min_min(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tensor<*xf32> { %0 = "onnx.Min"(%arg0, %arg1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<*xf32> %1 = "onnx.Min"(%0, %arg1) : (tensor<*xf32>, tensor<10x10xf32>) -> tensor<*xf32> @@ -659,6 +690,8 @@ func @test_min_min(%arg0 : tensor<10x10xf32>, %arg1 : tensor<10x10xf32>) -> tens // CHECK: return [[RET_RES]] : memref<10x10xf32> } +// ----- + func @test_elu_elu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Elu"(%arg0) {alpha=2.0:f32} : (tensor) -> tensor<*xf32> %1 = "onnx.Elu"(%0) {alpha=2.0:f32} : (tensor<*xf32>) -> tensor<*xf32> @@ -712,6 +745,8 @@ func @test_elu_elu(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_leakyrelu_leakyrelu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.LeakyRelu"(%arg0) {alpha=1.0:f32} : (tensor) -> tensor<*xf32> %1 = "onnx.LeakyRelu"(%0) {alpha=1.0:f32} : (tensor<*xf32>) -> tensor<*xf32> @@ -759,6 +794,8 @@ func @test_leakyrelu_leakyrelu(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_selu_selu(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Selu"(%arg0) {alpha=1.0:f32, gamma=2.0:f32} : (tensor) -> tensor<*xf32> %1 = "onnx.Selu"(%0) {alpha=1.0:f32, gamma=2.0:f32} : (tensor<*xf32>) -> tensor<*xf32> @@ -814,6 +851,8 @@ func @test_selu_selu(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_hardsigmoid_hardsigmoid(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.HardSigmoid"(%arg0) {alpha=1.0:f32, beta=2.0:f32} : (tensor) -> tensor<*xf32> %1 = "onnx.HardSigmoid"(%0) {alpha=1.0:f32, beta=2.0:f32} : (tensor<*xf32>) -> tensor<*xf32> @@ -871,6 +910,8 @@ func @test_hardsigmoid_hardsigmoid(%arg0 : tensor) -> tensor<*xf32> { // CHECK: return [[RET_RES]] : memref } +// ----- + func @test_reciprocal_reciprocal(%arg0 : tensor) -> tensor<*xf32> { %0 = "onnx.Reciprocal"(%arg0) : (tensor) -> tensor<*xf32> %1 = "onnx.Reciprocal"(%0) : (tensor<*xf32>) -> tensor<*xf32> diff --git a/test/mlir/onnx/onnx_shape_inference.mlir b/test/mlir/onnx/onnx_shape_inference.mlir index 5485105..33a716f 100644 --- a/test/mlir/onnx/onnx_shape_inference.mlir +++ b/test/mlir/onnx/onnx_shape_inference.mlir @@ -1,5 +1,7 @@ // RUN: onnx-mlir-opt --shape-inference %s -split-input-file | FileCheck %s +// ----- + //===----------------------------------------------------------------------===// /// Test the default behavior of transpose when no information for the /// permutation of the axes is provided and when a permutation is provided. @@ -14,6 +16,8 @@ func @test_default_transpose(%arg0 : tensor<5x5x1x32xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<32x1x5x5xf32> } +// ----- + /// Test shape inference for transposition when perm attribute is specified. func @test_transpose(%arg0 : tensor<5x5x1x32xf32>) -> tensor<*xf32> { @@ -25,6 +29,8 @@ func @test_transpose(%arg0 : tensor<5x5x1x32xf32>) -> tensor<*xf32> { // CHECK: return [[RES_ATTR]] : tensor<1x5x32x5xf32> } +// ----- + //===----------------------------------------------------------------------===// /// Test the shape inferencing scheme for the matmul operation. //===----------------------------------------------------------------------===// @@ -40,6 +46,8 @@ func @test_matmul_1(%arg0 : tensor<32xf32>, %arg1 : tensor<32xf32>) -> tensor<*x // CHECK: return [[RES1]] : tensor<1xf32> } +// ----- + /// MatMul: K-D x 2-D (K > 2) func @test_matmul_2(%arg0 : tensor<16x?x64x42xf32>, %arg1 : tensor<42x32xf32>) -> tensor<*xf32> { @@ -51,6 +59,8 @@ func @test_matmul_2(%arg0 : tensor<16x?x64x42xf32>, %arg1 : tensor<42x32xf32>) - // CHECK: return [[RES2]] : tensor<16x?x64x32xf32> } +// ----- + /// MatMul: 2-D x K-D (K > 2) func @test_matmul_3(%arg0 : tensor<64x42xf32>, %arg1 : tensor<16x?x42x32xf32>) -> tensor<*xf32> { @@ -62,6 +72,8 @@ func @test_matmul_3(%arg0 : tensor<64x42xf32>, %arg1 : tensor<16x?x42x32xf32>) - // CHECK: return [[RES3]] : tensor<16x?x64x32xf32> } +// ----- + /// MatMul: 2-D x K-D (K > 2) func @test_matmul_4(%arg0 : tensor<64x42xf32>, %arg1 : tensor) -> tensor<*xf32> { @@ -73,6 +85,8 @@ func @test_matmul_4(%arg0 : tensor<64x42xf32>, %arg1 : tensor) -> t // CHECK: return [[RES4]] : tensor } +// ----- + /// MatMul: K1-D x K2-D (K1 > 2, K2 > 2) func @test_matmul_5(%arg0 : tensor<16x?x?x42xf32>, %arg1 : tensor<32x?x64x42x32xf32>) -> tensor<*xf32> { @@ -84,6 +98,8 @@ func @test_matmul_5(%arg0 : tensor<16x?x?x42xf32>, %arg1 : tensor<32x?x64x42x32x // CHECK: return [[RES5]] : tensor<32x16x64x?x32xf32> } +// ----- + /// MatMul: 1-D x 2-D func @test_matmul_6(%arg0 : tensor<32xf32>, %arg1 : tensor<32x64xf32>) -> tensor<*xf32> { @@ -95,6 +111,8 @@ func @test_matmul_6(%arg0 : tensor<32xf32>, %arg1 : tensor<32x64xf32>) -> tensor // CHECK: return [[RES6]] : tensor<64xf32> } +// ----- + /// MatMul: 2-D x 1-D func @test_matmul_7(%arg0 : tensor<32x64xf32>, %arg1 : tensor<64xf32>) -> tensor<*xf32> { @@ -106,6 +124,8 @@ func @test_matmul_7(%arg0 : tensor<32x64xf32>, %arg1 : tensor<64xf32>) -> tensor // CHECK: return [[RES7]] : tensor<32xf32> } +// ----- + /// MatMul: 2-D x 2-D func @test_matmul_8(%arg0 : tensor<32x64xf32>, %arg1 : tensor<64x128xf32>) -> tensor<*xf32> { @@ -117,6 +137,8 @@ func @test_matmul_8(%arg0 : tensor<32x64xf32>, %arg1 : tensor<64x128xf32>) -> te // CHECK: return [[RES8]] : tensor<32x128xf32> } +// ----- + /// MatMul: 1-D x N-D func @test_matmul_9(%arg0 : tensor<42xf32>, %arg1 : tensor) -> tensor<*xf32> { @@ -128,6 +150,8 @@ func @test_matmul_9(%arg0 : tensor<42xf32>, %arg1 : tensor) -> tens // CHECK: return [[RES1]] : tensor } +// ----- + /// MatMul: N-D x 1-D func @test_matmul_10(%arg0 : tensor, %arg1 : tensor<32xf32>) -> tensor<*xf32> { @@ -139,6 +163,8 @@ func @test_matmul_10(%arg0 : tensor, %arg1 : tensor<32xf32>) -> ten // CHECK: return [[RES1]] : tensor } +// ----- + //===----------------------------------------------------------------------===// /// Test shape inference for Conv (first with no bias) operation and all its attributes. //===----------------------------------------------------------------------===// @@ -155,6 +181,8 @@ func @test_conv_no_bias_0(%arg0 : tensor<1x2x32xf32>, %arg1 : tensor<5x2x6xf32>) // CHECK: return [[RES_ATTR]] : tensor<1x5x27xf32> } +// ----- + /// Default and required attributes. func @test_conv_no_bias_1(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7xf32>) -> tensor<*xf32> { @@ -167,6 +195,8 @@ func @test_conv_no_bias_1(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7x // CHECK: return [[RES_ATTR]] : tensor<1x5x27x58xf32> } +// ----- + /// kernel_shape attribute. func @test_conv_no_bias_2(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7xf32>) -> tensor<*xf32> { @@ -179,6 +209,8 @@ func @test_conv_no_bias_2(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7x // CHECK: return [[RES_ATTR]] : tensor<1x5x25x56xf32> } +// ----- + /// pads attribute. /// Use pads to make output size equal to input size by adding K - 1 to the result. @@ -192,6 +224,8 @@ func @test_conv_no_bias_3(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x10 // CHECK: return [[RES_ATTR]] : tensor<1x5x32x64xf32> } +// ----- + /// auto_pad set to SAME_UPPER and SAME_LOWER. func @test_conv_no_bias_4(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x10xf32>) -> tensor<*xf32> { @@ -204,6 +238,8 @@ func @test_conv_no_bias_4(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x10 // CHECK: return [[RES_ATTR]] : tensor<1x5x32x64xf32> } +// ----- + func @test_conv_no_bias_5(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x10xf32>) -> tensor<*xf32> { %cst = constant unit %0 = "onnx.Conv"(%arg0, %arg1, %cst) {auto_pad = "SAME_LOWER", group = 1 : i64} : (tensor<1x2x32x64xf32>, tensor<5x2x6x10xf32>, none) -> tensor<*xf32> @@ -214,6 +250,8 @@ func @test_conv_no_bias_5(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x10 // CHECK: return [[RES_ATTR]] : tensor<1x5x32x64xf32> } +// ----- + /// auto_pad set to VALID. func @test_conv_no_bias_6(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x10xf32>) -> tensor<*xf32> { @@ -226,6 +264,8 @@ func @test_conv_no_bias_6(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x10 // CHECK: return [[RES_ATTR]] : tensor<1x5x27x55xf32> } +// ----- + /// With strides attribute. func @test_conv_no_bias_7(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7xf32>) -> tensor<*xf32> { @@ -238,6 +278,8 @@ func @test_conv_no_bias_7(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7x // CHECK: return [[RES_ATTR]] : tensor<1x5x14x20xf32> } +// ----- + /// auto_pad set to SAME_UPPER with strides attribute. /// The auto_pad will pas as if stride is equal to 1. @@ -251,6 +293,8 @@ func @test_conv_no_bias_8(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7x // CHECK: return [[RES_ATTR]] : tensor<1x5x16x22xf32> } +// ----- + /// dilations attribute. func @test_conv_no_bias_9(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7xf32>) -> tensor<*xf32> { @@ -263,6 +307,8 @@ func @test_conv_no_bias_9(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7x // CHECK: return [[RES_ATTR]] : tensor<1x5x22x46xf32> } +// ----- + /// dilations attribute with stride. func @test_conv_no_bias_10(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7xf32>) -> tensor<*xf32> { @@ -275,6 +321,8 @@ func @test_conv_no_bias_10(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7 // CHECK: return [[RES_ATTR]] : tensor<1x5x11x23xf32> } +// ----- + /// dilations attribute with auto_pad set to SAME_UPPER. func @test_conv_no_bias_11(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7xf32>) -> tensor<*xf32> { @@ -287,6 +335,8 @@ func @test_conv_no_bias_11(%arg0 : tensor<1x2x32x64xf32>, %arg1 : tensor<5x2x6x7 // CHECK: return [[RES_ATTR]] : tensor<1x5x32x64xf32> } +// ----- + // Test convolution with bias input. func @test_conv_12(%arg0 : tensor<1x2x32xf32>, %arg1 : tensor<5x2x6xf32>, %arg2 : tensor<5xf32>) -> tensor<*xf32> { @@ -298,6 +348,8 @@ func @test_conv_12(%arg0 : tensor<1x2x32xf32>, %arg1 : tensor<5x2x6xf32>, %arg2 // CHECK: return [[RES_ATTR]] : tensor<1x5x27xf32> } +// ----- + //===----------------------------------------------------------------------===// /// Test shape inference for PadConstantValuePad. //===----------------------------------------------------------------------===// @@ -312,6 +364,8 @@ func @test_PadConstantValuePad_1(%arg0 : tensor<16x13xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<18x13xf32> } +// ----- + /// Test PadConstantPad_1 func @test_PadConstantPad_1(%arg0 : tensor<16x13xf32>, %arg1 : tensor<*xf32>) -> tensor<*xf32> { %0 = "onnx.PadConstantPad"(%arg0, %arg1) {mode = "constant", pads = [0, 3, 2, 1]} : (tensor<16x13xf32>, tensor<*xf32>) -> tensor<*xf32> @@ -321,6 +375,8 @@ func @test_PadConstantPad_1(%arg0 : tensor<16x13xf32>, %arg1 : tensor<*xf32>) -> // CHECK: return [[RES]] : tensor<18x17xf32> } +// ----- + /// Test PadConstantPad_2 func @test_PadConstantPad_2(%arg0 : tensor<16x?xf32>, %arg1 : tensor<*xf32>) -> tensor<*xf32> { %0 = "onnx.PadConstantPad"(%arg0, %arg1) {mode = "constant", pads = [0, 3, 2, 1]} : (tensor<16x?xf32>, tensor<*xf32>) -> tensor<*xf32> @@ -331,6 +387,8 @@ func @test_PadConstantPad_2(%arg0 : tensor<16x?xf32>, %arg1 : tensor<*xf32>) -> // CHECK: return [[RES]] : tensor<18x?xf32> } +// ----- + //===----------------------------------------------------------------------===// /// Test for constant op. //===----------------------------------------------------------------------===// @@ -345,6 +403,8 @@ func @test_constant_dense_1d_value() -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<3xf32> } +// ----- + /// Test ConstantOp shape inference for 2-D dense tensor. func @test_constant_dense_2d_value() -> tensor<*xf32> { %0 = "onnx.Constant"() {value = dense<[[0.0, 0.0], [1.0, 1.1], [2.0, 2.1]]> : tensor<3x2xf32>} : () -> tensor<*xf32> @@ -355,6 +415,8 @@ func @test_constant_dense_2d_value() -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<3x2xf32> } +// ----- + /// Test ConstantOp shape inference for 1-D sparse tensor. func @test_constant_sparse_1d_value() -> tensor<*xf32> { %0 = "onnx.Constant"() {sparse_value = sparse<[[0]], [1.0]> : tensor<3xf32>} : () -> tensor<*xf32> @@ -365,6 +427,8 @@ func @test_constant_sparse_1d_value() -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<3xf32> } +// ----- + /// Test ConstantOp shape inference for 2-D sparse tensor. func @test_constant_sparse_2d_value() -> tensor<*xf32> { %0 = "onnx.Constant"() {sparse_value = sparse<[[0, 1]], [2.0]> : tensor<3x2xf32>} : () -> tensor<*xf32> @@ -375,6 +439,8 @@ func @test_constant_sparse_2d_value() -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<3x2xf32> } +// ----- + /// Test the default behavior of Average Pool with no padding (pad are set but shoud be ignored) func @test_default_averagepool(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.AveragePool"(%arg0) {auto_pad = "VALID", ceil_mode = 0, kernel_shape = [3,3], pads = [1, 1, 1, 1] } : (tensor<5x5x32x32xf32>) -> tensor<*xf32> @@ -385,6 +451,8 @@ func @test_default_averagepool(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<5x5x30x30xf32> } +// ----- + /// Test the default behavior of Average Pool with no padding (pad are not set, default to zero) func @test_default_averagepool_defpad(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.AveragePool"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [3,3]} : (tensor<5x5x32x32xf32>) -> tensor<*xf32> @@ -395,6 +463,8 @@ func @test_default_averagepool_defpad(%arg0 : tensor<5x5x32x32xf32>) -> tensor<* // CHECK: return [[RES]] : tensor<5x5x30x30xf32> } +// ----- + /// Test the default behavior of Average Pool with uniform padding func @test_default_averagepool_pad(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.AveragePool"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [3,3], pads = [1, 1, 1, 1] } : (tensor<5x5x32x32xf32>) -> tensor<*xf32> @@ -405,6 +475,8 @@ func @test_default_averagepool_pad(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf3 // CHECK: return [[RES]] : tensor<5x5x32x32xf32> } +// ----- + /// Test the default behavior of Average Pool with non uniform padding func @test_default_averagepool_pad_nonunif(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.AveragePool"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [5,3], pads = [2, 1, 1, 0] } : (tensor<5x5x32x32xf32>) -> tensor<*xf32> @@ -415,6 +487,8 @@ func @test_default_averagepool_pad_nonunif(%arg0 : tensor<5x5x32x32xf32>) -> ten // CHECK: return [[RES]] : tensor<5x5x31x31xf32> } +// ----- + /// Test the default behavior of Average Pool with non uniform padding func @test_default_averagepool_strides(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.AveragePool"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [3,3], pads = [1, 1, 1, 1], strides = [2, 2] } : (tensor<5x5x32x32xf32>) -> tensor<*xf32> @@ -425,6 +499,8 @@ func @test_default_averagepool_strides(%arg0 : tensor<5x5x32x32xf32>) -> tensor< // CHECK: return [[RES]] : tensor<5x5x16x16xf32> } +// ----- + /// Test the default behavior of Average Pool with non uniform padding func @test_default_averagepool_strides_nonunifpad(%arg0 : tensor<5x5x30x32xf32>) -> tensor<*xf32> { %0 = "onnx.AveragePool"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [2,2], pads = [1, 0, 0, 0], strides = [2, 2] } : (tensor<5x5x30x32xf32>) -> tensor<*xf32> @@ -435,6 +511,8 @@ func @test_default_averagepool_strides_nonunifpad(%arg0 : tensor<5x5x30x32xf32>) // CHECK: return [[RES]] : tensor<5x5x15x16xf32> } +// ----- + /// Test the default behavior of Average Pool with non uniform padding func @test_default_averagepool_strides_nonunifpad_ceil(%arg0 : tensor<5x5x30x32xf32>) -> tensor<*xf32> { %0 = "onnx.AveragePool"(%arg0) {auto_pad = "NOTSET", ceil_mode = 1, kernel_shape = [2,2], pads = [1, 0, 0, 0], strides = [2, 2] } : (tensor<5x5x30x32xf32>) -> tensor<*xf32> @@ -445,6 +523,8 @@ func @test_default_averagepool_strides_nonunifpad_ceil(%arg0 : tensor<5x5x30x32x // CHECK: return [[RES]] : tensor<5x5x16x16xf32> } +// ----- + //===----------------------------------------------------------------------===// /// Test the reshape op inference when constants are present. //===----------------------------------------------------------------------===// @@ -458,6 +538,8 @@ func @test_reshape_dynamic(%arg0 : tensor<5x5x1x32xf32>, %arg1 : tensor<4xi32>) // CHECK: return [[RES]] : tensor } +// ----- + func @test_reshape_1(%arg0 : tensor<5x5x1x32xf32>) -> tensor<*xf32> { %0 = "onnx.Constant"() {value = dense<[5, 5, 16, 2]> : tensor<4xi32> } : () -> tensor<4xi32> %1 = "onnx.Reshape"(%arg0, %0) : (tensor<5x5x1x32xf32>, tensor<4xi32>) -> tensor<*xf32> @@ -468,6 +550,8 @@ func @test_reshape_1(%arg0 : tensor<5x5x1x32xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<5x5x16x2xf32> } +// ----- + func @test_reshape_2(%arg0 : tensor<5x5x1x32xf32>) -> tensor<*xf32> { %0 = "onnx.Constant"() {value = dense<[-1, 16, 2]> : tensor<3xi32> } : () -> tensor<3xi32> %1 = "onnx.Reshape"(%arg0, %0) : (tensor<5x5x1x32xf32>, tensor<3xi32>) -> tensor<*xf32> @@ -478,6 +562,8 @@ func @test_reshape_2(%arg0 : tensor<5x5x1x32xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<25x16x2xf32> } +// ----- + func @test_reshape_3(%arg0 : tensor<5x5x1x32xf32>) -> tensor<*xf32> { %0 = "onnx.Constant"() {value = dense<[-1, 0, 2]> : tensor<3xi32> } : () -> tensor<3xi32> %1 = "onnx.Reshape"(%arg0, %0) : (tensor<5x5x1x32xf32>, tensor<3xi32>) -> tensor<*xf32> @@ -488,6 +574,8 @@ func @test_reshape_3(%arg0 : tensor<5x5x1x32xf32>) -> tensor<*xf32> { // CHECK: return [[RES]] : tensor<80x5x2xf32> } +// ----- + //===----------------------------------------------------------------------===// /// Test the reshape op inference when concat are present. //===----------------------------------------------------------------------===// @@ -501,6 +589,8 @@ func @test_concat_1(%arg0 : tensor<5x5x1x32xf32>, %arg1 : tensor<5x5x3x32xf32>, // CHECK: return [[RES]] : tensor<5x5x9x32xf32> } +// ----- + func @test_concat_2(%arg0 : tensor<5x1x32xf32>, %arg1 : tensor<5x3x32xf32>, %arg2 : tensor<5x5x32xf32>) -> tensor<*xf32> { %1 = "onnx.Concat"(%arg0, %arg1, %arg2) { axis = 1 } : (tensor<5x1x32xf32>, tensor<5x3x32xf32>, tensor<5x5x32xf32>) -> tensor<*xf32> "std.return"(%1) : (tensor<*xf32>) -> () @@ -510,6 +600,8 @@ func @test_concat_2(%arg0 : tensor<5x1x32xf32>, %arg1 : tensor<5x3x32xf32>, %arg // CHECK: return [[RES]] : tensor<5x9x32xf32> } +// ----- + func @test_concat_3(%arg0 : tensor<5x1x32xf32>, %arg1 : tensor<5x3x32xf32>, %arg2 : tensor<5x5x32xf32>) -> tensor<*xf32> { %1 = "onnx.Concat"(%arg0, %arg1, %arg2) { axis = -2 } : (tensor<5x1x32xf32>, tensor<5x3x32xf32>, tensor<5x5x32xf32>) -> tensor<*xf32> "std.return"(%1) : (tensor<*xf32>) -> () diff --git a/test/mlir/onnx/onnx_shape_inference_maxpool.mlir b/test/mlir/onnx/onnx_shape_inference_maxpool.mlir index 1fd6328..faa93c5 100644 --- a/test/mlir/onnx/onnx_shape_inference_maxpool.mlir +++ b/test/mlir/onnx/onnx_shape_inference_maxpool.mlir @@ -1,5 +1,7 @@ // RUN: onnx-mlir-opt --shape-inference %s -split-input-file | FileCheck %s +// ----- + /// Test the default behavior of Max Pool with no padding (pad are set but shoudl be ignored) func @test_default_maxpoolsingleout(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "VALID", ceil_mode = 0, kernel_shape = [3,3], pads = [1, 1, 1, 1] } : (tensor<5x5x32x32xf32>) -> tensor<*xf32> @@ -10,6 +12,8 @@ func @test_default_maxpoolsingleout(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf // CHECK: return [[RES]] : tensor<5x5x30x30xf32> +// ----- + /// Test the default behavior of Max Pool with no padding (pad are not set, default to zero) func @test_default_maxpoolsingleout_defpad(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [3,3]} : (tensor<5x5x32x32xf32>) -> tensor<*xf32> @@ -20,6 +24,8 @@ func @test_default_maxpoolsingleout_defpad(%arg0 : tensor<5x5x32x32xf32>) -> ten // CHECK: return [[RES]] : tensor<5x5x30x30xf32> +// ----- + /// Test the default behavior of Max Pool with uniform padding func @test_default_maxpoolsingleout_pad(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [3,3], pads = [1, 1, 1, 1] } : (tensor<5x5x32x32xf32>) -> tensor<*xf32> @@ -30,6 +36,8 @@ func @test_default_maxpoolsingleout_pad(%arg0 : tensor<5x5x32x32xf32>) -> tensor // CHECK: return [[RES]] : tensor<5x5x32x32xf32> +// ----- + /// Test the default behavior of Max Pool with non uniform padding func @test_default_maxpoolsingleout_pad_nonunif(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [5,3], pads = [2, 1, 1, 0] } : (tensor<5x5x32x32xf32>) -> tensor<*xf32> @@ -39,6 +47,7 @@ func @test_default_maxpoolsingleout_pad_nonunif(%arg0 : tensor<5x5x32x32xf32>) - // CHECK: [[RES:%.+]] = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0 : i64, dilations = [1, 1], kernel_shape = [5, 3], pads = [2, 1, 1, 0], strides = [1, 1]} : (tensor<5x5x32x32xf32>) -> tensor<5x5x31x31xf32> // CHECK: return [[RES]] : tensor<5x5x31x31xf32> +// ----- /// Test the default behavior of Max Pool with non uniform padding func @test_default_maxpoolsingleout_strides(%arg0 : tensor<5x5x32x32xf32>) -> tensor<*xf32> { @@ -49,6 +58,7 @@ func @test_default_maxpoolsingleout_strides(%arg0 : tensor<5x5x32x32xf32>) -> te // CHECK: [[RES:%.+]] = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0 : i64, dilations = [1, 1], kernel_shape = [3, 3], pads = [1, 1, 1, 1], strides = [2, 2]} : (tensor<5x5x32x32xf32>) -> tensor<5x5x16x16xf32> // CHECK: return [[RES]] : tensor<5x5x16x16xf32> +// ----- /// Test the default behavior of Max Pool with non uniform padding func @test_default_maxpoolsingleout_strides_nonunifpad(%arg0 : tensor<5x5x30x32xf32>) -> tensor<*xf32> { @@ -59,6 +69,7 @@ func @test_default_maxpoolsingleout_strides_nonunifpad(%arg0 : tensor<5x5x30x32x // CHECK: [[RES:%.+]] = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0 : i64, dilations = [1, 1], kernel_shape = [2, 2], pads = [1, 0, 0, 0], strides = [2, 2]} : (tensor<5x5x30x32xf32>) -> tensor<5x5x15x16xf32> // CHECK: return [[RES]] : tensor<5x5x15x16xf32> +// ----- /// Test the default behavior of Max Pool with non uniform padding func @test_default_maxpoolsingleout_strides_nonunifpad_ceil(%arg0 : tensor<5x5x30x32xf32>) -> tensor<*xf32> { @@ -70,6 +81,8 @@ func @test_default_maxpoolsingleout_strides_nonunifpad_ceil(%arg0 : tensor<5x5x3 // CHECK: return [[RES]] : tensor<5x5x16x16xf32> +// ----- + /// Test the default behavior of Max Pool with dilatation func @test_default_maxpoolsingleout_strides_dilatation(%arg0 : tensor<5x5x8x8xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0, kernel_shape = [2,2], dilations = [2, 2], strides = [3, 3] } : (tensor<5x5x8x8xf32>) -> tensor<*xf32> @@ -79,6 +92,8 @@ func @test_default_maxpoolsingleout_strides_dilatation(%arg0 : tensor<5x5x8x8xf3 // CHECK: [[RES:%.+]] = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "NOTSET", ceil_mode = 0 : i64, dilations = [2, 2], kernel_shape = [2, 2], pads = [0, 0, 0, 0], strides = [3, 3]} : (tensor<5x5x8x8xf32>) -> tensor<5x5x2x2xf32> // CHECK: return [[RES]] : tensor<5x5x2x2xf32> +// ----- + /// Test the default behavior of Max Pool with dilatation func @test_default_maxpoolsingleout_upper(%arg0 : tensor<5x5x16x13xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "SAME_UPPER", ceil_mode = 0, kernel_shape = [4,4], strides = [4, 4] } : (tensor<5x5x16x13xf32>) -> tensor<*xf32> @@ -89,6 +104,8 @@ func @test_default_maxpoolsingleout_upper(%arg0 : tensor<5x5x16x13xf32>) -> tens // CHECK: return [[RES]] : tensor<5x5x4x4xf32> +// ----- + /// Test the default behavior of Max Pool with dilatation func @test_default_maxpoolsingleout_lower(%arg0 : tensor<5x5x16x13xf32>) -> tensor<*xf32> { %0 = "onnx.MaxPoolSingleOut"(%arg0) {auto_pad = "SAME_LOWER", ceil_mode = 0, kernel_shape = [4,4], strides = [4, 4] } : (tensor<5x5x16x13xf32>) -> tensor<*xf32>