llvm/mlir/test/Dialect/SparseTensor/rejected.mlir

// RUN: mlir-opt %s -sparsification | FileCheck %s


// The file contains examples that will be rejected by sparsifier
// (we expect the linalg.generic unchanged).
#SparseVector = #sparse_tensor.encoding<{map = (d0) -> (d0 : compressed)}>

#trait = {
  indexing_maps = [ 
    affine_map<(i) -> (i)>,  // a (in)
    affine_map<(i) -> ()>    // x (out)
  ],  
  iterator_types = ["reduction"]
}

// CHECK-LABEL:   func.func @sparse_reduction_subi(
// CHECK-SAME:      %[[VAL_0:.*]]: tensor<i32>,
// CHECK-SAME:      %[[VAL_1:.*]]: tensor<?xi32, #sparse{{[0-9]*}}>) -> tensor<i32> {
// CHECK:           %[[VAL_2:.*]] = linalg.generic
// CHECK:           ^bb0(%[[VAL_3:.*]]: i32, %[[VAL_4:.*]]: i32):
// CHECK:             %[[VAL_5:.*]] = arith.subi %[[VAL_3]], %[[VAL_4]] : i32
// CHECK:             linalg.yield %[[VAL_5]] : i32
// CHECK:           } -> tensor<i32>
// CHECK:           return %[[VAL_6:.*]] : tensor<i32>
func.func @sparse_reduction_subi(%argx: tensor<i32>,
                             %arga: tensor<?xi32, #SparseVector>)
 -> tensor<i32> {
  %0 = linalg.generic #trait
     ins(%arga: tensor<?xi32, #SparseVector>)
      outs(%argx: tensor<i32>) {
      ^bb(%a: i32, %x: i32):
        // NOTE: `subi %a, %x` is the reason why the program is rejected by the sparsifier.
        // It is because we do not allow `-outTensor` in reduction loops as it creates cyclic
        // dependences.
        %t = arith.subi %a, %x: i32 
        linalg.yield %t : i32 
  } -> tensor<i32>
  return %0 : tensor<i32>
}