1
- // RUN: mlir-opt %s --sparse-tensor-codegen --canonicalize --cse | FileCheck %s
1
+ // RUN: mlir-opt %s --sparse-tensor-codegen --canonicalize --cse | FileCheck %s --check-prefix=CHECK-CODEGEN
2
+ // RUN: mlir-opt %s --sparse-tensor-codegen --sparse-tensor-storage-expansion --canonicalize --cse | FileCheck %s --check-prefix=CHECK-STORAGE
3
+
2
4
3
5
#SparseVector = #sparse_tensor.encoding <{
4
6
dimLevelType = [ " compressed" ],
35
37
dimOrdering = affine_map <(i , j , k ) -> (k , i , j )>
36
38
}>
37
39
38
- // CHECK-LABEL: func @sparse_nop(
39
- // CHECK-SAME: %[[A:.*]]: tuple<memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
40
- // CHECK: return %[[A]] : tuple<memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>
40
+ // CHECK-CODEGEN-LABEL: func @sparse_nop(
41
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
42
+ // CHECK-CODEGEN: return %[[A]] : tuple<memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>
43
+ //
44
+ // CHECK-STORAGE-LABEL: func @sparse_nop(
45
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<1xindex>,
46
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xi32>,
47
+ // CHECK-STORAGE-SAME: %[[A2:.*2]]: memref<?xi64>,
48
+ // CHECK-STORAGE-SAME: %[[A3:.*3]]: memref<?xf64>)
49
+ // CHECK-STORAGE: return %[[A0]], %[[A1]], %[[A2]], %[[A3]] : memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>
41
50
func.func @sparse_nop (%arg0: tensor <?xf64 , #SparseVector >) -> tensor <?xf64 , #SparseVector > {
42
51
return %arg0 : tensor <?xf64 , #SparseVector >
43
52
}
44
53
45
- // CHECK-LABEL: func @sparse_nop_cast(
46
- // CHECK-SAME: %[[A:.*]]: tuple<memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf32>>)
47
- // CHECK: return %[[A]] : tuple<memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf32>>
54
+ // CHECK-CODEGEN-LABEL: func @sparse_nop_cast(
55
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf32>>)
56
+ // CHECK-CODEGEN: return %[[A]] : tuple<memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf32>>
57
+ //
58
+ // CHECK-STORAGE-LABEL: func @sparse_nop_cast(
59
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<1xindex>,
60
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xi32>,
61
+ // CHECK-STORAGE-SAME: %[[A2:.*2]]: memref<?xi64>,
62
+ // CHECK-STORAGE-SAME: %[[A3:.*3]]: memref<?xf32>)
63
+ // CHECK-STORAGE: return %[[A0]], %[[A1]], %[[A2]], %[[A3]] : memref<1xindex>, memref<?xi32>, memref<?xi64>, memref<?xf32>
48
64
func.func @sparse_nop_cast (%arg0: tensor <64 xf32 , #SparseVector >) -> tensor <?xf32 , #SparseVector > {
49
65
%0 = tensor.cast %arg0 : tensor <64 xf32 , #SparseVector > to tensor <?xf32 , #SparseVector >
50
66
return %0 : tensor <?xf32 , #SparseVector >
51
67
}
52
68
53
- // CHECK-LABEL: func @sparse_nop_cast_3d(
54
- // CHECK-SAME: %[[A:.*]]: tuple<memref<3xindex>, memref<?xf32>>)
55
- // CHECK: return %[[A]] : tuple<memref<3xindex>, memref<?xf32>>
69
+ // CHECK-CODEGEN-LABEL: func @sparse_nop_cast_3d(
70
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<3xindex>, memref<?xf32>>)
71
+ // CHECK-CODEGEN: return %[[A]] : tuple<memref<3xindex>, memref<?xf32>>
72
+ //
73
+ // CHECK-STORAGE-LABEL: func @sparse_nop_cast_3d(
74
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<3xindex>,
75
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xf32>)
76
+ // CHECK-STORAGE: return %[[A0]], %[[A1]] : memref<3xindex>, memref<?xf32>
56
77
func.func @sparse_nop_cast_3d (%arg0: tensor <10 x20 x30 xf32 , #Dense3D >) -> tensor <?x?x?xf32 , #Dense3D > {
57
78
%0 = tensor.cast %arg0 : tensor <10 x20 x30 xf32 , #Dense3D > to tensor <?x?x?xf32 , #Dense3D >
58
79
return %0 : tensor <?x?x?xf32 , #Dense3D >
59
80
}
60
81
61
- // CHECK-LABEL: func @sparse_dense_2d(
62
- // CHECK-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xf64>>)
82
+ // CHECK-CODEGEN-LABEL: func @sparse_dense_2d(
83
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xf64>>)
84
+ //
85
+ // CHECK-STORAGE-LABEL: func @sparse_dense_2d(
86
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<2xindex>,
87
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xf64>) {
88
+ // CHECK-STORAGE: return
63
89
func.func @sparse_dense_2d (%arg0: tensor <?x?xf64 , #Dense2D >) {
64
90
return
65
91
}
66
92
67
- // CHECK-LABEL: func @sparse_row(
68
- // CHECK-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
93
+ // CHECK-CODEGEN-LABEL: func @sparse_row(
94
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
95
+ //
96
+ // CHECK-STORAGE-LABEL: func @sparse_row(
97
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<2xindex>,
98
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xi32>,
99
+ // CHECK-STORAGE-SAME: %[[A2:.*2]]: memref<?xi64>,
100
+ // CHECK-STORAGE-SAME: %[[A3:.*3]]: memref<?xf64>) {
101
+ // CHECK-STORAGE: return
69
102
func.func @sparse_row (%arg0: tensor <?x?xf64 , #Row >) {
70
103
return
71
104
}
72
105
73
- // CHECK-LABEL: func @sparse_csr(
74
- // CHECK-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
106
+ // CHECK-CODEGEN-LABEL: func @sparse_csr(
107
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
108
+ //
109
+ // CHECK-STORAGE-LABEL: func @sparse_csr(
110
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<2xindex>,
111
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xi32>,
112
+ // CHECK-STORAGE-SAME: %[[A2:.*2]]: memref<?xi64>,
113
+ // CHECK-STORAGE-SAME: %[[A3:.*3]]: memref<?xf64>) {
114
+ // CHECK-STORAGE: return
75
115
func.func @sparse_csr (%arg0: tensor <?x?xf64 , #CSR >) {
76
116
return
77
117
}
78
118
79
- // CHECK-LABEL: func @sparse_dcsr(
80
- // CHECK-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
119
+ // CHECK-CODEGEN-LABEL: func @sparse_dcsr(
120
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
121
+ //
122
+ // CHECK-STORAGE-LABEL: func @sparse_dcsr(
123
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<2xindex>,
124
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xi32>,
125
+ // CHECK-STORAGE-SAME: %[[A2:.*2]]: memref<?xi64>,
126
+ // CHECK-STORAGE-SAME: %[[A3:.*3]]: memref<?xi32>,
127
+ // CHECK-STORAGE-SAME: %[[A4:.*4]]: memref<?xi64>,
128
+ // CHECK-STORAGE-SAME: %[[A5:.*5]]: memref<?xf64>) {
129
+ // CHECK-STORAGE: return
81
130
func.func @sparse_dcsr (%arg0: tensor <?x?xf64 , #DCSR >) {
82
131
return
83
132
}
@@ -86,10 +135,16 @@ func.func @sparse_dcsr(%arg0: tensor<?x?xf64, #DCSR>) {
86
135
// Querying for dimension 1 in the tensor type can immediately
87
136
// fold using the original static dimension sizes.
88
137
//
89
- // CHECK-LABEL: func @sparse_dense_3d(
90
- // CHECK-SAME: %[[A:.*]]: tuple<memref<3xindex>, memref<?xf64>>)
91
- // CHECK: %[[C:.*]] = arith.constant 20 : index
92
- // CHECK: return %[[C]] : index
138
+ // CHECK-CODEGEN-LABEL: func @sparse_dense_3d(
139
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<3xindex>, memref<?xf64>>)
140
+ // CHECK-CODEGEN: %[[C:.*]] = arith.constant 20 : index
141
+ // CHECK-CODEGEN: return %[[C]] : index
142
+ //
143
+ // CHECK-STORAGE-LABEL: func @sparse_dense_3d(
144
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<3xindex>,
145
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xf64>)
146
+ // CHECK-STORAGE: %[[C:.*]] = arith.constant 20 : index
147
+ // CHECK-STORAGE: return %[[C]] : index
93
148
func.func @sparse_dense_3d (%arg0: tensor <10 x20 x30 xf64 , #Dense3D >) -> index {
94
149
%c = arith.constant 1 : index
95
150
%0 = tensor.dim %arg0 , %c : tensor <10 x20 x30 xf64 , #Dense3D >
@@ -101,58 +156,103 @@ func.func @sparse_dense_3d(%arg0: tensor<10x20x30xf64, #Dense3D>) -> index {
101
156
// into querying for dimension 2 in the stored sparse tensor scheme,
102
157
// since the latter honors the dimOrdering.
103
158
//
104
- // CHECK-LABEL: func @sparse_dense_3d_dyn(
105
- // CHECK-SAME: %[[A:.*]]: tuple<memref<3xindex>, memref<?xf64>>)
106
- // CHECK: %[[C:.*]] = arith.constant 2 : index
107
- // CHECK: %[[F:.*]] = sparse_tensor.storage_get %[[A]][0] : tuple<memref<3xindex>, memref<?xf64>> to memref<3xindex>
108
- // CHECK: %[[L:.*]] = memref.load %[[F]][%[[C]]] : memref<3xindex>
109
- // CHECK: return %[[L]] : index
159
+ // CHECK-CODEGEN-LABEL: func @sparse_dense_3d_dyn(
160
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<3xindex>, memref<?xf64>>)
161
+ // CHECK-CODEGEN: %[[C:.*]] = arith.constant 2 : index
162
+ // CHECK-CODEGEN: %[[F:.*]] = sparse_tensor.storage_get %[[A]][0] : tuple<memref<3xindex>, memref<?xf64>> to memref<3xindex>
163
+ // CHECK-CODEGEN: %[[L:.*]] = memref.load %[[F]][%[[C]]] : memref<3xindex>
164
+ // CHECK-CODEGEN: return %[[L]] : index
165
+ //
166
+ // CHECK-STORAGE-LABEL: func @sparse_dense_3d_dyn(
167
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<3xindex>,
168
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xf64>)
169
+ // CHECK-STORAGE: %[[C:.*]] = arith.constant 2 : index
170
+ // CHECK-STORAGE: %[[L:.*]] = memref.load %[[A0]][%[[C]]] : memref<3xindex>
171
+ // CHECK-STORAGE: return %[[L]] : index
110
172
func.func @sparse_dense_3d_dyn (%arg0: tensor <?x?x?xf64 , #Dense3D >) -> index {
111
173
%c = arith.constant 1 : index
112
174
%0 = tensor.dim %arg0 , %c : tensor <?x?x?xf64 , #Dense3D >
113
175
return %0 : index
114
176
}
115
177
116
- // CHECK-LABEL: func @sparse_pointers_dcsr(
117
- // CHECK-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
118
- // CHECK: %[[F:.*]] = sparse_tensor.storage_get %[[A]][3] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xi32>
119
- // CHECK: return %[[F]] : memref<?xi32>
178
+ // CHECK-CODEGEN-LABEL: func @sparse_pointers_dcsr(
179
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
180
+ // CHECK-CODEGEN: %[[F:.*]] = sparse_tensor.storage_get %[[A]][3] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xi32>
181
+ // CHECK-CODEGEN: return %[[F]] : memref<?xi32>
182
+ //
183
+ // CHECK-STORAGE-LABEL: func @sparse_pointers_dcsr(
184
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<2xindex>,
185
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xi32>,
186
+ // CHECK-STORAGE-SAME: %[[A2:.*2]]: memref<?xi64>,
187
+ // CHECK-STORAGE-SAME: %[[A3:.*3]]: memref<?xi32>,
188
+ // CHECK-STORAGE-SAME: %[[A4:.*4]]: memref<?xi64>,
189
+ // CHECK-STORAGE-SAME: %[[A5:.*5]]: memref<?xf64>)
190
+ // CHECK-STORAGE: return %[[A3]] : memref<?xi32>
120
191
func.func @sparse_pointers_dcsr (%arg0: tensor <?x?xf64 , #DCSR >) -> memref <?xi32 > {
121
192
%c = arith.constant 1 : index
122
193
%0 = sparse_tensor.pointers %arg0 , %c : tensor <?x?xf64 , #DCSR > to memref <?xi32 >
123
194
return %0 : memref <?xi32 >
124
195
}
125
196
126
- // CHECK-LABEL: func @sparse_indices_dcsr(
127
- // CHECK-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
128
- // CHECK: %[[F:.*]] = sparse_tensor.storage_get %[[A]][4] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xi64>
129
- // CHECK: return %[[F]] : memref<?xi64>
197
+ // CHECK-CODEGEN-LABEL: func @sparse_indices_dcsr(
198
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
199
+ // CHECK-CODEGEN: %[[F:.*]] = sparse_tensor.storage_get %[[A]][4] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xi64>
200
+ // CHECK-CODEGEN: return %[[F]] : memref<?xi64>
201
+ //
202
+ // CHECK-STORAGE-LABEL: func @sparse_indices_dcsr(
203
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<2xindex>,
204
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xi32>,
205
+ // CHECK-STORAGE-SAME: %[[A2:.*2]]: memref<?xi64>,
206
+ // CHECK-STORAGE-SAME: %[[A3:.*3]]: memref<?xi32>,
207
+ // CHECK-STORAGE-SAME: %[[A4:.*4]]: memref<?xi64>,
208
+ // CHECK-STORAGE-SAME: %[[A5:.*5]]: memref<?xf64>)
209
+ // CHECK-STORAGE: return %[[A4]] : memref<?xi64>
130
210
func.func @sparse_indices_dcsr (%arg0: tensor <?x?xf64 , #DCSR >) -> memref <?xi64 > {
131
211
%c = arith.constant 1 : index
132
212
%0 = sparse_tensor.indices %arg0 , %c : tensor <?x?xf64 , #DCSR > to memref <?xi64 >
133
213
return %0 : memref <?xi64 >
134
214
}
135
215
136
- // CHECK-LABEL: func @sparse_values_dcsr(
137
- // CHECK-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
138
- // CHECK: %[[F:.*]] = sparse_tensor.storage_get %[[A]][5] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xf64>
139
- // CHECK: return %[[F]] : memref<?xf64>
216
+ // CHECK-CODEGEN-LABEL: func @sparse_values_dcsr(
217
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
218
+ // CHECK-CODEGEN: %[[F:.*]] = sparse_tensor.storage_get %[[A]][5] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xf64>
219
+ // CHECK-CODEGEN: return %[[F]] : memref<?xf64>
220
+ //
221
+ // CHECK-STORAGE-LABEL: func @sparse_values_dcsr(
222
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<2xindex>,
223
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xi32>,
224
+ // CHECK-STORAGE-SAME: %[[A2:.*2]]: memref<?xi64>,
225
+ // CHECK-STORAGE-SAME: %[[A3:.*3]]: memref<?xi32>,
226
+ // CHECK-STORAGE-SAME: %[[A4:.*4]]: memref<?xi64>,
227
+ // CHECK-STORAGE-SAME: %[[A5:.*5]]: memref<?xf64>)
228
+ // CHECK-STORAGE: return %[[A5]] : memref<?xf64>
140
229
func.func @sparse_values_dcsr (%arg0: tensor <?x?xf64 , #DCSR >) -> memref <?xf64 > {
141
230
%0 = sparse_tensor.values %arg0 : tensor <?x?xf64 , #DCSR > to memref <?xf64 >
142
231
return %0 : memref <?xf64 >
143
232
}
144
233
145
- // CHECK-LABEL: func @sparse_dealloc_csr(
146
- // CHECK-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
147
- // CHECK: %[[F0:.*]] = sparse_tensor.storage_get %[[A]][0] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<2xindex>
148
- // CHECK: memref.dealloc %[[F0]] : memref<2xindex>
149
- // CHECK: %[[F1:.*]] = sparse_tensor.storage_get %[[A]][1] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xi32>
150
- // CHECK: memref.dealloc %[[F1]] : memref<?xi32>
151
- // CHECK: %[[F2:.*]] = sparse_tensor.storage_get %[[A]][2] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xi64>
152
- // CHECK: memref.dealloc %[[F2]] : memref<?xi64>
153
- // CHECK: %[[F3:.*]] = sparse_tensor.storage_get %[[A]][3] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xf64>
154
- // CHECK: memref.dealloc %[[F3]] : memref<?xf64>
155
- // CHECK: return
234
+ // CHECK-CODEGEN-LABEL: func @sparse_dealloc_csr(
235
+ // CHECK-CODEGEN-SAME: %[[A:.*]]: tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>>)
236
+ // CHECK-CODEGEN: %[[F0:.*]] = sparse_tensor.storage_get %[[A]][0] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<2xindex>
237
+ // CHECK-CODEGEN: memref.dealloc %[[F0]] : memref<2xindex>
238
+ // CHECK-CODEGEN: %[[F1:.*]] = sparse_tensor.storage_get %[[A]][1] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xi32>
239
+ // CHECK-CODEGEN: memref.dealloc %[[F1]] : memref<?xi32>
240
+ // CHECK-CODEGEN: %[[F2:.*]] = sparse_tensor.storage_get %[[A]][2] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xi64>
241
+ // CHECK-CODEGEN: memref.dealloc %[[F2]] : memref<?xi64>
242
+ // CHECK-CODEGEN: %[[F3:.*]] = sparse_tensor.storage_get %[[A]][3] : tuple<memref<2xindex>, memref<?xi32>, memref<?xi64>, memref<?xf64>> to memref<?xf64>
243
+ // CHECK-CODEGEN: memref.dealloc %[[F3]] : memref<?xf64>
244
+ // CHECK-CODEGEN: return
245
+ //
246
+ // CHECK-STORAGE-LABEL: func @sparse_dealloc_csr(
247
+ // CHECK-STORAGE-SAME: %[[A0:.*0]]: memref<2xindex>,
248
+ // CHECK-STORAGE-SAME: %[[A1:.*1]]: memref<?xi32>,
249
+ // CHECK-STORAGE-SAME: %[[A2:.*2]]: memref<?xi64>,
250
+ // CHECK-STORAGE-SAME: %[[A3:.*3]]: memref<?xf64>) {
251
+ // CHECK-STORAGE: memref.dealloc %[[A0]] : memref<2xindex>
252
+ // CHECK-STORAGE: memref.dealloc %[[A1]] : memref<?xi32>
253
+ // CHECK-STORAGE: memref.dealloc %[[A2]] : memref<?xi64>
254
+ // CHECK-STORAGE: memref.dealloc %[[A3]] : memref<?xf64>
255
+ // CHECK-STORAGE: return
156
256
func.func @sparse_dealloc_csr (%arg0: tensor <?x?xf64 , #CSR >) {
157
257
bufferization.dealloc_tensor %arg0 : tensor <?x?xf64 , #CSR >
158
258
return
0 commit comments