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