| // RUN: mlir-opt %s --sparse-assembler | FileCheck %s --check-prefix=CHECK-HI |
| // RUN: mlir-opt %s --sparse-assembler \ |
| // RUN: --inline | FileCheck %s --check-prefix=CHECK-INL |
| // RUN: mlir-opt %s --sparse-assembler \ |
| // RUN: --linalg-generalize-named-ops \ |
| // RUN: --linalg-fuse-elementwise-ops \ |
| // RUN: --sparsification-and-bufferization | FileCheck %s --check-prefix=CHECK-MID |
| // RUN: mlir-opt %s --sparse-assembler \ |
| // RUN: --sparsifier | FileCheck %s --check-prefix=CHECK-LOW |
| |
| // |
| // An example of a module generated by torch-mlir with a sparse tensor from |
| // torch.sparse. The MLIR sparsifier should be able to provide the external |
| // API through a wrapper method (spiface and ciface). Various passes should |
| // compose without trouble. |
| // |
| |
| // CHECK-HI-LABEL: func.func @main |
| // CHECK-HI: sparse_tensor.assemble |
| // CHECK-HI: call @_internal_main |
| // CHECK-HI: return |
| // CHECK-HI: func.func private @_internal_main |
| // CHECK-HI: linalg.matmul |
| // CHECK-HI: return |
| |
| // CHECK-INL-LABEL: func.func @main |
| // CHECK-INL: sparse_tensor.assemble |
| // CHECK-INL: linalg.matmul |
| // CHECK-INL: return |
| // CHECK-INL-NOT: func.func private @_internal_main |
| |
| // CHECK-MID-LABEL: func.func @main |
| // CHECK-MID: memref.load |
| // CHECK-MID: call @_internal_main |
| // CHECK-MID: return |
| // CHECK-MID: func.func private @_internal_main |
| // CHECK-MID: scf.for |
| // CHECK-MID: scf.for |
| // CHECK-MID: return |
| |
| // CHECK-LOW-LABEL: llvm.func @main |
| // CHECK-LOW: llvm.call @_internal_main |
| // CHECK-LOW: llvm.return |
| // CHECK-LOW: llvm.func @_mlir_ciface_main |
| // CHECK-LOW: llvm.call @main |
| // CHECK-LOW: llvm.return |
| // CHECK-LOW: llvm.func @_internal_main |
| // CHECK-SAME: {sym_visibility = "private"} |
| // CHECK-LOW: llvm.return |
| |
| #csc = #sparse_tensor.encoding<{ map = (d0, d1) -> (d0 : dense, d1 : compressed) }> |
| module { |
| func.func @main(%arg0: tensor<64x64xf32, #csc>, |
| %arg1: tensor<64x64xf32>) -> tensor<64x64xf32> attributes {llvm.emit_c_interface} { |
| %cst = arith.constant 0.000000e+00 : f32 |
| %0 = tensor.empty() : tensor<64x64xf32> |
| %1 = linalg.fill ins(%cst : f32) outs(%0 : tensor<64x64xf32>) -> tensor<64x64xf32> |
| %2 = linalg.matmul |
| ins(%arg0, %arg1 : tensor<64x64xf32, #csc>, tensor<64x64xf32>) |
| outs(%1 : tensor<64x64xf32>) -> tensor<64x64xf32> |
| return %2 : tensor<64x64xf32> |
| } |
| } |