xref: /llvm-project/mlir/test/Dialect/SparseTensor/codegen.mlir (revision 5c5116556f58d90353aa3e3a34214cdc5ff0b2f2)
12cc4b3d0SPeiming Liu// RUN: mlir-opt %s --lower-sparse-ops-to-foreach --lower-sparse-foreach-to-scf --sparse-reinterpret-map --sparse-tensor-codegen  --canonicalize -cse | FileCheck %s
286b22d31SAart Bik
3dbe1be9aSYinying Li#SV = #sparse_tensor.encoding<{ map = (d0) -> (d0 : compressed) }>
49f596a7cSAart Bik
586b22d31SAart Bik#SparseVector = #sparse_tensor.encoding<{
6dbe1be9aSYinying Li  map = (d0) -> (d0 : compressed),
784cd51bbSwren romano  crdWidth = 64,
884cd51bbSwren romano  posWidth = 32
986b22d31SAart Bik}>
1086b22d31SAart Bik
111be09496SAart Bik#Dense2D = #sparse_tensor.encoding<{
122a07f0fdSYinying Li  map = (d0, d1) -> (d0 : dense, d1 : dense),
1384cd51bbSwren romano  crdWidth = 64,
1484cd51bbSwren romano  posWidth = 32
15f767f092SAart Bik}>
16f767f092SAart Bik
17f767f092SAart Bik#Row = #sparse_tensor.encoding<{
182a07f0fdSYinying Li  map = (d0, d1) -> (d0 : compressed, d1 : dense),
1984cd51bbSwren romano  crdWidth = 64,
2084cd51bbSwren romano  posWidth = 32
21f767f092SAart Bik}>
22f767f092SAart Bik
23f767f092SAart Bik#CSR = #sparse_tensor.encoding<{
24e2e429d9SYinying Li  map = (d0, d1) -> (d0 : dense, d1 : compressed),
2584cd51bbSwren romano  crdWidth = 64,
2684cd51bbSwren romano  posWidth = 32
27f767f092SAart Bik}>
28f767f092SAart Bik
294d068619SAart Bik#UCSR = #sparse_tensor.encoding<{
303dc62112SYinying Li  map = (d0, d1) -> (d0 : dense, d1 : compressed(nonordered))
314d068619SAart Bik}>
324d068619SAart Bik
330c7abd39SAart Bik#CSC = #sparse_tensor.encoding<{
34e2e429d9SYinying Li  map = (d0, d1) -> (d1 : dense, d0 : compressed)
350c7abd39SAart Bik}>
360c7abd39SAart Bik
370d1f9576SPeiming Liu#BCSR = #sparse_tensor.encoding<{
380d1f9576SPeiming Liu  map = (d0, d1, d2, d3) -> (d0: batch, d1: batch, d2 : dense, d3 : compressed)
390d1f9576SPeiming Liu}>
400d1f9576SPeiming Liu
41f767f092SAart Bik#DCSR = #sparse_tensor.encoding<{
422a07f0fdSYinying Li  map = (d0, d1) -> (d0 : compressed, d1 : compressed),
4384cd51bbSwren romano  crdWidth = 64,
4484cd51bbSwren romano  posWidth = 32
45f767f092SAart Bik}>
4686b22d31SAart Bik
471be09496SAart Bik#Dense3D = #sparse_tensor.encoding<{
483dc62112SYinying Li  map = (d0, d1, d2) -> (d2 : dense, d0 : dense, d1 : dense)
491be09496SAart Bik}>
501be09496SAart Bik
51840e2ba3Sbixia1#Coo = #sparse_tensor.encoding<{
523dc62112SYinying Li  map = (d0, d1) -> (d0 : compressed(nonunique), d1 : singleton)
53840e2ba3Sbixia1}>
54840e2ba3Sbixia1
55f740366fSPeiming Liu#SoACOO = #sparse_tensor.encoding<{
56f740366fSPeiming Liu  map = (d0, d1) -> (d0 : compressed(nonunique), d1 : singleton(soa))
57f740366fSPeiming Liu}>
58f740366fSPeiming Liu
592c81d432Sbixia1#CooPNo = #sparse_tensor.encoding<{
603dc62112SYinying Li  map = (d0, d1) -> (d1 : compressed(nonunique), d0 : singleton(nonordered))
612c81d432Sbixia1}>
622c81d432Sbixia1
633fdd85daSbixia1#ccoo = #sparse_tensor.encoding<{
643dc62112SYinying Li  map = (d0, d1, d2) -> (d0 : compressed, d1 : compressed(nonunique), d2 : singleton)
653fdd85daSbixia1}>
663fdd85daSbixia1
67edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_nop(
68988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xi32>,
69988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: memref<?xi64>,
70988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*]]: memref<?xf64>,
71988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: !sparse_tensor.storage_specifier
72988733c6SPeiming Liu//       CHECK: return %[[A0]], %[[A1]], %[[A2]], %[[A3]] :
73988733c6SPeiming Liu//  CHECK-SAME:   memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
7486b22d31SAart Bikfunc.func @sparse_nop(%arg0: tensor<?xf64, #SparseVector>) -> tensor<?xf64, #SparseVector> {
7586b22d31SAart Bik  return %arg0 : tensor<?xf64, #SparseVector>
7686b22d31SAart Bik}
77f767f092SAart Bik
78f740366fSPeiming Liu// CHECK-LABEL: func @sparse_nop_aos_coo(
79f740366fSPeiming Liu//  CHECK-SAME: %[[POS:.*0]]: memref<?xindex>,
80f740366fSPeiming Liu//  CHECK-SAME: %[[AoS_CRD:.*1]]: memref<?xindex>,
81f740366fSPeiming Liu//  CHECK-SAME: %[[VAL:.*]]: memref<?xf64>,
82f740366fSPeiming Liu//  CHECK-SAME: %[[A3:.*]]: !sparse_tensor.storage_specifier
83f740366fSPeiming Liu//       CHECK: return %[[POS]], %[[AoS_CRD]], %[[VAL]], %[[A3]]
84f740366fSPeiming Liufunc.func @sparse_nop_aos_coo(%arg0: tensor<?x?xf64, #Coo>) -> tensor<?x?xf64, #Coo> {
85f740366fSPeiming Liu  return %arg0 : tensor<?x?xf64, #Coo>
86f740366fSPeiming Liu}
87f740366fSPeiming Liu
88f740366fSPeiming Liu// CHECK-LABEL: func @sparse_nop_soa_coo(
89f740366fSPeiming Liu//  CHECK-SAME: %[[POS:.*0]]: memref<?xindex>,
90f740366fSPeiming Liu//  CHECK-SAME: %[[SoA_CRD_0:.*1]]: memref<?xindex>,
91f740366fSPeiming Liu//  CHECK-SAME: %[[SoA_CRD_1:.*2]]: memref<?xindex>,
92f740366fSPeiming Liu//  CHECK-SAME: %[[VAL:.*]]: memref<?xf64>,
93f740366fSPeiming Liu//  CHECK-SAME: %[[A3:.*]]: !sparse_tensor.storage_specifier
94f740366fSPeiming Liu//       CHECK: return %[[POS]], %[[SoA_CRD_0]], %[[SoA_CRD_1]], %[[VAL]], %[[A3]]
95f740366fSPeiming Liufunc.func @sparse_nop_soa_coo(%arg0: tensor<?x?xf64, #SoACOO>) -> tensor<?x?xf64, #SoACOO> {
96f740366fSPeiming Liu  return %arg0 : tensor<?x?xf64, #SoACOO>
97f740366fSPeiming Liu}
98f740366fSPeiming Liu
99f740366fSPeiming Liu
100edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_nop_multi_ret(
101988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*0]]: memref<?xi32>,
102988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*1]]: memref<?xi64>,
103988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*2]]: memref<?xf64>,
104988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*3]]: !sparse_tensor.storage_specifier
105988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*4]]: memref<?xi32>,
106988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*5]]: memref<?xi64>,
107988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*6]]: memref<?xf64>,
108988733c6SPeiming Liu//  CHECK-SAME: %[[A7:.*7]]: !sparse_tensor.storage_specifier
109988733c6SPeiming Liu//       CHECK: return %[[A0]], %[[A1]], %[[A2]], %[[A3]], %[[A4]], %[[A5]], %[[A6]], %[[A7]] :
110988733c6SPeiming Liu//  CHECK-SAME:   memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
111988733c6SPeiming Liu//  CHECK-SAME:   memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
112edca72f5SPeiming Liufunc.func @sparse_nop_multi_ret(%arg0: tensor<?xf64, #SparseVector>,
113edca72f5SPeiming Liu                                %arg1: tensor<?xf64, #SparseVector>) ->
114edca72f5SPeiming Liu                                (tensor<?xf64, #SparseVector>, tensor<?xf64, #SparseVector>) {
115edca72f5SPeiming Liu  return %arg0, %arg1 : tensor<?xf64, #SparseVector>, tensor<?xf64, #SparseVector>
116edca72f5SPeiming Liu}
117edca72f5SPeiming Liu
118edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_nop_call(
119988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*0]]: memref<?xi32>,
120988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*1]]: memref<?xi64>,
121988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*2]]: memref<?xf64>,
122988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*3]]: !sparse_tensor.storage_specifier
123988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*4]]: memref<?xi32>,
124988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*5]]: memref<?xi64>,
125988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*6]]: memref<?xf64>,
126988733c6SPeiming Liu//  CHECK-SAME: %[[A7:.*7]]: !sparse_tensor.storage_specifier
127988733c6SPeiming Liu//       CHECK: %[[T:.*]]:8 = call @sparse_nop_multi_ret(%[[A0]], %[[A1]], %[[A2]], %[[A3]], %[[A4]], %[[A5]], %[[A6]], %[[A7]])
128988733c6SPeiming Liu//       CHECK: return %[[T]]#0, %[[T]]#1, %[[T]]#2, %[[T]]#3, %[[T]]#4, %[[T]]#5, %[[T]]#6, %[[T]]#7 :
129988733c6SPeiming Liu//  CHECK-SAME:   memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
130988733c6SPeiming Liu//  CHECK-SAME:   memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
131edca72f5SPeiming Liufunc.func @sparse_nop_call(%arg0: tensor<?xf64, #SparseVector>,
132edca72f5SPeiming Liu                           %arg1: tensor<?xf64, #SparseVector>) ->
133edca72f5SPeiming Liu                           (tensor<?xf64, #SparseVector>, tensor<?xf64, #SparseVector>) {
134edca72f5SPeiming Liu  %1, %2 = call @sparse_nop_multi_ret(%arg0, %arg1) :
135edca72f5SPeiming Liu                           (tensor<?xf64, #SparseVector>, tensor<?xf64, #SparseVector>) ->
136edca72f5SPeiming Liu                           (tensor<?xf64, #SparseVector>, tensor<?xf64, #SparseVector>)
137edca72f5SPeiming Liu  return %1, %2: tensor<?xf64, #SparseVector>, tensor<?xf64, #SparseVector>
138edca72f5SPeiming Liu}
139edca72f5SPeiming Liu
140edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_nop_cast(
141988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xi32>,
142988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: memref<?xi64>,
143988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*]]: memref<?xf32>,
144988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: !sparse_tensor.storage_specifier
145988733c6SPeiming Liu//       CHECK: return %[[A0]], %[[A1]], %[[A2]], %[[A3]] :
146f27b806dSAart Bikfunc.func @sparse_nop_cast(%arg0: tensor<64xf32, #SparseVector>) -> tensor<?xf32, #SparseVector> {
147f27b806dSAart Bik  %0 = tensor.cast %arg0 : tensor<64xf32, #SparseVector> to tensor<?xf32, #SparseVector>
148f27b806dSAart Bik  return %0 : tensor<?xf32, #SparseVector>
149f27b806dSAart Bik}
150f27b806dSAart Bik
151edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_nop_cast_3d(
152988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xf32>,
153988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: !sparse_tensor.storage_specifier
154988733c6SPeiming Liu//       CHECK: return %[[A0]], %[[A1]] :
155988733c6SPeiming Liu//  CHECK-SAME:   memref<?xf32>, !sparse_tensor.storage_specifier
156f27b806dSAart Bikfunc.func @sparse_nop_cast_3d(%arg0: tensor<10x20x30xf32, #Dense3D>) -> tensor<?x?x?xf32, #Dense3D> {
157f27b806dSAart Bik  %0 = tensor.cast %arg0 : tensor<10x20x30xf32, #Dense3D> to tensor<?x?x?xf32, #Dense3D>
158f27b806dSAart Bik  return %0 : tensor<?x?x?xf32, #Dense3D>
159f27b806dSAart Bik}
160f27b806dSAart Bik
161edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_dense_2d(
162988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xf64>,
163988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: !sparse_tensor.storage_specifier
164edca72f5SPeiming Liu//       CHECK: return
1651be09496SAart Bikfunc.func @sparse_dense_2d(%arg0: tensor<?x?xf64, #Dense2D>) {
166f767f092SAart Bik  return
167f767f092SAart Bik}
168f767f092SAart Bik
169edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_row(
170988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xi32>,
171988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: memref<?xi64>,
172988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*]]: memref<?xf64>,
173988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: !sparse_tensor.storage_specifier
174edca72f5SPeiming Liu//       CHECK: return
175f767f092SAart Bikfunc.func @sparse_row(%arg0: tensor<?x?xf64, #Row>) {
176f767f092SAart Bik  return
177f767f092SAart Bik}
178f767f092SAart Bik
179edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_csr(
180988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xi32>,
181988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: memref<?xi64>,
182988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*]]: memref<?xf64>,
183988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: !sparse_tensor.storage_specifier
184edca72f5SPeiming Liu//       CHECK: return
185f767f092SAart Bikfunc.func @sparse_csr(%arg0: tensor<?x?xf64, #CSR>) {
186f767f092SAart Bik  return
187f767f092SAart Bik}
188f767f092SAart Bik
1890d1f9576SPeiming Liu// CHECK-LABEL: func @sparse_bcsr_0(
1900d1f9576SPeiming Liu//  CHECK-SAME: %[[A1:.*0]]: memref<?x2x?xindex>,
1910d1f9576SPeiming Liu//  CHECK-SAME: %[[A2:.*1]]: memref<?x2x?xindex>,
1920d1f9576SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: memref<?x2x?xf64>,
1930d1f9576SPeiming Liu//  CHECK-SAME: %[[A4:.*]]: !sparse_tensor.storage_specifier
1940d1f9576SPeiming Liu//       CHECK: return
1950d1f9576SPeiming Liufunc.func @sparse_bcsr_0(%arg0: tensor<?x2x?x?xf64, #BCSR>) {
1960d1f9576SPeiming Liu  return
1970d1f9576SPeiming Liu}
1980d1f9576SPeiming Liu
1990d1f9576SPeiming Liu// CHECK-LABEL: func @sparse_bcsr_1(
2000d1f9576SPeiming Liu//  CHECK-SAME: %[[A1:.*0]]: memref<?x?x?xindex>,
2010d1f9576SPeiming Liu//  CHECK-SAME: %[[A2:.*1]]: memref<?x?x?xindex>,
2020d1f9576SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: memref<?x?x?xf64>,
2030d1f9576SPeiming Liu//  CHECK-SAME: %[[A4:.*]]: !sparse_tensor.storage_specifier
2040d1f9576SPeiming Liu//       CHECK: return
2050d1f9576SPeiming Liufunc.func @sparse_bcsr_1(%arg0: tensor<?x?x?x?xf64, #BCSR>) {
2060d1f9576SPeiming Liu  return
2070d1f9576SPeiming Liu}
2080d1f9576SPeiming Liu
2090d1f9576SPeiming Liu// CHECK-LABEL: func @sparse_bcsr_2(
2100d1f9576SPeiming Liu//  CHECK-SAME: %[[A1:.*0]]: memref<18x6x?xindex>,
2110d1f9576SPeiming Liu//  CHECK-SAME: %[[A2:.*1]]: memref<18x6x?xindex>,
2120d1f9576SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: memref<18x6x?xf64>,
2130d1f9576SPeiming Liu//  CHECK-SAME: %[[A4:.*]]: !sparse_tensor.storage_specifier
2140d1f9576SPeiming Liu//       CHECK: return
2150d1f9576SPeiming Liufunc.func @sparse_bcsr_2(%arg0: tensor<18x6x4x2xf64, #BCSR>) {
2160d1f9576SPeiming Liu  return
2170d1f9576SPeiming Liu}
2180d1f9576SPeiming Liu
219edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_dcsr(
220988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*0]]: memref<?xi32>,
221988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*1]]: memref<?xi64>,
22270633a8dSAart Bik//  CHECK-SAME: %[[A2:.*2]]: memref<?xi32>,
22370633a8dSAart Bik//  CHECK-SAME: %[[A3:.*3]]: memref<?xi64>,
224988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*4]]: memref<?xf64>,
225988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*5]]: !sparse_tensor.storage_specifier
226edca72f5SPeiming Liu//       CHECK: return
227f767f092SAart Bikfunc.func @sparse_dcsr(%arg0: tensor<?x?xf64, #DCSR>) {
228f767f092SAart Bik  return
229f767f092SAart Bik}
2301be09496SAart Bik
2311be09496SAart Bik//
2323ae98fd2SAart Bik// Querying for dimension 1 in the tensor type can immediately
2333ae98fd2SAart Bik// fold using the original static dimension sizes.
2341be09496SAart Bik//
235edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_dense_3d(
236988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xf64>,
237988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: !sparse_tensor.storage_specifier
238edca72f5SPeiming Liu//       CHECK: %[[C:.*]] = arith.constant 20 : index
239edca72f5SPeiming Liu//       CHECK: return %[[C]] : index
2401be09496SAart Bikfunc.func @sparse_dense_3d(%arg0: tensor<10x20x30xf64, #Dense3D>) -> index {
2411be09496SAart Bik  %c = arith.constant 1 : index
2421be09496SAart Bik  %0 = tensor.dim %arg0, %c : tensor<10x20x30xf64, #Dense3D>
2431be09496SAart Bik  return %0 : index
2441be09496SAart Bik}
2453ae98fd2SAart Bik
2463ae98fd2SAart Bik//
2473ae98fd2SAart Bik// Querying for dimension 1 in the tensor type needs to be permuted
2483ae98fd2SAart Bik// into querying for dimension 2 in the stored sparse tensor scheme,
24976647fceSwren romano// since the latter honors the dimToLvl mapping.
2503ae98fd2SAart Bik//
251edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_dense_3d_dyn(
252988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xf64>,
253988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: !sparse_tensor.storage_specifier
25484cd51bbSwren romano//       CHECK: %[[A2:.*]] = sparse_tensor.storage_specifier.get %[[A1]] lvl_sz at 2
25544ff23d5SPeiming Liu//       CHECK: return %[[A2]] : index
2563ae98fd2SAart Bikfunc.func @sparse_dense_3d_dyn(%arg0: tensor<?x?x?xf64, #Dense3D>) -> index {
2573ae98fd2SAart Bik  %c = arith.constant 1 : index
2583ae98fd2SAart Bik  %0 = tensor.dim %arg0, %c : tensor<?x?x?xf64, #Dense3D>
2593ae98fd2SAart Bik  return %0 : index
2603ae98fd2SAart Bik}
2613ae98fd2SAart Bik
26284cd51bbSwren romano// CHECK-LABEL: func @sparse_positions_dcsr(
263988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*0]]: memref<?xi32>,
264988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*1]]: memref<?xi64>,
26570633a8dSAart Bik//  CHECK-SAME: %[[A2:.*2]]: memref<?xi32>,
26670633a8dSAart Bik//  CHECK-SAME: %[[A3:.*3]]: memref<?xi64>,
267988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*4]]: memref<?xf64>,
268988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*5]]: !sparse_tensor.storage_specifier
269*5c511655SAart Bik//       CHECK: %[[S:.*]] = sparse_tensor.storage_specifier.get %[[A5]] pos_mem_sz at 1
270*5c511655SAart Bik//       CHECK: %[[V:.*]] = memref.subview %[[A2]][0] [%[[S]]] [1]
271*5c511655SAart Bik//       CHECK: return %[[V]] : memref<?xi32>
27284cd51bbSwren romanofunc.func @sparse_positions_dcsr(%arg0: tensor<?x?xf64, #DCSR>) -> memref<?xi32> {
27384cd51bbSwren romano  %0 = sparse_tensor.positions %arg0 { level = 1 : index } : tensor<?x?xf64, #DCSR> to memref<?xi32>
2743ae98fd2SAart Bik  return %0 : memref<?xi32>
2753ae98fd2SAart Bik}
2763ae98fd2SAart Bik
277edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_indices_dcsr(
278988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*0]]: memref<?xi32>,
279988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*1]]: memref<?xi64>,
28070633a8dSAart Bik//  CHECK-SAME: %[[A2:.*2]]: memref<?xi32>,
28170633a8dSAart Bik//  CHECK-SAME: %[[A3:.*3]]: memref<?xi64>,
282988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*4]]: memref<?xf64>,
283988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*5]]: !sparse_tensor.storage_specifier
284*5c511655SAart Bik//       CHECK: %[[S:.*]] = sparse_tensor.storage_specifier.get %[[A5]] crd_mem_sz at 1
285*5c511655SAart Bik//       CHECK: %[[V:.*]] = memref.subview %[[A3]][0] [%[[S]]] [1]
286*5c511655SAart Bik//       CHECK: return %[[V]] : memref<?xi64>
2873ae98fd2SAart Bikfunc.func @sparse_indices_dcsr(%arg0: tensor<?x?xf64, #DCSR>) -> memref<?xi64> {
28884cd51bbSwren romano  %0 = sparse_tensor.coordinates %arg0 { level = 1 : index } : tensor<?x?xf64, #DCSR> to memref<?xi64>
2893ae98fd2SAart Bik  return %0 : memref<?xi64>
2903ae98fd2SAart Bik}
2913ae98fd2SAart Bik
292edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_values_dcsr(
293988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*0]]: memref<?xi32>,
294988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*1]]: memref<?xi64>,
29570633a8dSAart Bik//  CHECK-SAME: %[[A2:.*2]]: memref<?xi32>,
29670633a8dSAart Bik//  CHECK-SAME: %[[A3:.*3]]: memref<?xi64>,
297988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*4]]: memref<?xf64>,
298988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*5]]: !sparse_tensor.storage_specifier
299*5c511655SAart Bik//       CHECK: %[[S:.*]] = sparse_tensor.storage_specifier.get %[[A5]] val_mem_sz
300*5c511655SAart Bik//       CHECK: %[[V:.*]] = memref.subview %[[A4]][0] [%[[S]]] [1]
301*5c511655SAart Bik//       CHECK: return %[[V]] : memref<?xf64>
3023ae98fd2SAart Bikfunc.func @sparse_values_dcsr(%arg0: tensor<?x?xf64, #DCSR>) -> memref<?xf64> {
3033ae98fd2SAart Bik  %0 = sparse_tensor.values %arg0 : tensor<?x?xf64, #DCSR> to memref<?xf64>
3043ae98fd2SAart Bik  return %0 : memref<?xf64>
3053ae98fd2SAart Bik}
3062ddfacd9SAart Bik
3073fdd85daSbixia1// CHECK-LABEL: func.func @sparse_values_coo(
3083fdd85daSbixia1//  CHECK-SAME: %[[A0:.*0]]: memref<?xindex>,
3093fdd85daSbixia1//  CHECK-SAME: %[[A1:.*1]]: memref<?xindex>,
3103fdd85daSbixia1//  CHECK-SAME: %[[A2:.*2]]: memref<?xindex>,
3113fdd85daSbixia1//  CHECK-SAME: %[[A3:.*3]]: memref<?xindex>,
3123fdd85daSbixia1//  CHECK-SAME: %[[A4:.*4]]: memref<?xf64>,
3133fdd85daSbixia1//  CHECK-SAME: %[[A5:.*5]]: !sparse_tensor.storage_specifier
314*5c511655SAart Bik//       CHECK: %[[S:.*]] = sparse_tensor.storage_specifier.get %[[A5]] val_mem_sz
315*5c511655SAart Bik//       CHECK: %[[V:.*]] = memref.subview %[[A4]][0] [%[[S]]] [1]
316*5c511655SAart Bik//       CHECK: return %[[V]] : memref<?xf64>
3173fdd85daSbixia1func.func @sparse_values_coo(%arg0: tensor<?x?x?xf64, #ccoo>) -> memref<?xf64> {
3183fdd85daSbixia1  %0 = sparse_tensor.values %arg0 : tensor<?x?x?xf64, #ccoo> to memref<?xf64>
3193fdd85daSbixia1  return %0 : memref<?xf64>
3203fdd85daSbixia1}
3213fdd85daSbixia1
3223fdd85daSbixia1// CHECK-LABEL: func.func @sparse_indices_coo(
3233fdd85daSbixia1//  CHECK-SAME: %[[A0:.*0]]: memref<?xindex>,
3243fdd85daSbixia1//  CHECK-SAME: %[[A1:.*1]]: memref<?xindex>,
3253fdd85daSbixia1//  CHECK-SAME: %[[A2:.*2]]: memref<?xindex>,
3263fdd85daSbixia1//  CHECK-SAME: %[[A3:.*3]]: memref<?xindex>,
3273fdd85daSbixia1//  CHECK-SAME: %[[A4:.*4]]: memref<?xf64>,
3283fdd85daSbixia1//  CHECK-SAME: %[[A5:.*5]]: !sparse_tensor.storage_specifier
3293fdd85daSbixia1//       CHECK: %[[C2:.*]] = arith.constant 2 : index
33084cd51bbSwren romano//       CHECK: %[[S0:.*]] = sparse_tensor.storage_specifier.get %[[A5]] crd_mem_sz at 1
33144ff23d5SPeiming Liu//       CHECK: %[[S2:.*]] = arith.divui %[[S0]], %[[C2]] : index
3323fdd85daSbixia1//       CHECK: %[[R1:.*]] = memref.subview %[[A3]][0] {{\[}}%[[S2]]] [2] : memref<?xindex> to memref<?xindex, strided<[2]>>
3333fdd85daSbixia1//       CHECK: %[[R2:.*]] = memref.cast %[[R1]] : memref<?xindex, strided<[2]>> to memref<?xindex, strided<[?], offset: ?>>
3343fdd85daSbixia1//       CHECK: return %[[R2]] : memref<?xindex, strided<[?], offset: ?>>
3353fdd85daSbixia1func.func @sparse_indices_coo(%arg0: tensor<?x?x?xf64, #ccoo>) -> memref<?xindex, strided<[?], offset: ?>> {
33684cd51bbSwren romano  %0 = sparse_tensor.coordinates  %arg0 { level = 1 : index } : tensor<?x?x?xf64, #ccoo> to memref<?xindex, strided<[?], offset: ?>>
3373fdd85daSbixia1  return %0 : memref<?xindex, strided<[?], offset: ?>>
3383fdd85daSbixia1}
3393fdd85daSbixia1
34081e3079dSbixia1// CHECK-LABEL: func.func @sparse_indices_buffer_coo(
34181e3079dSbixia1//  CHECK-SAME: %[[A0:.*0]]: memref<?xindex>,
34281e3079dSbixia1//  CHECK-SAME: %[[A1:.*1]]: memref<?xindex>,
34381e3079dSbixia1//  CHECK-SAME: %[[A2:.*2]]: memref<?xindex>,
34481e3079dSbixia1//  CHECK-SAME: %[[A3:.*3]]: memref<?xindex>,
34581e3079dSbixia1//  CHECK-SAME: %[[A4:.*4]]: memref<?xf64>,
34681e3079dSbixia1//  CHECK-SAME: %[[A5:.*5]]: !sparse_tensor.storage_specifier
347*5c511655SAart Bik//       CHECK: %[[S:.*]] = sparse_tensor.storage_specifier.get %[[A5]] crd_mem_sz at 1
348*5c511655SAart Bik//       CHECK: %[[V:.*]] = memref.subview %[[A3]][0] [%[[S]]] [1]
349*5c511655SAart Bik//       CHECK: return %[[V]] : memref<?xindex>
35081e3079dSbixia1func.func @sparse_indices_buffer_coo(%arg0: tensor<?x?x?xf64, #ccoo>) -> memref<?xindex> {
35184cd51bbSwren romano  %0 = sparse_tensor.coordinates_buffer  %arg0 : tensor<?x?x?xf64, #ccoo> to memref<?xindex>
35281e3079dSbixia1  return %0 : memref<?xindex>
35381e3079dSbixia1}
35481e3079dSbixia1
3550f3e4d1aSAart Bik// CHECK-LABEL: func @sparse_noe(
356988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xi32>,
357988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: memref<?xi64>,
358988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*]]: memref<?xf64>,
359988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: !sparse_tensor.storage_specifier
36044ff23d5SPeiming Liu//       CHECK: %[[NOE:.*]] = sparse_tensor.storage_specifier.get %[[A3]] val_mem_sz
3610f3e4d1aSAart Bik//       CHECK: return %[[NOE]] : index
3620f3e4d1aSAart Bikfunc.func @sparse_noe(%arg0: tensor<128xf64, #SparseVector>) -> index {
3630f3e4d1aSAart Bik  %0 = sparse_tensor.number_of_entries %arg0 : tensor<128xf64, #SparseVector>
3640f3e4d1aSAart Bik  return %0 : index
3650f3e4d1aSAart Bik}
3660f3e4d1aSAart Bik
367edca72f5SPeiming Liu// CHECK-LABEL: func @sparse_dealloc_csr(
368988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*]]: memref<?xi32>,
369988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: memref<?xi64>,
370988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*]]: memref<?xf64>,
371988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: !sparse_tensor.storage_specifier
372988733c6SPeiming Liu//       CHECK: memref.dealloc %[[A0]] : memref<?xi32>
373988733c6SPeiming Liu//       CHECK: memref.dealloc %[[A1]] : memref<?xi64>
374988733c6SPeiming Liu//       CHECK: memref.dealloc %[[A2]] : memref<?xf64>
375edca72f5SPeiming Liu//       CHECK: return
3762ddfacd9SAart Bikfunc.func @sparse_dealloc_csr(%arg0: tensor<?x?xf64, #CSR>) {
3772ddfacd9SAart Bik  bufferization.dealloc_tensor %arg0 : tensor<?x?xf64, #CSR>
3782ddfacd9SAart Bik  return
3792ddfacd9SAart Bik}
3800c7abd39SAart Bik
381988733c6SPeiming Liu// CHECK-LABEL:   func.func @sparse_alloc_csc(
382988733c6SPeiming Liu//  CHECK-SAME:     %[[A0:.*]]: index) -> (memref<?xindex>, memref<?xindex>, memref<?xf64>, !sparse_tensor.storage_specifier
38344ff23d5SPeiming Liu//   CHECK-DAG:     %[[A1:.*]] = arith.constant 10 : index
38444ff23d5SPeiming Liu//   CHECK-DAG:     %[[A2:.*]] = arith.constant 0 : index
385988733c6SPeiming Liu//       CHECK:     %[[A3:.*]] = memref.alloc() : memref<16xindex>
386988733c6SPeiming Liu//       CHECK:     %[[A4:.*]] = memref.cast %[[A3]] : memref<16xindex> to memref<?xindex>
387988733c6SPeiming Liu//       CHECK:     %[[A5:.*]] = memref.alloc() : memref<16xindex>
388988733c6SPeiming Liu//       CHECK:     %[[A6:.*]] = memref.cast %[[A5]] : memref<16xindex> to memref<?xindex>
389988733c6SPeiming Liu//       CHECK:     %[[A7:.*]] = memref.alloc() : memref<16xf64>
390988733c6SPeiming Liu//       CHECK:     %[[A8:.*]] = memref.cast %[[A7]] : memref<16xf64> to memref<?xf64>
391988733c6SPeiming Liu//       CHECK:     %[[A9:.*]] = sparse_tensor.storage_specifier.init : !sparse_tensor.storage_specifier
39284cd51bbSwren romano//       CHECK:     %[[A11:.*]] = sparse_tensor.storage_specifier.set %[[A9]]  lvl_sz at 0 with %[[A0]] : !sparse_tensor.storage_specifier
39384cd51bbSwren romano//       CHECK:     %[[A12:.*]] = sparse_tensor.storage_specifier.set %[[A11]]  lvl_sz at 1 with %[[A1]] : !sparse_tensor.storage_specifier
39484cd51bbSwren romano//       CHECK:     %[[A14:.*]] = sparse_tensor.storage_specifier.get %[[A12]]  pos_mem_sz at 1 : !sparse_tensor.storage_specifier
39544ff23d5SPeiming Liu//       CHECK:     %[[A15:.*]], %[[A17:.*]] = sparse_tensor.push_back %[[A14]], %[[A4]], %[[A2]] : index, memref<?xindex>, index
39684cd51bbSwren romano//       CHECK:     %[[A18:.*]] = sparse_tensor.storage_specifier.set %[[A12]]  pos_mem_sz at 1 with %[[A17]] : !sparse_tensor.storage_specifier
39744ff23d5SPeiming Liu//       CHECK:     %[[A23:.*]], %[[A25:.*]] = sparse_tensor.push_back %[[A17]], %[[A15]], %[[A2]], %[[A0]] : index, memref<?xindex>, index, index
39884cd51bbSwren romano//       CHECK:     %[[A26:.*]] = sparse_tensor.storage_specifier.set %[[A18]]  pos_mem_sz at 1 with %[[A25]] : !sparse_tensor.storage_specifier
399988733c6SPeiming Liu//       CHECK:     return %[[A23]], %[[A6]], %[[A8]], %[[A26]] : memref<?xindex>, memref<?xindex>, memref<?xf64>, !sparse_tensor.storage_specifier
4000c7abd39SAart Bikfunc.func @sparse_alloc_csc(%arg0: index) -> tensor<10x?xf64, #CSC> {
4013e4a8c2cSAart Bik  %0 = tensor.empty(%arg0) : tensor<10x?xf64, #CSC>
4020c7abd39SAart Bik  %1 = sparse_tensor.load %0 : tensor<10x?xf64, #CSC>
4030c7abd39SAart Bik  return %1 : tensor<10x?xf64, #CSC>
4040c7abd39SAart Bik}
4050c7abd39SAart Bik
406988733c6SPeiming Liu// CHECK-LABEL:   func.func @sparse_alloc_3d() -> (memref<?xf64>, !sparse_tensor.storage_specifier
40744ff23d5SPeiming Liu//   CHECK-DAG:     %[[A0:.*]] = arith.constant 6000 : index
40844ff23d5SPeiming Liu//   CHECK-DAG:     %[[A1:.*]] = arith.constant 20 : index
40944ff23d5SPeiming Liu//   CHECK-DAG:     %[[A2:.*]] = arith.constant 10 : index
41044ff23d5SPeiming Liu//   CHECK-DAG:     %[[A3:.*]] = arith.constant 30 : index
41144ff23d5SPeiming Liu//   CHECK-DAG:     %[[A4:.*]] = arith.constant 0.000000e+00 : f64
412b78b5473Sbixia1//       CHECK:     %[[A5:.*]] = memref.alloc() : memref<6000xf64>
413b78b5473Sbixia1//       CHECK:     %[[A6:.*]] = memref.cast %[[A5]] : memref<6000xf64> to memref<?xf64>
414988733c6SPeiming Liu//       CHECK:     %[[A7:.*]] = sparse_tensor.storage_specifier.init : !sparse_tensor.storage_specifier
41584cd51bbSwren romano//       CHECK:     %[[A8:.*]] = sparse_tensor.storage_specifier.set %[[A7]]  lvl_sz at 0 with %[[A3]] : !sparse_tensor.storage_specifier
41684cd51bbSwren romano//       CHECK:     %[[A9:.*]] = sparse_tensor.storage_specifier.set %[[A8]]  lvl_sz at 1 with %[[A2]] : !sparse_tensor.storage_specifier
41784cd51bbSwren romano//       CHECK:     %[[A10:.*]] = sparse_tensor.storage_specifier.set %[[A9]]  lvl_sz at 2 with %[[A1]] : !sparse_tensor.storage_specifier
41844ff23d5SPeiming Liu//       CHECK:     %[[A12:.*]] = sparse_tensor.storage_specifier.get %[[A10]]  val_mem_sz : !sparse_tensor.storage_specifier
41944ff23d5SPeiming Liu//       CHECK:     %[[A15:.*]], %[[A14:.*]] = sparse_tensor.push_back %[[A12]], %[[A6]], %[[A4]], %[[A0]] : index, memref<?xf64>, f64, index
42044ff23d5SPeiming Liu//       CHECK:     %[[A16:.*]] = sparse_tensor.storage_specifier.set %[[A10]]  val_mem_sz with %[[A14]] : !sparse_tensor.storage_specifier
42144ff23d5SPeiming Liu//       CHECK:     return %[[A15]], %[[A16]] : memref<?xf64>, !sparse_tensor.storage_specifier
4220c7abd39SAart Bikfunc.func @sparse_alloc_3d() -> tensor<10x20x30xf64, #Dense3D> {
4233e4a8c2cSAart Bik  %0 = tensor.empty() : tensor<10x20x30xf64, #Dense3D>
4240c7abd39SAart Bik  %1 = sparse_tensor.load %0 : tensor<10x20x30xf64, #Dense3D>
4250c7abd39SAart Bik  return %1 : tensor<10x20x30xf64, #Dense3D>
4260c7abd39SAart Bik}
4278a583bd5Sbixia1
4288a583bd5Sbixia1// CHECK-LABEL: func.func @sparse_expansion1()
4298a583bd5Sbixia1//       CHECK: %[[A:.*]] = memref.alloc() : memref<8xf64>
4308a583bd5Sbixia1//       CHECK: %[[B:.*]] = memref.alloc() : memref<8xi1>
4318a583bd5Sbixia1//       CHECK: %[[C:.*]] = memref.alloc() : memref<8xindex>
4328a583bd5Sbixia1//       CHECK: %[[D:.*]] = memref.cast %[[C]] : memref<8xindex> to memref<?xindex>
4338a583bd5Sbixia1//   CHECK-DAG: linalg.fill ins(%{{.*}}  : f64) outs(%[[A]] : memref<8xf64>)
4348a583bd5Sbixia1//   CHECK-DAG: linalg.fill ins(%{{.*}}  : i1) outs(%[[B]] : memref<8xi1>)
4358a583bd5Sbixia1//       CHECK: return %[[D]] : memref<?xindex>
4368a583bd5Sbixia1func.func @sparse_expansion1() -> memref<?xindex> {
4373e4a8c2cSAart Bik  %0 = tensor.empty() : tensor<4x8xf64, #CSR>
4388a583bd5Sbixia1  %values, %filled, %added, %count = sparse_tensor.expand %0
439a3610359SAart Bik    : tensor<4x8xf64, #CSR> to memref<?xf64>, memref<?xi1>, memref<?xindex>
4408a583bd5Sbixia1  return %added : memref<?xindex>
4418a583bd5Sbixia1}
4428a583bd5Sbixia1
4438a583bd5Sbixia1// CHECK-LABEL: func.func @sparse_expansion2()
4448a583bd5Sbixia1//       CHECK: %[[A:.*]] = memref.alloc() : memref<4xf64>
4458a583bd5Sbixia1//       CHECK: %[[B:.*]] = memref.alloc() : memref<4xi1>
4468a583bd5Sbixia1//       CHECK: %[[C:.*]] = memref.alloc() : memref<4xindex>
4478a583bd5Sbixia1//       CHECK: %[[D:.*]] = memref.cast %[[C]] : memref<4xindex> to memref<?xindex>
4488a583bd5Sbixia1//   CHECK-DAG: linalg.fill ins(%{{.*}}  : f64) outs(%[[A]] : memref<4xf64>)
4498a583bd5Sbixia1//   CHECK-DAG: linalg.fill ins(%{{.*}}  : i1) outs(%[[B]] : memref<4xi1>)
4508a583bd5Sbixia1//       CHECK: return %[[D]] : memref<?xindex>
4518a583bd5Sbixia1func.func @sparse_expansion2() -> memref<?xindex> {
4523e4a8c2cSAart Bik  %0 = tensor.empty() : tensor<4x8xf64, #CSC>
4538a583bd5Sbixia1  %values, %filled, %added, %count = sparse_tensor.expand %0
454a3610359SAart Bik    : tensor<4x8xf64, #CSC> to memref<?xf64>, memref<?xi1>, memref<?xindex>
4558a583bd5Sbixia1  return %added : memref<?xindex>
4568a583bd5Sbixia1}
4578a583bd5Sbixia1
4588a583bd5Sbixia1// CHECK-LABEL: func.func @sparse_expansion3(
4598a583bd5Sbixia1//  CHECK-SAME: %[[D0:.*]]: index,
4608a583bd5Sbixia1//  CHECK-SAME: %{{.*}}: index) -> memref<?xindex> {
461988733c6SPeiming Liu//       CHECK: %[[V:.*]] = memref.alloc(%[[D0]]) : memref<?xf64>
462988733c6SPeiming Liu//       CHECK: %[[B:.*]] = memref.alloc(%[[D0]]) : memref<?xi1>
463988733c6SPeiming Liu//       CHECK: %[[D:.*]] = memref.alloc(%[[D0]]) : memref<?xindex>
4648a583bd5Sbixia1//       CHECK: linalg.fill ins(%{{.*}} : f64) outs(%[[V]] : memref<?xf64>)
4658a583bd5Sbixia1//       CHECK: linalg.fill ins(%{{.*}} : i1) outs(%[[B]] : memref<?xi1>)
4668a583bd5Sbixia1//       CHECK: return %[[D]] : memref<?xindex>
4678a583bd5Sbixia1func.func @sparse_expansion3(%arg0: index, %arg1: index) -> memref<?xindex> {
4683e4a8c2cSAart Bik  %0 = tensor.empty(%arg0, %arg1) : tensor<?x?xf64, #CSC>
4698a583bd5Sbixia1  %values, %filled, %added, %count = sparse_tensor.expand %0
470a3610359SAart Bik    : tensor<?x?xf64, #CSC> to memref<?xf64>, memref<?xi1>, memref<?xindex>
4718a583bd5Sbixia1  return %added : memref<?xindex>
4728a583bd5Sbixia1}
4733986c869SAart Bik
474840e2ba3Sbixia1// CHECK-LABEL: func.func private @_insert_compressed_100_f64_0_0(
475988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*0]]: memref<?xindex>,
476988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*1]]: memref<?xindex>,
477988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*2]]: memref<?xf64>,
478988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*3]]: !sparse_tensor.storage_specifier
479988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*4]]: index,
480988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*5]]: f64)
4812aceaddaSbixia1//
482988733c6SPeiming Liu// CHECK-LABEL: func.func @sparse_compression_1d(
483988733c6SPeiming Liu//  CHECK-SAME: %[[A0:.*0]]: memref<?xindex>,
484988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*1]]: memref<?xindex>,
485988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*2]]: memref<?xf64>,
486988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*3]]: !sparse_tensor.storage_specifier
48770633a8dSAart Bik//  CHECK-SAME: %[[A4:.*4]]: memref<?xf64>,
488988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*5]]: memref<?xi1>,
489988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*6]]: memref<?xindex>,
490988733c6SPeiming Liu//  CHECK-SAME: %[[A7:.*7]]: index) -> (memref<?xindex>, memref<?xindex>, memref<?xf64>, !sparse_tensor.storage_specifier
491988733c6SPeiming Liu//   CHECK-DAG: %[[A8:.*]] = arith.constant false
492988733c6SPeiming Liu//   CHECK-DAG: %[[A9:.*]] = arith.constant 0.000000e+00 : f64
493988733c6SPeiming Liu//   CHECK-DAG: %[[A10:.*]] = arith.constant 1 : index
494988733c6SPeiming Liu//   CHECK-DAG: %[[A11:.*]] = arith.constant 0 : index
4950083f833SPeiming Liu//       CHECK: sparse_tensor.sort hybrid_quick_sort %[[A7]], %[[A6]]
496988733c6SPeiming Liu//       CHECK: %[[A12:.*]]:4 = scf.for %[[A13:.*]] = %[[A11]] to %[[A7]] step %[[A10]] iter_args(%[[A14:.*]] = %[[A0]], %[[A15:.*]] = %[[A1]], %[[A16:.*]] = %[[A2]], %[[A17:.*]] = %[[A3]])
497988733c6SPeiming Liu//       CHECK:   %[[A18:.*]] = memref.load %[[A6]]{{\[}}%[[A13]]] : memref<?xindex>
498988733c6SPeiming Liu//       CHECK:   %[[A19:.*]] = memref.load %[[A4]]{{\[}}%[[A18]]] : memref<?xf64>
499840e2ba3Sbixia1//       CHECK:   %[[A20:.*]]:4 = func.call @_insert_compressed_100_f64_0_0(%[[A14]], %[[A15]], %[[A16]], %[[A17]], %[[A18]], %[[A19]])
500988733c6SPeiming Liu//       CHECK:   memref.store %[[A9]], %[[A4]]{{\[}}%[[A18]]] : memref<?xf64>
501988733c6SPeiming Liu//       CHECK:   memref.store %[[A8]], %[[A5]]{{\[}}%[[A18]]] : memref<?xi1>
502988733c6SPeiming Liu//       CHECK:   scf.yield %[[A20]]#0, %[[A20]]#1, %[[A20]]#2, %[[A20]]#3
503d22df0ebSAart Bik//       CHECK: }
504988733c6SPeiming Liu//       CHECK: memref.dealloc %[[A4]] : memref<?xf64>
505988733c6SPeiming Liu//       CHECK: memref.dealloc %[[A5]] : memref<?xi1>
506988733c6SPeiming Liu//       CHECK: memref.dealloc %[[A6]] : memref<?xindex>
507988733c6SPeiming Liu//       CHECK: return %[[A21:.*]]#0, %[[A21]]#1, %[[A21]]#2, %[[A21]]#3 : memref<?xindex>, memref<?xindex>, memref<?xf64>, !sparse_tensor.storage_specifier
508d22df0ebSAart Bikfunc.func @sparse_compression_1d(%tensor: tensor<100xf64, #SV>,
509d22df0ebSAart Bik                                 %values: memref<?xf64>,
510d22df0ebSAart Bik                                 %filled: memref<?xi1>,
511d22df0ebSAart Bik                                 %added: memref<?xindex>,
512d22df0ebSAart Bik                                 %count: index) -> tensor<100xf64, #SV> {
513d22df0ebSAart Bik  %0 = sparse_tensor.compress %values, %filled, %added, %count into %tensor[]
514d22df0ebSAart Bik    : memref<?xf64>, memref<?xi1>, memref<?xindex>, tensor<100xf64, #SV>
515d22df0ebSAart Bik  %1 = sparse_tensor.load %0 hasInserts : tensor<100xf64, #SV>
516d22df0ebSAart Bik  return %1 : tensor<100xf64, #SV>
517d22df0ebSAart Bik}
518d22df0ebSAart Bik
519840e2ba3Sbixia1// CHECK-LABEL: func.func private @_insert_dense_compressed_8_8_f64_64_32(
520988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*0]]: memref<?xi32>,
521988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*1]]: memref<?xi64>,
522988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*2]]: memref<?xf64>,
523988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*3]]: !sparse_tensor.storage_specifier
524988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*4]]: index,
525988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*5]]: index,
526988733c6SPeiming Liu//  CHECK-SAME: %[[A7:.*6]]: f64)
5272aceaddaSbixia1//
528988733c6SPeiming Liu// CHECK-LABEL:   func.func @sparse_compression(
529988733c6SPeiming Liu//  CHECK-SAME:     %[[A0:.*0]]: memref<?xi32>,
530988733c6SPeiming Liu//  CHECK-SAME:     %[[A1:.*1]]: memref<?xi64>,
531988733c6SPeiming Liu//  CHECK-SAME:     %[[A2:.*2]]: memref<?xf64>,
532988733c6SPeiming Liu//  CHECK-SAME:     %[[A3:.*3]]: !sparse_tensor.storage_specifier
53370633a8dSAart Bik//  CHECK-SAME:     %[[A4:.*4]]: memref<?xf64>,
534988733c6SPeiming Liu//  CHECK-SAME:     %[[A5:.*5]]: memref<?xi1>,
535988733c6SPeiming Liu//  CHECK-SAME:     %[[A6:.*6]]: memref<?xindex>,
536988733c6SPeiming Liu//  CHECK-SAME:     %[[A7:.*7]]: index,
537988733c6SPeiming Liu//  CHECK-SAME:     %[[A8:.*8]]: index) -> (memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
538988733c6SPeiming Liu//       CHECK:     %[[A9:.*]] = arith.constant 0 : i32
539988733c6SPeiming Liu//       CHECK:     %[[A10:.*]] = arith.constant false
540988733c6SPeiming Liu//       CHECK:     %[[A11:.*]] = arith.constant 0.000000e+00 : f64
541988733c6SPeiming Liu//       CHECK:     %[[A12:.*]] = arith.constant 1 : index
542988733c6SPeiming Liu//       CHECK:     %[[A13:.*]] = arith.constant 0 : index
5430083f833SPeiming Liu//       CHECK:     sparse_tensor.sort hybrid_quick_sort %[[A7]], %[[A6]]
544988733c6SPeiming Liu//       CHECK:     %[[A14:.*]]:4 = scf.for %[[A15:.*]] = %[[A13]] to %[[A7]] step %[[A12]] iter_args(%[[A16:.*]] = %[[A0]], %[[A17:.*]] = %[[A1]], %[[A18:.*]] = %[[A2]], %[[A19:.*]] = %[[A3]]) -> (memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
545988733c6SPeiming Liu//       CHECK:       %[[A20:.*]] = memref.load %[[A6]]{{\[}}%[[A15]]] : memref<?xindex>
546988733c6SPeiming Liu//       CHECK:       %[[A21:.*]] = memref.load %[[A4]]{{\[}}%[[A20]]] : memref<?xf64>
547840e2ba3Sbixia1//       CHECK:       %[[A22:.*]]:4 = func.call @_insert_dense_compressed_8_8_f64_64_32(%[[A16]], %[[A17]], %[[A18]], %[[A19]], %[[A8]], %[[A20]], %[[A21]]) : (memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
548988733c6SPeiming Liu//       CHECK:       memref.store %[[A11]], %[[A4]]{{\[}}%[[A20]]] : memref<?xf64>
549988733c6SPeiming Liu//       CHECK:       memref.store %[[A10]], %[[A5]]{{\[}}%[[A20]]] : memref<?xi1>
550988733c6SPeiming Liu//       CHECK:       scf.yield %[[A22]]#0, %[[A22]]#1, %[[A22]]#2, %[[A22]]#3 : memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
55170633a8dSAart Bik//       CHECK:     }
552988733c6SPeiming Liu//       CHECK:     memref.dealloc %[[A4]] : memref<?xf64>
553988733c6SPeiming Liu//       CHECK:     memref.dealloc %[[A5]] : memref<?xi1>
554988733c6SPeiming Liu//       CHECK:     memref.dealloc %[[A6]] : memref<?xindex>
55584cd51bbSwren romano//       CHECK:     %[[A25:.*]] = sparse_tensor.storage_specifier.get %[[A24:.*]]#3  pos_mem_sz at 1 : !sparse_tensor.storage_specifier
556988733c6SPeiming Liu//       CHECK:     %[[A26:.*]] = memref.load %[[A24]]#0{{\[}}%[[A13]]] : memref<?xi32>
557988733c6SPeiming Liu//       CHECK:     %[[A27:.*]] = scf.for %[[A28:.*]] = %[[A12]] to %[[A25]] step %[[A12]] iter_args(%[[A29:.*]] = %[[A26]]) -> (i32) {
558988733c6SPeiming Liu//       CHECK:       %[[A30:.*]] = memref.load %[[A24]]#0{{\[}}%[[A28]]] : memref<?xi32>
559988733c6SPeiming Liu//       CHECK:       %[[A31:.*]] = arith.cmpi eq, %[[A30]], %[[A9]] : i32
560988733c6SPeiming Liu//       CHECK:       %[[A32:.*]] = arith.select %[[A31]], %[[A29]], %[[A30]] : i32
561988733c6SPeiming Liu//       CHECK:       scf.if %[[A31]] {
562988733c6SPeiming Liu//       CHECK:         memref.store %[[A29]], %[[A24]]#0{{\[}}%[[A28]]] : memref<?xi32>
563988733c6SPeiming Liu//       CHECK:       }
564988733c6SPeiming Liu//       CHECK:       scf.yield %[[A32]] : i32
565988733c6SPeiming Liu//       CHECK:     }
566988733c6SPeiming Liu//       CHECK:     return %[[A24]]#0, %[[A24]]#1, %[[A24]]#2, %[[A24]]#3 : memref<?xi32>, memref<?xi64>, memref<?xf64>, !sparse_tensor.storage_specifier
567a3610359SAart Bikfunc.func @sparse_compression(%tensor: tensor<8x8xf64, #CSR>,
568a3610359SAart Bik                              %values: memref<?xf64>,
569a3610359SAart Bik                              %filled: memref<?xi1>,
570a3610359SAart Bik                              %added: memref<?xindex>,
571a3610359SAart Bik                              %count: index,
5729f596a7cSAart Bik                              %i: index) -> tensor<8x8xf64, #CSR> {
5739f596a7cSAart Bik  %0 = sparse_tensor.compress %values, %filled, %added, %count into %tensor[%i]
574a3610359SAart Bik    : memref<?xf64>, memref<?xi1>, memref<?xindex>, tensor<8x8xf64, #CSR>
575d22df0ebSAart Bik  %1 = sparse_tensor.load %0 hasInserts : tensor<8x8xf64, #CSR>
576d22df0ebSAart Bik  return %1 : tensor<8x8xf64, #CSR>
5773986c869SAart Bik}
5784132bce9Sbixia1
5796280e231SYinying Li// CHECK-LABEL: func.func private @_insert_dense_compressed_nonordered_8_8_f64_0_0(
580988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*0]]: memref<?xindex>,
581988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*1]]: memref<?xindex>,
582988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*2]]: memref<?xf64>,
583988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*3]]: !sparse_tensor.storage_specifier
584988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*4]]: index,
585988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*5]]: index,
586988733c6SPeiming Liu//  CHECK-SAME: %[[A7:.*6]]: f64)
5872aceaddaSbixia1//
588988733c6SPeiming Liu// CHECK-LABEL:   func.func @sparse_compression_unordered(
589988733c6SPeiming Liu//  CHECK-SAME:     %[[A0:.*0]]: memref<?xindex>,
590988733c6SPeiming Liu//  CHECK-SAME:     %[[A1:.*1]]: memref<?xindex>,
591988733c6SPeiming Liu//  CHECK-SAME:     %[[A2:.*2]]: memref<?xf64>,
592988733c6SPeiming Liu//  CHECK-SAME:     %[[A3:.*3]]: !sparse_tensor.storage_specifier
59370633a8dSAart Bik//  CHECK-SAME:     %[[A4:.*4]]: memref<?xf64>,
594988733c6SPeiming Liu//  CHECK-SAME:     %[[A5:.*5]]: memref<?xi1>,
595988733c6SPeiming Liu//  CHECK-SAME:     %[[A6:.*6]]: memref<?xindex>,
596988733c6SPeiming Liu//  CHECK-SAME:     %[[A7:.*7]]: index,
597988733c6SPeiming Liu//  CHECK-SAME:     %[[A8:.*8]]: index) -> (memref<?xindex>, memref<?xindex>, memref<?xf64>, !sparse_tensor.storage_specifier
598988733c6SPeiming Liu//       CHECK:     %[[A9:.*]] = arith.constant false
599988733c6SPeiming Liu//       CHECK:     %[[A10:.*]] = arith.constant 0.000000e+00 : f64
600988733c6SPeiming Liu//       CHECK:     %[[A11:.*]] = arith.constant 0 : index
601988733c6SPeiming Liu//       CHECK:     %[[A12:.*]] = arith.constant 1 : index
602988733c6SPeiming Liu//       CHECK:     %[[A13:.*]]:4 = scf.for %[[A14:.*]] = %[[A11]] to %[[A7]] step %[[A12]] iter_args(%[[A15:.*]] = %[[A0]], %[[A16:.*]] = %[[A1]], %[[A17:.*]] = %[[A2]], %[[A18:.*]] = %[[A3]]) -> (memref<?xindex>, memref<?xindex>, memref<?xf64>, !sparse_tensor.storage_specifier
603988733c6SPeiming Liu//       CHECK:       %[[A19:.*]] = memref.load %[[A6]]{{\[}}%[[A14]]] : memref<?xindex>
604988733c6SPeiming Liu//       CHECK:       %[[A20:.*]] = memref.load %[[A4]]{{\[}}%[[A19]]] : memref<?xf64>
6056280e231SYinying Li//       CHECK:       %[[A21:.*]]:4 = func.call @_insert_dense_compressed_nonordered_8_8_f64_0_0(%[[A15]], %[[A16]], %[[A17]], %[[A18]], %[[A8]], %[[A19]], %[[A20]]) : (memref<?xindex>, memref<?xindex>, memref<?xf64>, !sparse_tensor.storage_specifier
606988733c6SPeiming Liu//       CHECK:       memref.store %[[A10]], %[[A4]]{{\[}}%[[A19]]] : memref<?xf64>
607988733c6SPeiming Liu//       CHECK:       memref.store %[[A9]], %[[A5]]{{\[}}%[[A19]]] : memref<?xi1>
608988733c6SPeiming Liu//       CHECK:       scf.yield %[[A21]]#0, %[[A21]]#1, %[[A21]]#2, %[[A21]]#3 : memref<?xindex>, memref<?xindex>, memref<?xf64>, !sparse_tensor.storage_specifier
60970633a8dSAart Bik//       CHECK:     }
610988733c6SPeiming Liu//       CHECK:     memref.dealloc %[[A4]] : memref<?xf64>
611988733c6SPeiming Liu//       CHECK:     memref.dealloc %[[A5]] : memref<?xi1>
612988733c6SPeiming Liu//       CHECK:     memref.dealloc %[[A6]] : memref<?xindex>
61384cd51bbSwren romano//       CHECK:     %[[A24:.*]] = sparse_tensor.storage_specifier.get %[[A23:.*]]#3  pos_mem_sz at 1 : !sparse_tensor.storage_specifier
614988733c6SPeiming Liu//       CHECK:     %[[A25:.*]] = memref.load %[[A23]]#0{{\[}}%[[A11]]] : memref<?xindex>
615988733c6SPeiming Liu//       CHECK:     %[[A26:.*]] = scf.for %[[A27:.*]] = %[[A12]] to %[[A24]] step %[[A12]] iter_args(%[[A28:.*]] = %[[A25]]) -> (index) {
616988733c6SPeiming Liu//       CHECK:       %[[A29:.*]] = memref.load %[[A23]]#0{{\[}}%[[A27]]] : memref<?xindex>
617988733c6SPeiming Liu//       CHECK:       %[[A30:.*]] = arith.cmpi eq, %[[A29]], %[[A11]] : index
618988733c6SPeiming Liu//       CHECK:       %[[A31:.*]] = arith.select %[[A30]], %[[A28]], %[[A29]] : index
619988733c6SPeiming Liu//       CHECK:       scf.if %[[A30]] {
620988733c6SPeiming Liu//       CHECK:         memref.store %[[A28]], %[[A23]]#0{{\[}}%[[A27]]] : memref<?xindex>
621988733c6SPeiming Liu//       CHECK:       }
622988733c6SPeiming Liu//       CHECK:       scf.yield %[[A31]] : index
623988733c6SPeiming Liu//       CHECK:     }
624988733c6SPeiming Liu//       CHECK:     return %[[A23]]#0, %[[A23]]#1, %[[A23]]#2, %[[A23]]#3 : memref<?xindex>, memref<?xindex>, memref<?xf64>, !sparse_tensor.storage_specifier
6254d068619SAart Bikfunc.func @sparse_compression_unordered(%tensor: tensor<8x8xf64, #UCSR>,
6264d068619SAart Bik                                        %values: memref<?xf64>,
6274d068619SAart Bik                                        %filled: memref<?xi1>,
6284d068619SAart Bik                                        %added: memref<?xindex>,
6294d068619SAart Bik                                        %count: index,
6309f596a7cSAart Bik                                        %i: index) -> tensor<8x8xf64, #UCSR> {
6319f596a7cSAart Bik  %0 = sparse_tensor.compress %values, %filled, %added, %count into %tensor[%i]
6324d068619SAart Bik    : memref<?xf64>, memref<?xi1>, memref<?xindex>, tensor<8x8xf64, #UCSR>
633d22df0ebSAart Bik  %1 = sparse_tensor.load %0 hasInserts : tensor<8x8xf64, #UCSR>
634d22df0ebSAart Bik  return %1 : tensor<8x8xf64, #UCSR>
6359f596a7cSAart Bik}
6369f596a7cSAart Bik
637840e2ba3Sbixia1// CHECK-LABEL: func.func private @_insert_compressed_128_f64_0_0(
638988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*0]]: memref<?xindex>,
639988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*1]]: memref<?xindex>,
640988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*2]]: memref<?xf64>,
641988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*3]]: !sparse_tensor.storage_specifier
642988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*4]]: index,
643988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*5]]: f64)
644988733c6SPeiming Liu//
645988733c6SPeiming Liu// CHECK-LABEL: func @sparse_insert(
646988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*0]]: memref<?xindex>,
647988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*1]]: memref<?xindex>,
648988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*2]]: memref<?xf64>,
649988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*3]]: !sparse_tensor.storage_specifier
650988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*4]]: index,
651988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*5]]: f64)
652840e2ba3Sbixia1//       CHECK: %[[R:.*]]:4 = call @_insert_compressed_128_f64_0_0(%[[A1]], %[[A2]], %[[A3]], %[[A4]], %[[A5]], %[[A6]])
653988733c6SPeiming Liu//       CHECK: return %[[R]]#0, %[[R]]#1, %[[R]]#2, %[[R]]#3
6549f596a7cSAart Bikfunc.func @sparse_insert(%arg0: tensor<128xf64, #SV>, %arg1: index, %arg2: f64) -> tensor<128xf64, #SV> {
65594e27c26SPeiming Liu  %0 = tensor.insert %arg2 into %arg0[%arg1] : tensor<128xf64, #SV>
6569f596a7cSAart Bik  %1 = sparse_tensor.load %0 hasInserts : tensor<128xf64, #SV>
6579f596a7cSAart Bik  return %1 : tensor<128xf64, #SV>
6584d068619SAart Bik}
659d22df0ebSAart Bik
660840e2ba3Sbixia1// CHECK-LABEL: func.func private @_insert_compressed_128_f64_64_32(
661988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: memref<?xi32>,
662988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*]]: memref<?xi64>,
663988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: memref<?xf64>,
664988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*]]: !sparse_tensor.storage_specifier
665988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*]]: index,
666988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*]]: f64)
667988733c6SPeiming Liu//
668988733c6SPeiming Liu// CHECK-LABEL: func @sparse_insert_typed(
669988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: memref<?xi32>,
670988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*]]: memref<?xi64>,
671988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: memref<?xf64>,
672988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*]]: !sparse_tensor.storage_specifier
673988733c6SPeiming Liu//  CHECK-SAME: %[[A5:.*]]: index,
674988733c6SPeiming Liu//  CHECK-SAME: %[[A6:.*]]: f64)
675840e2ba3Sbixia1//       CHECK: %[[R:.*]]:4 = call @_insert_compressed_128_f64_64_32(%[[A1]], %[[A2]], %[[A3]], %[[A4]], %[[A5]], %[[A6]])
676988733c6SPeiming Liu//       CHECK: return %[[R]]#0, %[[R]]#1, %[[R]]#2, %[[R]]#3
677d22df0ebSAart Bikfunc.func @sparse_insert_typed(%arg0: tensor<128xf64, #SparseVector>, %arg1: index, %arg2: f64) -> tensor<128xf64, #SparseVector> {
67894e27c26SPeiming Liu  %0 = tensor.insert %arg2 into %arg0[%arg1] : tensor<128xf64, #SparseVector>
679d22df0ebSAart Bik  %1 = sparse_tensor.load %0 hasInserts : tensor<128xf64, #SparseVector>
680d22df0ebSAart Bik  return %1 : tensor<128xf64, #SparseVector>
681d22df0ebSAart Bik}
68258b449c3Sbixia1
6836280e231SYinying Li// CHECK-LABEL: func.func private @_insert_compressed_nonunique_singleton_5_6_f64_0_0(
6843fdd85daSbixia1//  CHECK-SAME: %[[A1:.*0]]: memref<?xindex>,
6853fdd85daSbixia1//  CHECK-SAME: %[[A2:.*1]]: memref<?xindex>,
6863fdd85daSbixia1//  CHECK-SAME: %[[A3:.*2]]: memref<?xf64>,
6873fdd85daSbixia1//  CHECK-SAME: %[[A4:.*3]]: !sparse_tensor.storage_specifier
6883fdd85daSbixia1//  CHECK-SAME: %[[A5:.*4]]: index,
689840e2ba3Sbixia1//  CHECK-SAME: %[[A5:.*5]]: index,
6903fdd85daSbixia1//  CHECK-SAME: %[[A7:.*6]]: f64)
691840e2ba3Sbixia1//
692840e2ba3Sbixia1// CHECK-LABEL: func.func @sparse_insert_coo(
693840e2ba3Sbixia1//  CHECK-SAME: %[[A0:.*0]]: memref<?xindex>,
694840e2ba3Sbixia1//  CHECK-SAME: %[[A1:.*1]]: memref<?xindex>,
6953fdd85daSbixia1//  CHECK-SAME: %[[A2:.*2]]: memref<?xf64>,
6963fdd85daSbixia1//  CHECK-SAME: %[[A3:.*3]]: !sparse_tensor.storage_specifier
6973fdd85daSbixia1//  CHECK-SAME: %[[A4:.*4]]: index,
6983fdd85daSbixia1//  CHECK-SAME: %[[A5:.*5]]: f64)
6996280e231SYinying Li//       CHECK: %[[R:.*]]:4 = call @_insert_compressed_nonunique_singleton_5_6_f64_0_0(%[[A0]], %[[A1]], %[[A2]], %[[A3]], %[[A4]], %[[A4]], %[[A5]])
7003fdd85daSbixia1//       CHECK: return %[[R]]#0, %[[R]]#1, %[[R]]#2, %[[R]]#3
701840e2ba3Sbixia1func.func @sparse_insert_coo(%arg0: tensor<5x6xf64, #Coo>, %arg1: index, %arg2: f64) -> tensor<5x6xf64, #Coo> {
70294e27c26SPeiming Liu  %0 = tensor.insert %arg2 into %arg0[%arg1, %arg1] : tensor<5x6xf64, #Coo>
703840e2ba3Sbixia1  %1 = sparse_tensor.load %0 hasInserts : tensor<5x6xf64, #Coo>
704840e2ba3Sbixia1  return %1 : tensor<5x6xf64, #Coo>
705840e2ba3Sbixia1}
706840e2ba3Sbixia1
70758b449c3Sbixia1// CHECK-LABEL: func.func @sparse_nop_convert(
708988733c6SPeiming Liu//  CHECK-SAME: %[[A1:.*]]: memref<?xi32>,
709988733c6SPeiming Liu//  CHECK-SAME: %[[A2:.*]]: memref<?xi64>,
710988733c6SPeiming Liu//  CHECK-SAME: %[[A3:.*]]: memref<?xf32>,
711988733c6SPeiming Liu//  CHECK-SAME: %[[A4:.*]]: !sparse_tensor.storage_specifier
712988733c6SPeiming Liu//       CHECK: return  %[[A1]], %[[A2]], %[[A3]], %[[A4]] :
713988733c6SPeiming Liu//  CHECK-SAME:   memref<?xi32>, memref<?xi64>, memref<?xf32>, !sparse_tensor.storage_specifier
7140128f801Sbixia1func.func @sparse_nop_convert(%arg0: tensor<32xf32, #SparseVector>) -> tensor<?xf32, #SparseVector> {
7150128f801Sbixia1  %0 = sparse_tensor.convert %arg0 : tensor<32xf32, #SparseVector> to tensor<?xf32, #SparseVector>
71658b449c3Sbixia1  return %0 : tensor<?xf32, #SparseVector>
71758b449c3Sbixia1}
7182c81d432Sbixia1
7196071f6fdSbixia1// CHECK-LABEL: func.func @sparse_convert_element_type(
7206071f6fdSbixia1//  CHECK-SAME: %[[A1:.*]]: memref<?xi32>,
7216071f6fdSbixia1//  CHECK-SAME: %[[A2:.*]]: memref<?xi64>,
7226071f6fdSbixia1//  CHECK-SAME: %[[A3:.*]]: memref<?xf32>,
7236071f6fdSbixia1//  CHECK-SAME: %[[A4:.*]]: !sparse_tensor.storage_specifier
7246071f6fdSbixia1//       CHECK: scf.for
7256071f6fdSbixia1//       CHECK:   %[[FValue:.*]] = memref.load
7266071f6fdSbixia1//       CHECK:   %[[IValue:.*]] = arith.fptosi %[[FValue]]
7276071f6fdSbixia1//       CHECK:   memref.store %[[IValue]]
7286071f6fdSbixia1//       CHECK: return  %{{.*}}, %{{.*}}, %{{.*}}, %[[A4]] :
7296071f6fdSbixia1//  CHECK-SAME:   memref<?xi32>, memref<?xi64>, memref<?xi32>, !sparse_tensor.storage_specifier
7306071f6fdSbixia1func.func @sparse_convert_element_type(%arg0: tensor<32xf32, #SparseVector>) -> tensor<?xi32, #SparseVector> {
7316071f6fdSbixia1  %0 = sparse_tensor.convert %arg0 : tensor<32xf32, #SparseVector> to tensor<?xi32, #SparseVector>
7326071f6fdSbixia1  return %0 : tensor<?xi32, #SparseVector>
7336071f6fdSbixia1}
7346071f6fdSbixia1
7352c81d432Sbixia1// CHECK-LABEL: func.func @sparse_new_coo(
736c5a67e16SYinying Li// CHECK-SAME:  %[[A0:.*]]: !llvm.ptr) -> (memref<?xindex>, memref<?xindex>, memref<?xf32>, !sparse_tensor.storage_specifier<#sparse{{[0-9]*}}>) {
737d3af6535SAart Bik// CHECK-DAG:   %[[VAL_1:.*]] = arith.constant false
738d3af6535SAart Bik// CHECK-DAG:   %[[VAL_2:.*]] = arith.constant 2 : i32
739d3af6535SAart Bik// CHECK-DAG:   %[[VAL_3:.*]] = arith.constant 1 : index
740d3af6535SAart Bik// CHECK-DAG:   %[[VAL_4:.*]] = arith.constant 0 : index
741d3af6535SAart Bik// CHECK-DAG:   %[[VAL_5:.*]] = arith.constant 2 : index
742d3af6535SAart Bik// CHECK:       %[[VAL_6:.*]] = memref.alloca() : memref<2xindex>
743d3af6535SAart Bik// CHECK:       %[[VAL_7:.*]] = memref.cast %[[VAL_6]] : memref<2xindex> to memref<?xindex>
744d3af6535SAart Bik// CHECK:       memref.store %[[VAL_4]], %[[VAL_6]]{{\[}}%[[VAL_4]]] : memref<2xindex>
745d3af6535SAart Bik// CHECK:       memref.store %[[VAL_4]], %[[VAL_6]]{{\[}}%[[VAL_3]]] : memref<2xindex>
746dcae289dSChristian Ulmann// CHECK:       %[[VAL_8:.*]] = call @createCheckedSparseTensorReader(%[[A0]], %[[VAL_7]], %[[VAL_2]]) : (!llvm.ptr, memref<?xindex>, i32) -> !llvm.ptr
747dcae289dSChristian Ulmann// CHECK:       %[[VAL_9:.*]] = call @getSparseTensorReaderDimSizes(%[[VAL_8]]) : (!llvm.ptr) -> memref<?xindex>
74883cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_10:.*]] = call @getSparseTensorReaderNSE(%[[VAL_8]]) : (!llvm.ptr) -> index
74983cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_11:.*]] = memref.load %[[VAL_9]]{{\[}}%[[VAL_4]]] : memref<?xindex>
75083cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_12:.*]] = memref.load %[[VAL_9]]{{\[}}%[[VAL_3]]] : memref<?xindex>
75183cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_13:.*]] = arith.muli %[[VAL_10]], %[[VAL_5]] : index
75283cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_14:.*]] = memref.alloc() : memref<2xindex>
75383cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_15:.*]] = memref.cast %[[VAL_14]] : memref<2xindex> to memref<?xindex>
75483cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_16:.*]] = memref.alloc(%[[VAL_13]]) : memref<?xindex>
75583cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_17:.*]] = memref.alloc(%[[VAL_10]]) : memref<?xf32>
75683cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_18:.*]] = sparse_tensor.storage_specifier.init
75783cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_19:.*]] = sparse_tensor.storage_specifier.set %[[VAL_18]]  lvl_sz at 0 with %[[VAL_11]]
75883cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_20:.*]] = sparse_tensor.storage_specifier.get %[[VAL_19]]  pos_mem_sz at 0
75983cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_21:.*]], %[[VAL_22:.*]] = sparse_tensor.push_back %[[VAL_20]], %[[VAL_15]], %[[VAL_4]]
76083cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_23:.*]] = sparse_tensor.storage_specifier.set %[[VAL_19]]  pos_mem_sz at 0 with %[[VAL_22]]
76183cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_24:.*]] = sparse_tensor.storage_specifier.set %[[VAL_23]]  lvl_sz at 1 with %[[VAL_12]]
76283cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_25:.*]], %[[VAL_26:.*]] = sparse_tensor.push_back %[[VAL_22]], %[[VAL_21]], %[[VAL_4]], %[[VAL_3]]
76383cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_27:.*]] = sparse_tensor.storage_specifier.set %[[VAL_24]]  pos_mem_sz at 0 with %[[VAL_26]]
76483cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_28:.*]] = memref.alloca() : memref<2xindex>
76583cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_29:.*]] = memref.cast %[[VAL_28]] : memref<2xindex> to memref<?xindex>
76683cf0dc9SAart Bik// CHECK-DAG:   memref.store %[[VAL_4]], %[[VAL_28]]{{\[}}%[[VAL_4]]] : memref<2xindex>
76783cf0dc9SAart Bik// CHECK-DAG:   memref.store %[[VAL_3]], %[[VAL_28]]{{\[}}%[[VAL_3]]] : memref<2xindex>
768dcae289dSChristian Ulmann// CHECK:       %[[VAL_30:.*]] = call @getSparseTensorReaderReadToBuffers0F32(%[[VAL_8]], %[[VAL_29]], %[[VAL_29]], %[[VAL_16]], %[[VAL_17]]) : (!llvm.ptr, memref<?xindex>, memref<?xindex>, memref<?xindex>, memref<?xf32>) -> i1
769d3af6535SAart Bik// CHECK:       %[[VAL_31:.*]] = arith.cmpi eq, %[[VAL_30]], %[[VAL_1]] : i1
770d3af6535SAart Bik// CHECK:       scf.if %[[VAL_31]] {
771d3af6535SAart Bik// CHECK:         sparse_tensor.sort hybrid_quick_sort %[[VAL_10]], %[[VAL_16]] jointly %[[VAL_17]]
7722c81d432Sbixia1// CHECK:       }
773d3af6535SAart Bik// CHECK:       memref.store %[[VAL_10]], %[[VAL_25]]{{\[}}%[[VAL_3]]] : memref<?xindex>
774d3af6535SAart Bik// CHECK:       %[[VAL_32:.*]] = sparse_tensor.storage_specifier.set %[[VAL_27]]  crd_mem_sz at 0 with %[[VAL_13]]
775d3af6535SAart Bik// CHECK:       %[[VAL_33:.*]] = sparse_tensor.storage_specifier.set %[[VAL_32]]  val_mem_sz with %[[VAL_10]]
776dcae289dSChristian Ulmann// CHECK:       call @delSparseTensorReader(%[[VAL_8]]) : (!llvm.ptr) -> ()
777d3af6535SAart Bik// CHECK:       return %[[VAL_25]], %[[VAL_16]], %[[VAL_17]], %[[VAL_33]]
778dcae289dSChristian Ulmannfunc.func @sparse_new_coo(%arg0: !llvm.ptr) -> tensor<?x?xf32, #Coo> {
779dcae289dSChristian Ulmann  %0 = sparse_tensor.new %arg0 : !llvm.ptr to tensor<?x?xf32, #Coo>
7802c81d432Sbixia1  return %0 : tensor<?x?xf32, #Coo>
7812c81d432Sbixia1}
7822c81d432Sbixia1
7832c81d432Sbixia1// CHECK-LABEL: func.func @sparse_new_coo_permute_no(
784c5a67e16SYinying Li// CHECK-SAME:  %[[A0:.*]]: !llvm.ptr) -> (memref<?xindex>, memref<?xindex>, memref<?xf32>, !sparse_tensor.storage_specifier<#sparse{{[0-9]*}}>) {
785d3af6535SAart Bik// CHECK-DAG:   %[[VAL_1:.*]] = arith.constant 2 : i32
786d3af6535SAart Bik// CHECK-DAG:   %[[VAL_2:.*]] = arith.constant 1 : index
787d3af6535SAart Bik// CHECK-DAG:   %[[VAL_3:.*]] = arith.constant 0 : index
788d3af6535SAart Bik// CHECK-DAG:   %[[VAL_4:.*]] = arith.constant 2 : index
789d3af6535SAart Bik// CHECK:       %[[VAL_5:.*]] = memref.alloca() : memref<2xindex>
790d3af6535SAart Bik// CHECK:       %[[VAL_6:.*]] = memref.cast %[[VAL_5]] : memref<2xindex> to memref<?xindex>
791d3af6535SAart Bik// CHECK:       memref.store %[[VAL_3]], %[[VAL_5]]{{\[}}%[[VAL_3]]] : memref<2xindex>
792d3af6535SAart Bik// CHECK:       memref.store %[[VAL_3]], %[[VAL_5]]{{\[}}%[[VAL_2]]] : memref<2xindex>
793dcae289dSChristian Ulmann// CHECK:       %[[VAL_7:.*]] = call @createCheckedSparseTensorReader(%[[A0]], %[[VAL_6]], %[[VAL_1]]) : (!llvm.ptr, memref<?xindex>, i32) -> !llvm.ptr
79483cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_8:.*]] = call @getSparseTensorReaderDimSizes(%[[VAL_7]]) : (!llvm.ptr) -> memref<?xindex>
79583cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_9:.*]] = call @getSparseTensorReaderNSE(%[[VAL_7]]) : (!llvm.ptr) -> index
79683cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_10:.*]] = memref.load %[[VAL_8]]{{\[}}%[[VAL_3]]] : memref<?xindex>
79783cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_11:.*]] = memref.load %[[VAL_8]]{{\[}}%[[VAL_2]]] : memref<?xindex>
79883cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_12:.*]] = arith.muli %[[VAL_9]], %[[VAL_4]] : index
79983cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_13:.*]] = memref.alloc() : memref<2xindex>
80083cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_14:.*]] = memref.cast %[[VAL_13]] : memref<2xindex> to memref<?xindex>
80183cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_15:.*]] = memref.alloc(%[[VAL_12]]) : memref<?xindex>
80283cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_16:.*]] = memref.alloc(%[[VAL_9]]) : memref<?xf32>
80383cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_17:.*]] = sparse_tensor.storage_specifier.init
80483cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_18:.*]] = sparse_tensor.storage_specifier.set %[[VAL_17]]  lvl_sz at 0 with %[[VAL_11]]
80583cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_19:.*]] = sparse_tensor.storage_specifier.get %[[VAL_18]]  pos_mem_sz at 0
80683cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_20:.*]], %[[VAL_21:.*]] = sparse_tensor.push_back %[[VAL_19]], %[[VAL_14]], %[[VAL_3]]
80783cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_22:.*]] = sparse_tensor.storage_specifier.set %[[VAL_18]]  pos_mem_sz at 0 with %[[VAL_21]]
80883cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_23:.*]] = sparse_tensor.storage_specifier.set %[[VAL_22]]  lvl_sz at 1 with %[[VAL_10]]
80983cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_24:.*]], %[[VAL_25:.*]] = sparse_tensor.push_back %[[VAL_21]], %[[VAL_20]], %[[VAL_3]], %[[VAL_2]]
81083cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_26:.*]] = sparse_tensor.storage_specifier.set %[[VAL_23]]  pos_mem_sz at 0 with %[[VAL_25]]
81183cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_27:.*]] = memref.alloca() : memref<2xindex>
81283cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_28:.*]] = memref.cast %[[VAL_27]] : memref<2xindex> to memref<?xindex>
81383cf0dc9SAart Bik// CHECK-DAG:   memref.store %[[VAL_2]], %[[VAL_27]]{{\[}}%[[VAL_3]]] : memref<2xindex>
81483cf0dc9SAart Bik// CHECK-DAG:   memref.store %[[VAL_3]], %[[VAL_27]]{{\[}}%[[VAL_2]]] : memref<2xindex>
81583cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_29:.*]] = memref.alloca() : memref<2xindex>
81683cf0dc9SAart Bik// CHECK-DAG:   %[[VAL_30:.*]] = memref.cast %[[VAL_29]] : memref<2xindex> to memref<?xindex>
81783cf0dc9SAart Bik// CHECK-DAG:   memref.store %[[VAL_2]], %[[VAL_29]]{{\[}}%[[VAL_3]]] : memref<2xindex>
81883cf0dc9SAart Bik// CHECK-DAG:   memref.store %[[VAL_3]], %[[VAL_29]]{{\[}}%[[VAL_2]]] : memref<2xindex>
819dcae289dSChristian Ulmann// CHECK:       %[[VAL_31:.*]] = call @getSparseTensorReaderReadToBuffers0F32(%[[VAL_7]], %[[VAL_28]], %[[VAL_30]], %[[VAL_15]], %[[VAL_16]]) : (!llvm.ptr, memref<?xindex>, memref<?xindex>, memref<?xindex>, memref<?xf32>) -> i1
820d3af6535SAart Bik// CHECK:       memref.store %[[VAL_9]], %[[VAL_24]]{{\[}}%[[VAL_2]]] : memref<?xindex>
821d3af6535SAart Bik// CHECK:       %[[VAL_32:.*]] = sparse_tensor.storage_specifier.set %[[VAL_26]]  crd_mem_sz at 0 with %[[VAL_12]]
822d3af6535SAart Bik// CHECK:       %[[VAL_33:.*]] = sparse_tensor.storage_specifier.set %[[VAL_32]]  val_mem_sz with %[[VAL_9]]
823dcae289dSChristian Ulmann// CHECK:       call @delSparseTensorReader(%[[VAL_7]]) : (!llvm.ptr) -> ()
824d3af6535SAart Bik// CHECK:       return %[[VAL_24]], %[[VAL_15]], %[[VAL_16]], %[[VAL_33]]
825dcae289dSChristian Ulmannfunc.func @sparse_new_coo_permute_no(%arg0: !llvm.ptr) -> tensor<?x?xf32, #CooPNo> {
826dcae289dSChristian Ulmann  %0 = sparse_tensor.new %arg0 : !llvm.ptr to tensor<?x?xf32, #CooPNo>
8272c81d432Sbixia1  return %0 : tensor<?x?xf32, #CooPNo>
8282c81d432Sbixia1}
829