1// RUN: mlir-opt %s --sparse-compiler | \ 2// RUN: mlir-cpu-runner \ 3// RUN: -e entry -entry-point-result=void \ 4// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \ 5// RUN: FileCheck %s 6 7#Tensor1 = #sparse_tensor.encoding<{ 8 dimLevelType = [ "compressed", "compressed", "compressed" ], 9 dimOrdering = affine_map<(i,j,k) -> (i,j,k)> 10}> 11 12#Tensor2 = #sparse_tensor.encoding<{ 13 dimLevelType = [ "compressed", "compressed", "compressed" ], 14 dimOrdering = affine_map<(i,j,k) -> (j,k,i)> 15}> 16 17#Tensor3 = #sparse_tensor.encoding<{ 18 dimLevelType = [ "compressed", "compressed", "compressed" ], 19 dimOrdering = affine_map<(i,j,k) -> (k,i,j)> 20}> 21 22// 23// Integration test that tests conversions between sparse tensors. 24// 25module { 26 // 27 // Output utilities. 28 // 29 func.func @dumpf64(%arg0: memref<?xf64>) { 30 %c0 = arith.constant 0 : index 31 %d0 = arith.constant -1.0 : f64 32 %0 = vector.transfer_read %arg0[%c0], %d0: memref<?xf64>, vector<25xf64> 33 vector.print %0 : vector<25xf64> 34 return 35 } 36 func.func @dumpidx(%arg0: memref<?xindex>) { 37 %c0 = arith.constant 0 : index 38 %d0 = arith.constant 0 : index 39 %0 = vector.transfer_read %arg0[%c0], %d0: memref<?xindex>, vector<25xindex> 40 vector.print %0 : vector<25xindex> 41 return 42 } 43 44 // 45 // Main driver. 46 // 47 func.func @entry() { 48 %c0 = arith.constant 0 : index 49 %c1 = arith.constant 1 : index 50 %c2 = arith.constant 2 : index 51 52 // 53 // Initialize a 3-dim dense tensor. 54 // 55 %t = arith.constant dense<[ 56 [ [ 1.0, 2.0, 3.0, 4.0 ], 57 [ 5.0, 6.0, 7.0, 8.0 ], 58 [ 9.0, 10.0, 11.0, 12.0 ] ], 59 [ [ 13.0, 14.0, 15.0, 16.0 ], 60 [ 17.0, 18.0, 19.0, 20.0 ], 61 [ 21.0, 22.0, 23.0, 24.0 ] ] 62 ]> : tensor<2x3x4xf64> 63 64 // 65 // Convert dense tensor directly to various sparse tensors. 66 // tensor1: stored as 2x3x4 67 // tensor2: stored as 3x4x2 68 // tensor3: stored as 4x2x3 69 // 70 %1 = sparse_tensor.convert %t : tensor<2x3x4xf64> to tensor<2x3x4xf64, #Tensor1> 71 %2 = sparse_tensor.convert %t : tensor<2x3x4xf64> to tensor<2x3x4xf64, #Tensor2> 72 %3 = sparse_tensor.convert %t : tensor<2x3x4xf64> to tensor<2x3x4xf64, #Tensor3> 73 74 // 75 // Convert sparse tensor to various sparse tensors. Note that the result 76 // should always correspond to the direct conversion, since the sparse 77 // tensor formats have the ability to restore into the original ordering. 78 // 79 %a = sparse_tensor.convert %1 : tensor<2x3x4xf64, #Tensor1> to tensor<2x3x4xf64, #Tensor1> 80 %b = sparse_tensor.convert %2 : tensor<2x3x4xf64, #Tensor2> to tensor<2x3x4xf64, #Tensor1> 81 %c = sparse_tensor.convert %3 : tensor<2x3x4xf64, #Tensor3> to tensor<2x3x4xf64, #Tensor1> 82 %d = sparse_tensor.convert %1 : tensor<2x3x4xf64, #Tensor1> to tensor<2x3x4xf64, #Tensor2> 83 %e = sparse_tensor.convert %2 : tensor<2x3x4xf64, #Tensor2> to tensor<2x3x4xf64, #Tensor2> 84 %f = sparse_tensor.convert %3 : tensor<2x3x4xf64, #Tensor3> to tensor<2x3x4xf64, #Tensor2> 85 %g = sparse_tensor.convert %1 : tensor<2x3x4xf64, #Tensor1> to tensor<2x3x4xf64, #Tensor3> 86 %h = sparse_tensor.convert %2 : tensor<2x3x4xf64, #Tensor2> to tensor<2x3x4xf64, #Tensor3> 87 %i = sparse_tensor.convert %3 : tensor<2x3x4xf64, #Tensor3> to tensor<2x3x4xf64, #Tensor3> 88 89 // 90 // Check values. 91 // 92 // CHECK: ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -1 ) 93 // CHECK-NEXT: ( 1, 13, 2, 14, 3, 15, 4, 16, 5, 17, 6, 18, 7, 19, 8, 20, 9, 21, 10, 22, 11, 23, 12, 24, -1 ) 94 // CHECK-NEXT: ( 1, 5, 9, 13, 17, 21, 2, 6, 10, 14, 18, 22, 3, 7, 11, 15, 19, 23, 4, 8, 12, 16, 20, 24, -1 ) 95 // CHECK-NEXT: ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -1 ) 96 // CHECK-NEXT: ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -1 ) 97 // CHECK-NEXT: ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -1 ) 98 // CHECK-NEXT: ( 1, 13, 2, 14, 3, 15, 4, 16, 5, 17, 6, 18, 7, 19, 8, 20, 9, 21, 10, 22, 11, 23, 12, 24, -1 ) 99 // CHECK-NEXT: ( 1, 13, 2, 14, 3, 15, 4, 16, 5, 17, 6, 18, 7, 19, 8, 20, 9, 21, 10, 22, 11, 23, 12, 24, -1 ) 100 // CHECK-NEXT: ( 1, 13, 2, 14, 3, 15, 4, 16, 5, 17, 6, 18, 7, 19, 8, 20, 9, 21, 10, 22, 11, 23, 12, 24, -1 ) 101 // CHECK-NEXT: ( 1, 5, 9, 13, 17, 21, 2, 6, 10, 14, 18, 22, 3, 7, 11, 15, 19, 23, 4, 8, 12, 16, 20, 24, -1 ) 102 // CHECK-NEXT: ( 1, 5, 9, 13, 17, 21, 2, 6, 10, 14, 18, 22, 3, 7, 11, 15, 19, 23, 4, 8, 12, 16, 20, 24, -1 ) 103 // CHECK-NEXT: ( 1, 5, 9, 13, 17, 21, 2, 6, 10, 14, 18, 22, 3, 7, 11, 15, 19, 23, 4, 8, 12, 16, 20, 24, -1 ) 104 // 105 %v1 = sparse_tensor.values %1 : tensor<2x3x4xf64, #Tensor1> to memref<?xf64> 106 %v2 = sparse_tensor.values %2 : tensor<2x3x4xf64, #Tensor2> to memref<?xf64> 107 %v3 = sparse_tensor.values %3 : tensor<2x3x4xf64, #Tensor3> to memref<?xf64> 108 %av = sparse_tensor.values %a : tensor<2x3x4xf64, #Tensor1> to memref<?xf64> 109 %bv = sparse_tensor.values %b : tensor<2x3x4xf64, #Tensor1> to memref<?xf64> 110 %cv = sparse_tensor.values %c : tensor<2x3x4xf64, #Tensor1> to memref<?xf64> 111 %dv = sparse_tensor.values %d : tensor<2x3x4xf64, #Tensor2> to memref<?xf64> 112 %ev = sparse_tensor.values %e : tensor<2x3x4xf64, #Tensor2> to memref<?xf64> 113 %fv = sparse_tensor.values %f : tensor<2x3x4xf64, #Tensor2> to memref<?xf64> 114 %gv = sparse_tensor.values %g : tensor<2x3x4xf64, #Tensor3> to memref<?xf64> 115 %hv = sparse_tensor.values %h : tensor<2x3x4xf64, #Tensor3> to memref<?xf64> 116 %iv = sparse_tensor.values %i : tensor<2x3x4xf64, #Tensor3> to memref<?xf64> 117 118 call @dumpf64(%v1) : (memref<?xf64>) -> () 119 call @dumpf64(%v2) : (memref<?xf64>) -> () 120 call @dumpf64(%v3) : (memref<?xf64>) -> () 121 call @dumpf64(%av) : (memref<?xf64>) -> () 122 call @dumpf64(%bv) : (memref<?xf64>) -> () 123 call @dumpf64(%cv) : (memref<?xf64>) -> () 124 call @dumpf64(%dv) : (memref<?xf64>) -> () 125 call @dumpf64(%ev) : (memref<?xf64>) -> () 126 call @dumpf64(%fv) : (memref<?xf64>) -> () 127 call @dumpf64(%gv) : (memref<?xf64>) -> () 128 call @dumpf64(%hv) : (memref<?xf64>) -> () 129 call @dumpf64(%iv) : (memref<?xf64>) -> () 130 131 // 132 // Check indices. 133 // 134 // CHECK-NEXT: ( 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 135 // CHECK-NEXT: ( 0, 1, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 136 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0 ) 137 // CHECK-NEXT: ( 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 138 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 139 // CHECK-NEXT: ( 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ) 140 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 141 // CHECK-NEXT: ( 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 142 // CHECK-NEXT: ( 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 ) 143 // CHECK-NEXT: ( 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 144 // CHECK-NEXT: ( 0, 1, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 145 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0 ) 146 // CHECK-NEXT: ( 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 147 // CHECK-NEXT: ( 0, 1, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 148 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0 ) 149 // CHECK-NEXT: ( 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 150 // CHECK-NEXT: ( 0, 1, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 151 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0 ) 152 // CHECK-NEXT: ( 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 153 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 154 // CHECK-NEXT: ( 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ) 155 // CHECK-NEXT: ( 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 156 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 157 // CHECK-NEXT: ( 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ) 158 // CHECK-NEXT: ( 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 159 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 160 // CHECK-NEXT: ( 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ) 161 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 162 // CHECK-NEXT: ( 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 163 // CHECK-NEXT: ( 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 ) 164 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 165 // CHECK-NEXT: ( 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 166 // CHECK-NEXT: ( 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 ) 167 // CHECK-NEXT: ( 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 168 // CHECK-NEXT: ( 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) 169 // CHECK-NEXT: ( 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 ) 170 // 171 %v10 = sparse_tensor.indices %1, %c0 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 172 %v11 = sparse_tensor.indices %1, %c1 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 173 %v12 = sparse_tensor.indices %1, %c2 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 174 %v20 = sparse_tensor.indices %2, %c0 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 175 %v21 = sparse_tensor.indices %2, %c1 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 176 %v22 = sparse_tensor.indices %2, %c2 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 177 %v30 = sparse_tensor.indices %3, %c0 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 178 %v31 = sparse_tensor.indices %3, %c1 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 179 %v32 = sparse_tensor.indices %3, %c2 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 180 181 %a10 = sparse_tensor.indices %a, %c0 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 182 %a11 = sparse_tensor.indices %a, %c1 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 183 %a12 = sparse_tensor.indices %a, %c2 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 184 %b10 = sparse_tensor.indices %b, %c0 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 185 %b11 = sparse_tensor.indices %b, %c1 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 186 %b12 = sparse_tensor.indices %b, %c2 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 187 %c10 = sparse_tensor.indices %c, %c0 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 188 %c11 = sparse_tensor.indices %c, %c1 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 189 %c12 = sparse_tensor.indices %c, %c2 : tensor<2x3x4xf64, #Tensor1> to memref<?xindex> 190 191 %d20 = sparse_tensor.indices %d, %c0 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 192 %d21 = sparse_tensor.indices %d, %c1 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 193 %d22 = sparse_tensor.indices %d, %c2 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 194 %e20 = sparse_tensor.indices %e, %c0 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 195 %e21 = sparse_tensor.indices %e, %c1 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 196 %e22 = sparse_tensor.indices %e, %c2 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 197 %f20 = sparse_tensor.indices %f, %c0 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 198 %f21 = sparse_tensor.indices %f, %c1 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 199 %f22 = sparse_tensor.indices %f, %c2 : tensor<2x3x4xf64, #Tensor2> to memref<?xindex> 200 201 %g30 = sparse_tensor.indices %g, %c0 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 202 %g31 = sparse_tensor.indices %g, %c1 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 203 %g32 = sparse_tensor.indices %g, %c2 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 204 %h30 = sparse_tensor.indices %h, %c0 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 205 %h31 = sparse_tensor.indices %h, %c1 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 206 %h32 = sparse_tensor.indices %h, %c2 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 207 %i30 = sparse_tensor.indices %i, %c0 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 208 %i31 = sparse_tensor.indices %i, %c1 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 209 %i32 = sparse_tensor.indices %i, %c2 : tensor<2x3x4xf64, #Tensor3> to memref<?xindex> 210 211 call @dumpidx(%v10) : (memref<?xindex>) -> () 212 call @dumpidx(%v11) : (memref<?xindex>) -> () 213 call @dumpidx(%v12) : (memref<?xindex>) -> () 214 call @dumpidx(%v20) : (memref<?xindex>) -> () 215 call @dumpidx(%v21) : (memref<?xindex>) -> () 216 call @dumpidx(%v22) : (memref<?xindex>) -> () 217 call @dumpidx(%v30) : (memref<?xindex>) -> () 218 call @dumpidx(%v31) : (memref<?xindex>) -> () 219 call @dumpidx(%v32) : (memref<?xindex>) -> () 220 221 call @dumpidx(%a10) : (memref<?xindex>) -> () 222 call @dumpidx(%a11) : (memref<?xindex>) -> () 223 call @dumpidx(%a12) : (memref<?xindex>) -> () 224 call @dumpidx(%b10) : (memref<?xindex>) -> () 225 call @dumpidx(%b11) : (memref<?xindex>) -> () 226 call @dumpidx(%b12) : (memref<?xindex>) -> () 227 call @dumpidx(%c10) : (memref<?xindex>) -> () 228 call @dumpidx(%c11) : (memref<?xindex>) -> () 229 call @dumpidx(%c12) : (memref<?xindex>) -> () 230 231 call @dumpidx(%d20) : (memref<?xindex>) -> () 232 call @dumpidx(%d21) : (memref<?xindex>) -> () 233 call @dumpidx(%d22) : (memref<?xindex>) -> () 234 call @dumpidx(%e20) : (memref<?xindex>) -> () 235 call @dumpidx(%e21) : (memref<?xindex>) -> () 236 call @dumpidx(%e22) : (memref<?xindex>) -> () 237 call @dumpidx(%f20) : (memref<?xindex>) -> () 238 call @dumpidx(%f21) : (memref<?xindex>) -> () 239 call @dumpidx(%f22) : (memref<?xindex>) -> () 240 241 call @dumpidx(%g30) : (memref<?xindex>) -> () 242 call @dumpidx(%g31) : (memref<?xindex>) -> () 243 call @dumpidx(%g32) : (memref<?xindex>) -> () 244 call @dumpidx(%h30) : (memref<?xindex>) -> () 245 call @dumpidx(%h31) : (memref<?xindex>) -> () 246 call @dumpidx(%h32) : (memref<?xindex>) -> () 247 call @dumpidx(%i30) : (memref<?xindex>) -> () 248 call @dumpidx(%i31) : (memref<?xindex>) -> () 249 call @dumpidx(%i32) : (memref<?xindex>) -> () 250 251 // Release the resources. 252 bufferization.dealloc_tensor %1 : tensor<2x3x4xf64, #Tensor1> 253 bufferization.dealloc_tensor %2 : tensor<2x3x4xf64, #Tensor2> 254 bufferization.dealloc_tensor %3 : tensor<2x3x4xf64, #Tensor3> 255 bufferization.dealloc_tensor %b : tensor<2x3x4xf64, #Tensor1> 256 bufferization.dealloc_tensor %c : tensor<2x3x4xf64, #Tensor1> 257 bufferization.dealloc_tensor %d : tensor<2x3x4xf64, #Tensor2> 258 bufferization.dealloc_tensor %f : tensor<2x3x4xf64, #Tensor2> 259 bufferization.dealloc_tensor %g : tensor<2x3x4xf64, #Tensor3> 260 bufferization.dealloc_tensor %h : tensor<2x3x4xf64, #Tensor3> 261 262 return 263 } 264} 265