2020-03-17 21:16:33 +08:00
|
|
|
// RUN: onnx-mlir-opt --canonicalize %s -split-input-file | FileCheck %s
|
2019-11-19 08:37:58 +08:00
|
|
|
|
2020-04-16 15:17:27 +08:00
|
|
|
// -----
|
|
|
|
|
2020-02-08 02:51:44 +08:00
|
|
|
// 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>
|
2019-11-26 10:36:38 +08:00
|
|
|
%0 = "onnx.MatMul"(%a0, %a1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
%1 = "onnx.Add"(%0, %a2) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
"std.return"(%1) : (tensor<10x10xf32>) -> ()
|
2019-11-19 10:08:21 +08:00
|
|
|
}
|
2019-11-21 10:57:13 +08:00
|
|
|
|
2020-04-16 15:17:27 +08:00
|
|
|
// -----
|
|
|
|
|
2020-02-08 02:51:44 +08:00
|
|
|
// 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> {
|
|
|
|
// CHECK-NEXT: %{{[0-9]+}} = "onnx.MatMul"(%{{.*}}, %{{.*}}) : (tensor<10x10x10xf32>, tensor<10x10x10xf32>) -> tensor<10x10x10xf32>
|
|
|
|
%0 = "onnx.MatMul"(%a0, %a1) : (tensor<10x10x10xf32>, tensor<10x10x10xf32>) -> tensor<10x10x10xf32>
|
|
|
|
%1 = "onnx.Add"(%0, %a2) : (tensor<10x10x10xf32>, tensor<10x10x10xf32>) -> tensor<10x10x10xf32>
|
|
|
|
"std.return"(%1) : (tensor<10x10x10xf32>) -> ()
|
|
|
|
}
|
|
|
|
|
2020-04-16 15:17:27 +08:00
|
|
|
// -----
|
2020-02-08 02:51:44 +08:00
|
|
|
|
|
|
|
// onnx.MatMul ops with more than one result uses should not get fused.
|
2019-11-26 10:49:48 +08:00
|
|
|
// CHECK-LABEL: func @test_sigmoid_add(%{{.*}}: tensor<10x10xf32>, %{{.*}}: tensor<10x10xf32>, %{{.*}}: tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
func @test_sigmoid_add(%a0: tensor<10x10xf32>, %a1: tensor<10x10xf32>, %a2: tensor<10x10xf32>) -> tensor<10x10xf32> {
|
2020-02-08 02:51:44 +08:00
|
|
|
// CHECK-NEXT: %{{[0-9]+}} = "onnx.MatMul"(%{{.*}}, %{{.*}}) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32>
|
2019-11-26 10:49:48 +08:00
|
|
|
%0 = "onnx.MatMul"(%a0, %a1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
%1 = "onnx.Add"(%0, %a2) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
%2 = "onnx.Add"(%0, %a1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
%3 = "onnx.Add"(%1, %2) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
"std.return"(%3) : (tensor<10x10xf32>) -> ()
|
|
|
|
}
|
|
|
|
|
2020-04-16 15:17:27 +08:00
|
|
|
// -----
|
|
|
|
|
2019-11-26 10:49:48 +08:00
|
|
|
// CHECK-LABEL: @test_identity_identity(%{{.*}}: tensor<10x10xf32>, %{{.*}}: tensor<10x10xf32>) -> tensor<10x10xf32>
|
2019-11-21 10:57:13 +08:00
|
|
|
func @test_identity_identity(%a0: tensor<10x10xf32>, %a1: tensor<10x10xf32>) -> tensor<10x10xf32> {
|
2019-11-26 10:49:48 +08:00
|
|
|
// CHECK-NEXT: %{{[0-9]+}} = "onnx.Add"(%{{.*}}, %{{.*}}) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
%0 = "onnx.Identity"(%a0) : (tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
%1 = "onnx.Identity"(%a1) : (tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
%2 = "onnx.Add"(%0, %1) : (tensor<10x10xf32>, tensor<10x10xf32>) -> tensor<10x10xf32>
|
|
|
|
"std.return"(%2) : (tensor<10x10xf32>) -> ()
|
2019-11-21 10:57:13 +08:00
|
|
|
}
|
2020-01-31 19:00:39 +08:00
|
|
|
|
2020-04-16 15:17:27 +08:00
|
|
|
// -----
|
|
|
|
|
2020-02-12 04:32:01 +08:00
|
|
|
// CHECK-LABEL: @test_constant_pad(%{{.*}}: tensor<?x?xf32>) -> tensor<*xf32> {
|
|
|
|
func @test_constant_pad(%arg0 : tensor<?x?xf32>) -> tensor<*xf32> {
|
2020-02-14 01:08:29 +08:00
|
|
|
// CHECK-NEXT: [[SQUARE:%.+]] = "onnx.PadConstantValuePad"(%arg0) {constant_value = 0.000000e+00 : f32, mode = "constant", pads = [0, 2, 0, 0]} : (tensor<?x?xf32>) -> tensor<*xf32>
|
2020-02-12 04:32:01 +08:00
|
|
|
%0 ="onnx.Constant"() {value=[0, 2, 0, 0]} : ()-> tensor<?xi64>
|
|
|
|
%2 = "onnx.PadConstantValue"(%arg0, %0) {constant_value=0. : f32, mode = "constant"} : (tensor<?x?xf32>, tensor<?xi64>)-> tensor<*xf32>
|
|
|
|
"std.return"(%2) : (tensor<*xf32>) -> ()
|
|
|
|
}
|
2020-02-15 05:06:38 +08:00
|
|
|
|
2020-04-16 15:17:27 +08:00
|
|
|
// -----
|
|
|
|
|
2020-02-15 05:06:38 +08:00
|
|
|
// CHECK-LABEL: @test_conv_split(%{{.*}}: tensor<1x9x32x64xf32>, %{{.*}}: tensor<5x9x6x7xf32>) -> tensor<*xf32> {
|
|
|
|
func @test_conv_split(%arg0 : tensor<1x9x32x64xf32>, %arg1 : tensor<5x9x6x7xf32>) -> tensor<*xf32> {
|
2020-03-26 23:03:19 +08:00
|
|
|
%cst = constant unit
|
|
|
|
%0 = "onnx.Conv"(%arg0, %arg1, %cst) {auto_pad = "NOTSET", group = 1 : i64, pads = [2, 3, 4, 5]} : (tensor<1x9x32x64xf32>, tensor<5x9x6x7xf32>, none) -> tensor<*xf32>
|
2020-02-15 05:06:38 +08:00
|
|
|
"std.return"(%0) : (tensor<*xf32>) -> ()
|
2020-05-15 13:19:28 +08:00
|
|
|
|
2020-03-26 23:03:19 +08:00
|
|
|
// CHECK-NEXT: %cst = constant unit
|
2020-05-15 13:19:28 +08:00
|
|
|
// CHECK-NEXT: %0 = "onnx.Constant"() {value = dense<[0, 0, 2, 3, 0, 0, 4, 5]> : tensor<8xi64>} : () -> tensor<8xi64>
|
|
|
|
// CHECK-NEXT: %1 = "onnx.Constant"() {value = dense<0.000000e+00> : tensor<1xf32>} : () -> tensor<1xf32>
|
|
|
|
// CHECK-NEXT: %2 = "onnx.Pad"(%arg0, %0, %1) {mode = "constant"} : (tensor<1x9x32x64xf32>, tensor<8xi64>, tensor<1xf32>) -> tensor<*xf32>
|
|
|
|
// CHECK-NEXT: %3 = "onnx.Conv"(%2, %arg1, %cst) {auto_pad = "NOTSET", group = 1 : i64, pads = [0, 0, 0, 0]} : (tensor<*xf32>, tensor<5x9x6x7xf32>, none) -> tensor<*xf32>
|
|
|
|
// CHECK-NEXT: return %3 : tensor<*xf32>
|
2020-02-15 05:06:38 +08:00
|
|
|
}
|
2020-02-24 23:46:48 +08:00
|
|
|
|
2020-04-16 15:17:27 +08:00
|
|
|
// -----
|
|
|
|
|
2020-02-24 23:46:48 +08:00
|
|
|
//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
|
|
|
|
%0 = "onnx.Gemm"(%arg0, %arg1, %cst) : (tensor<128x128xf32>, tensor<128x128xf32>, none) -> tensor<*xf32>
|
|
|
|
%1 = "onnx.Add"(%0, %arg2) : (tensor<*xf32>, tensor<128xf32>) -> tensor<*xf32>
|
|
|
|
return %1 : tensor<*xf32>
|
|
|
|
|
|
|
|
// CHECK-NEXT: [[GEMM:%.+]] = "onnx.Gemm"(%{{.*}}, %{{.*}}, %{{.*}}) {alpha = 1.000000e+00 : f32, beta = 1.000000e+00 : f32, transA = 0 : i64, transB = 0 : i64} : (tensor<128x128xf32>, tensor<128x128xf32>, tensor<128xf32>) -> tensor<*xf32>
|
|
|
|
// return [[GEMM]] : tensor<*xf32>
|
2020-02-27 00:40:52 +08:00
|
|
|
}
|
|
|
|
|
2020-04-16 15:17:27 +08:00
|
|
|
// -----
|
|
|
|
|
2020-02-27 00:40:52 +08:00
|
|
|
//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
|
|
|
|
%0 = "onnx.Gemm"(%arg0, %arg1, %cst) : (tensor<128x128x256xf32>, tensor<128x128x256xf32>, none) -> tensor<*xf32>
|
|
|
|
%1 = "onnx.Add"(%0, %arg2) : (tensor<*xf32>, tensor<256xf32>) -> tensor<*xf32>
|
|
|
|
return %1 : tensor<*xf32>
|
|
|
|
|
|
|
|
// CHECK-NEXT: [[GEMM:%.+]] = "onnx.Gemm"(%{{.*}}, %{{.*}}, %{{.*}}) {alpha = 1.000000e+00 : f32, beta = 1.000000e+00 : f32, transA = 0 : i64, transB = 0 : i64} : (tensor<128x128x256xf32>, tensor<128x128x256xf32>, tensor<256xf32>) -> tensor<*xf32>
|
|
|
|
// return [[GEMM]] : tensor<*xf32>
|
|
|
|
}
|
2020-07-17 23:01:30 +08:00
|
|
|
|
|
|
|
// -----
|
|
|
|
// Scaler Pattern test
|
|
|
|
// -----
|
|
|
|
|
|
|
|
// null
|
|
|
|
// CHECK-LABEL: func @test_scaler_null_float(%{{.*}}: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
func @test_scaler_null_float(%arg0: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
%0 = "onnx.Scaler"(%arg0) : (tensor<3xf32>) -> tensor<3xf32>
|
|
|
|
return %0 : tensor<3xf32>
|
|
|
|
|
|
|
|
// CHECK-NEXT: return %arg0 : tensor<3xf32>
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
// null not float
|
|
|
|
// CHECK-LABEL: func @test_scaler_null(%{{.*}}: tensor<3xi32>) -> tensor<3xf32> {
|
|
|
|
func @test_scaler_null(%arg0: tensor<3xi32>) -> tensor<3xf32> {
|
|
|
|
%0 = "onnx.Scaler"(%arg0) : (tensor<3xi32>) -> tensor<3xf32>
|
|
|
|
return %0 : tensor<3xf32>
|
|
|
|
|
|
|
|
// CHECK-NEXT: %0 = "onnx.Cast"(%arg0) {to = 0 : i64} : (tensor<3xi32>) -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: return %0 : tensor<3xf32>
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
// scaler no offset
|
|
|
|
// CHECK-LABEL: func @test_scaler_no_offset(%{{.*}}: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
func @test_scaler_no_offset(%arg0: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
%0 = "onnx.Scaler"(%arg0) {scale = [3.125000e-02 : f32, 0.0909090936 : f32, 0.0333333351 : f32]} : (tensor<3xf32>) -> tensor<3xf32>
|
|
|
|
return %0 : tensor<3xf32>
|
|
|
|
|
|
|
|
|
|
|
|
// CHECK-NEXT: %0 = "onnx.Constant"() {value = dense<[3.125000e-02, 0.0909090936, 0.0333333351]> : tensor<3xf32>} : () -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: %1 = "onnx.Mul"(%arg0, %0) : (tensor<3xf32>, tensor<3xf32>) -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: return %1 : tensor<3xf32>
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
// scaler no scale
|
|
|
|
// CHECK-LABEL: func @test_scaler_no_scale(%{{.*}}: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
func @test_scaler_no_scale(%arg0: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
%0 = "onnx.Scaler"(%arg0) {offset = [1986.99939 : f32, 0.99999988 : f32, 0.999999701 : f32]} : (tensor<3xf32>) -> tensor<3xf32>
|
|
|
|
return %0 : tensor<3xf32>
|
|
|
|
|
|
|
|
// CHECK-NEXT: %0 = "onnx.Constant"() {value = dense<[1986.99939, 0.99999988, 0.999999701]> : tensor<3xf32>} : () -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: %1 = "onnx.Sub"(%arg0, %0) : (tensor<3xf32>, tensor<3xf32>) -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: return %1 : tensor<3xf32>
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
// normal scaler
|
|
|
|
// CHECK-LABEL: func @test_scaler_normal(%{{.*}}: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
func @test_scaler_normal(%arg0: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
%0 = "onnx.Scaler"(%arg0) {offset = [1986.99939 : f32, 0.99999988 : f32, 0.999999701 : f32], scale = [3.125000e-02 : f32, 0.0909090936 : f32, 0.0333333351 : f32]} : (tensor<3xf32>) -> tensor<3xf32>
|
|
|
|
return %0 : tensor<3xf32>
|
|
|
|
|
|
|
|
// CHECK-NEXT: %0 = "onnx.Constant"() {value = dense<[1986.99939, 0.99999988, 0.999999701]> : tensor<3xf32>} : () -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: %1 = "onnx.Sub"(%arg0, %0) : (tensor<3xf32>, tensor<3xf32>) -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: %2 = "onnx.Constant"() {value = dense<[3.125000e-02, 0.0909090936, 0.0333333351]> : tensor<3xf32>} : () -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: %3 = "onnx.Mul"(%1, %2) : (tensor<3xf32>, tensor<3xf32>) -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: return %3 : tensor<3xf32>
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----
|
|
|
|
|
|
|
|
// normal scaler with constant offset and scale
|
|
|
|
// CHECK-LABEL: func @test_scaler_constant(%{{.*}}: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
func @test_scaler_constant(%arg0: tensor<3xf32>) -> tensor<3xf32> {
|
|
|
|
%0 = "onnx.Scaler"(%arg0) {offset = [1986.99939 : f32], scale = [3.125000e-02 : f32]} : (tensor<3xf32>) -> tensor<3xf32>
|
|
|
|
return %0 : tensor<3xf32>
|
|
|
|
|
|
|
|
// CHECK-NEXT: %0 = "onnx.Constant"() {value = dense<1986.99939> : tensor<1xf32>} : () -> tensor<1xf32>
|
|
|
|
// CHECK-NEXT: %1 = "onnx.Sub"(%arg0, %0) : (tensor<3xf32>, tensor<1xf32>) -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: %2 = "onnx.Constant"() {value = dense<3.125000e-02> : tensor<1xf32>} : () -> tensor<1xf32>
|
|
|
|
// CHECK-NEXT: %3 = "onnx.Mul"(%1, %2) : (tensor<3xf32>, tensor<1xf32>) -> tensor<3xf32>
|
|
|
|
// CHECK-NEXT: return %3 : tensor<3xf32>
|
|
|
|
}
|
|
|
|
|