// RUN: mlir-opt %s --linalg-generalize-named-ops \ // RUN: --sparsification-and-bufferization | FileCheck %s #CSR_ones_complex = #sparse_tensor.encoding<{ map = (d0, d1) -> (d0 : dense, d1 : compressed), explicitVal = #complex.number<:f32 1.0, 0.0>, implicitVal = #complex.number<:f32 0.0, 0.0> }> #CSR_ones_fp = #sparse_tensor.encoding<{ map = (d0, d1) -> (d0 : dense, d1 : compressed), explicitVal = 1.0 : f32, implicitVal = 0.0 : f32 }> #CSR_ones_int = #sparse_tensor.encoding<{ map = (d0, d1) -> (d0 : dense, d1 : compressed), explicitVal = 1 : i32, implicitVal = 0 : i32 }> // CHECK-LABEL: func.func @matmul_complex // CHECK: scf.for // CHECK: scf.for // CHECK: %[[X:.*]] = memref.load // CHECK: scf.for // CHECK: %[[I:.*]] = memref.load // CHECK: %[[Y:.*]] = memref.load // CHECK: %[[M:.*]] = complex.add %[[Y]], %[[X]] : complex // CHECK: memref.store %[[M]] // CHECK: } // CHECK: } // CHECK: } func.func @matmul_complex(%a: tensor<10x20xcomplex>, %b: tensor<20x30xcomplex, #CSR_ones_complex>, %c: tensor<10x30xcomplex>) -> tensor<10x30xcomplex> { %0 = linalg.matmul ins(%a, %b: tensor<10x20xcomplex>, tensor<20x30xcomplex,#CSR_ones_complex>) outs(%c: tensor<10x30xcomplex>) -> tensor<10x30xcomplex> return %0 : tensor<10x30xcomplex> } // CHECK-LABEL: func.func @matmul_fp // CHECK: scf.for // CHECK: scf.for // CHECK: %[[X:.*]] = memref.load // CHECK: scf.for // CHECK: %[[I:.*]] = memref.load // CHECK: %[[Y:.*]] = memref.load // CHECK: %[[M:.*]] = arith.addf %[[Y]], %[[X]] : f32 // CHECK: memref.store %[[M]] // CHECK: } // CHECK: } // CHECK: } func.func @matmul_fp(%a: tensor<10x20xf32>, %b: tensor<20x30xf32, #CSR_ones_fp>, %c: tensor<10x30xf32>) -> tensor<10x30xf32> { %0 = linalg.matmul ins(%a, %b: tensor<10x20xf32>, tensor<20x30xf32,#CSR_ones_fp>) outs(%c: tensor<10x30xf32>) -> tensor<10x30xf32> return %0 : tensor<10x30xf32> } // CHECK-LABEL: func.func @matmul_int // CHECK: scf.for // CHECK: scf.for // CHECK: %[[X:.*]] = memref.load // CHECK: scf.for // CHECK: %[[I:.*]] = memref.load // CHECK: %[[Y:.*]] = memref.load // CHECK: %[[M:.*]] = arith.addi %[[Y]], %[[X]] : i32 // CHECK: memref.store %[[M]] // CHECK: } // CHECK: } // CHECK: } func.func @matmul_int(%a: tensor<10x20xi32>, %b: tensor<20x30xi32, #CSR_ones_int>, %c: tensor<10x30xi32>) -> tensor<10x30xi32> { %0 = linalg.matmul ins(%a, %b: tensor<10x20xi32>, tensor<20x30xi32,#CSR_ones_int>) outs(%c: tensor<10x30xi32>) -> tensor<10x30xi32> return %0 : tensor<10x30xi32> }