| // RUN: mlir-opt --split-input-file --tosa-to-linalg-on-tensors %s -verify-diagnostics -o -| FileCheck %s |
| |
| // CHECK: #map = affine_map<() -> ()> |
| |
| // CHECK-LABEL: @test_abs |
| func @test_abs(%arg0: tensor<f32>) -> tensor<f32> { |
| // CHECK: [[INIT:%.+]] = linalg.init_tensor [] : tensor<f32> |
| // CHECK: [[GENERIC:%.+]] = linalg.generic {indexing_maps = [#map, #map], iterator_types = []} ins(%arg0 : tensor<f32>) outs([[INIT]] : tensor<f32>) { |
| // CHECK: ^bb0(%arg1: f32, %arg2: f32): |
| // CHECK: [[ELEMENT:%.+]] = absf %arg1 |
| // CHECK: linalg.yield [[ELEMENT]] : f32 |
| // CHECK: } -> tensor<f32> |
| |
| %0 = "tosa.abs"(%arg0) : (tensor<f32>) -> tensor<f32> |
| |
| // CHECK: return [[GENERIC]] |
| return %0 : tensor<f32> |
| } |
| |
| // ----- |
| |
| // CHECK: #map = affine_map<(d0) -> (d0)> |
| |
| // CHECK-LABEL: @test_abs |
| func @test_abs(%arg0: tensor<1xf32>) -> tensor<1xf32> { |
| // CHECK: [[INIT:%.+]] = linalg.init_tensor [1] : tensor<1xf32> |
| // CHECK: [[GENERIC:%.+]] = linalg.generic {indexing_maps = [#map, #map], iterator_types = ["parallel"]} ins(%arg0 : tensor<1xf32>) outs([[INIT]] : tensor<1xf32>) { |
| // CHECK: ^bb0(%arg1: f32, %arg2: f32): |
| // CHECK: [[ELEMENT:%.+]] = absf %arg1 |
| // CHECK: linalg.yield [[ELEMENT]] : f32 |
| // CHECK: } -> tensor<1xf32> |
| %0 = "tosa.abs"(%arg0) : (tensor<1xf32>) -> tensor<1xf32> |
| |
| // CHECK: return [[GENERIC]] |
| return %0 : tensor<1xf32> |
| } |
| |
| // ----- |
| |
| // CHECK: #map = affine_map<(d0, d1) -> (d0, d1)> |
| |
| // CHECK-LABEL: @test_abs |
| func @test_abs(%arg0: tensor<1x2xf32>) -> tensor<1x2xf32> { |
| // CHECK: [[INIT:%.+]] = linalg.init_tensor [1, 2] : tensor<1x2xf32> |
| // CHECK: [[GENERIC:%.+]] = linalg.generic {indexing_maps = [#map, #map], iterator_types = ["parallel", "parallel"]} ins(%arg0 : tensor<1x2xf32>) outs([[INIT]] : tensor<1x2xf32>) { |
| // CHECK: ^bb0(%arg1: f32, %arg2: f32): |
| // CHECK: [[ELEMENT:%.+]] = absf %arg1 |
| // CHECK: linalg.yield [[ELEMENT]] : f32 |
| // CHECK: } -> tensor<1x2xf32> |
| %0 = "tosa.abs"(%arg0) : (tensor<1x2xf32>) -> tensor<1x2xf32> |
| |
| // CHECK: return [[GENERIC]] |
| return %0 : tensor<1x2xf32> |
| } |
| |
| // ----- |
| |
| func @test_add(%arg0: tensor<1xf32>, %arg1: tensor<2xf32>) -> tensor<2xf32> { |
| // expected-error @+1 {{failed to legalize operation 'tosa.add'}} |
| %0 = "tosa.add"(%arg0, %arg1) : (tensor<1xf32>, tensor<2xf32>) -> tensor<2xf32> |
| return %0 : tensor<2xf32> |
| } |
| |
| // ----- |
| |
| func @test_add(%arg0: tensor<1xf32>, %arg1: tensor<f32>) -> tensor<1xf32> { |
| // expected-error @+1 {{failed to legalize operation 'tosa.add'}} |
| %0 = "tosa.add"(%arg0, %arg1) : (tensor<1xf32>, tensor<f32>) -> tensor<1xf32> |
| return %0 : tensor<1xf32> |
| } |
| |
| // ----- |
| |
| func @test_abs(%arg0: tensor<?xf32>) -> tensor<?xf32> { |
| // expected-error @+1 {{failed to legalize operation 'tosa.abs'}} |
| %0 = "tosa.abs"(%arg0) : (tensor<?xf32>) -> tensor<?xf32> |
| return %0 : tensor<?xf32> |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: @test_simple_f32 |
| func @test_simple_f32(%arg0: tensor<1xf32>) -> () { |
| // CHECK: linalg.generic |
| // CHECK: tanh |
| %0 = "tosa.tanh"(%arg0) : (tensor<1xf32>) -> tensor<1xf32> |
| |
| // CHECK: linalg.generic |
| // CHECK: absf |
| %1 = "tosa.abs"(%arg0) : (tensor<1xf32>) -> tensor<1xf32> |
| |
| // CHECK: linalg.generic |
| // CHECK: addf |
| %2 = "tosa.add"(%0, %0) : (tensor<1xf32>, tensor<1xf32>) -> tensor<1xf32> |
| |
| // CHECK: linalg.generic |
| // CHECK: subf |
| %3 = "tosa.sub"(%0, %1) : (tensor<1xf32>, tensor<1xf32>) -> tensor<1xf32> |
| |
| // CHECK: linalg.generic |
| // CHECK: pow |
| %4 = "tosa.pow"(%1, %2) : (tensor<1xf32>, tensor<1xf32>) -> tensor<1xf32> |
| return |
| } |
| |
| // ----- |
| |
| // CHECK-LABEL: @test_simple_i32 |
| func @test_simple_i32(%arg0: tensor<1xi32>) -> () { |
| // CHECK: linalg.generic |
| // CHECK: addi |
| %0 = "tosa.add"(%arg0, %arg0) : (tensor<1xi32>, tensor<1xi32>) -> tensor<1xi32> |
| |
| // CHECK: linalg.generic |
| // CHECK: subi |
| %1 = "tosa.sub"(%arg0, %arg0) : (tensor<1xi32>, tensor<1xi32>) -> tensor<1xi32> |
| |
| // CHECK: linalg.generic |
| // CHECK: and |
| %2 = "tosa.bitwise_and"(%arg0, %arg0) : (tensor<1xi32>, tensor<1xi32>) -> tensor<1xi32> |
| |
| // CHECK: linalg.generic |
| // CHECK: or |
| %3 = "tosa.bitwise_or"(%arg0, %arg0) : (tensor<1xi32>, tensor<1xi32>) -> tensor<1xi32> |
| |
| // CHECK: linalg.generic |
| // CHECK: xor |
| %4 = "tosa.bitwise_xor"(%arg0, %arg0) : (tensor<1xi32>, tensor<1xi32>) -> tensor<1xi32> |
| |
| // CHECK: linalg.generic |
| // CHECK: shift_left |
| %5 = "tosa.logical_left_shift"(%arg0, %arg0) : (tensor<1xi32>, tensor<1xi32>) -> tensor<1xi32> |
| |
| // CHECK: linalg.generic |
| // CHECK: shift_right_unsigned |
| %6 = "tosa.logical_right_shift"(%arg0, %arg0) : (tensor<1xi32>, tensor<1xi32>) -> tensor<1xi32> |
| |
| return |
| } |
| |