blob: 7e95be495b333754085429507ea6e9b91f25dfb4 [file] [edit]
// RUN: mlir-opt %s --sparse-tensor-conversion -verify-diagnostics -split-input-file
// Regression test for https://github.com/llvm/llvm-project/issues/180310:
// sparse_tensor.new with an unsupported element type (e.g. index) must not
// crash with llvm_unreachable in primaryTypeEncoding; the conversion should
// fail gracefully.
#sparse = #sparse_tensor.encoding<{ map = (d0) -> (d0 : compressed) }>
func.func @new_index_elem_type(%arg0: index) {
// expected-error@+1 {{invalid primary type}}
%0 = sparse_tensor.new %arg0 : index to tensor<?xindex, #sparse>
return
}
// -----
#sparse1d = #sparse_tensor.encoding<{ map = (d0) -> (d0 : compressed) }>
// expected-error@+1 {{invalid primary type}}
func.func @alloc_tensor_i1_elem_type(%sz: index) -> tensor<?xi1, #sparse1d> {
%0 = bufferization.alloc_tensor(%sz) : tensor<?xi1, #sparse1d>
return %0 : tensor<?xi1, #sparse1d>
}
// -----
#unordered_coo = #sparse_tensor.encoding<{map = (d0, d1) -> (d0 : compressed(nonunique, nonordered), d1 : singleton(nonordered))}>
#ordered_coo = #sparse_tensor.encoding<{map = (d0, d1) -> (d0 : compressed(nonunique), d1 : singleton)}>
// expected-error@+1 {{invalid primary type}}
func.func @reorder_coo_i1_elem_type(%arg0: tensor<?x?xi1, #unordered_coo>)
-> tensor<?x?xi1, #ordered_coo> {
%0 = sparse_tensor.reorder_coo quick_sort %arg0
: tensor<?x?xi1, #unordered_coo> to tensor<?x?xi1, #ordered_coo>
return %0 : tensor<?x?xi1, #ordered_coo>
}
// -----
#sparse1d = #sparse_tensor.encoding<{ map = (d0) -> (d0 : compressed) }>
// expected-error@+2 {{invalid primary type}}
func.func @assemble_i1_elem_type(%pos: tensor<2xindex>, %coords: tensor<4x1xindex>,
%vals: tensor<4xi1>) -> tensor<8xi1, #sparse1d> {
%0 = sparse_tensor.assemble (%pos, %coords), %vals
: (tensor<2xindex>, tensor<4x1xindex>), tensor<4xi1> to tensor<8xi1, #sparse1d>
return %0 : tensor<8xi1, #sparse1d>
}
// -----
#sparse1d = #sparse_tensor.encoding<{ map = (d0) -> (d0 : compressed) }>
// expected-error@+1 {{invalid primary type}}
func.func @values_i1_elem_type(%arg0: tensor<8xi1, #sparse1d>) -> memref<?xi1> {
%0 = sparse_tensor.values %arg0 : tensor<8xi1, #sparse1d> to memref<?xi1>
return %0 : memref<?xi1>
}
// -----
#sparse1d = #sparse_tensor.encoding<{ map = (d0) -> (d0 : compressed) }>
// expected-error@+1 {{invalid primary type}}
func.func @number_of_entries_i1_elem_type(%arg0: tensor<8xi1, #sparse1d>) -> index {
%0 = sparse_tensor.number_of_entries %arg0 : tensor<8xi1, #sparse1d>
return %0 : index
}
// -----
#sparse1d = #sparse_tensor.encoding<{ map = (d0) -> (d0 : compressed) }>
// expected-error@+1 {{invalid primary type}}
func.func @disassemble_i1_elem_type(%sp: tensor<8xi1, #sparse1d>,
%op: tensor<2xindex>, %oi: tensor<4x1xindex>,
%od: tensor<4xi1>)
-> (tensor<2xindex>, tensor<4x1xindex>, tensor<4xi1>) {
%rp, %ri, %d, %rpl, %ril, %dl = sparse_tensor.disassemble %sp
: tensor<8xi1, #sparse1d>
out_lvls(%op, %oi : tensor<2xindex>, tensor<4x1xindex>)
out_vals(%od : tensor<4xi1>)
-> (tensor<2xindex>, tensor<4x1xindex>), tensor<4xi1>, (index, index), index
return %rp, %ri, %d : tensor<2xindex>, tensor<4x1xindex>, tensor<4xi1>
}
// -----
#sparse1d = #sparse_tensor.encoding<{ map = (d0) -> (d0 : compressed) }>
// expected-error@+1 {{invalid primary type}}
func.func @insert_i1_elem_type(%arg0: tensor<8xi1, #sparse1d>, %idx: index, %val: i1)
-> tensor<8xi1, #sparse1d> {
%0 = tensor.insert %val into %arg0[%idx] : tensor<8xi1, #sparse1d>
return %0 : tensor<8xi1, #sparse1d>
}
// -----
#csr = #sparse_tensor.encoding<{map = (d0, d1) -> (d0 : dense, d1 : compressed)}>
// expected-error@+1 {{invalid primary type}}
func.func @compress_i1_elem_type(%tensor: tensor<8x8xi1, #csr>,
%values: memref<?xi1>, %filled: memref<?xi1>,
%added: memref<?xindex>, %count: index, %i: index)
-> tensor<8x8xi1, #csr> {
%0 = sparse_tensor.compress %values, %filled, %added, %count into %tensor[%i]
: memref<?xi1>, memref<?xi1>, memref<?xindex>, tensor<8x8xi1, #csr>
return %0 : tensor<8x8xi1, #csr>
}