// RUN: mlir-opt %s \ // RUN: --sparsification --sparse-tensor-conversion \ // RUN: --linalg-bufferize --convert-linalg-to-loops \ // RUN: --convert-vector-to-scf --convert-scf-to-std \ // RUN: --func-bufferize --tensor-constant-bufferize --tensor-bufferize \ // RUN: --std-bufferize --finalizing-bufferize --lower-affine \ // RUN: --convert-vector-to-llvm --convert-memref-to-llvm --convert-math-to-llvm \ // RUN: --convert-std-to-llvm --reconcile-unrealized-casts | \ // RUN: mlir-cpu-runner \ // RUN: -e entry -entry-point-result=void \ // RUN: -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \ // RUN: FileCheck %s #DCSR = #sparse_tensor.encoding<{ dimLevelType = [ "compressed", "compressed" ] }> #DCSC = #sparse_tensor.encoding<{ dimLevelType = [ "compressed", "compressed" ], dimOrdering = affine_map<(i,j) -> (j,i)> }> // // Integration test that tests conversions between sparse tensors, // where the dynamic sizes of the shape of the enveloping tensor // may change (the actual underlying sizes obviously never change). // module { // // Helper method to print values array. The transfer actually // reads more than required to verify size of buffer as well. // func @dump(%arg0: memref) { %c = arith.constant 0 : index %d = arith.constant -1.0 : f64 %0 = vector.transfer_read %arg0[%c], %d: memref, vector<8xf64> vector.print %0 : vector<8xf64> return } func @entry() { %t1 = arith.constant sparse< [ [0,0], [0,1], [0,63], [1,0], [1,1], [31,0], [31,63] ], [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 ]> : tensor<32x64xf64> %t2 = tensor.cast %t1 : tensor<32x64xf64> to tensor // Four dense to sparse conversions. %1 = sparse_tensor.convert %t1 : tensor<32x64xf64> to tensor %2 = sparse_tensor.convert %t1 : tensor<32x64xf64> to tensor %3 = sparse_tensor.convert %t2 : tensor to tensor %4 = sparse_tensor.convert %t2 : tensor to tensor // Two cross conversions. %5 = sparse_tensor.convert %3 : tensor to tensor %6 = sparse_tensor.convert %4 : tensor to tensor // // All proper row-/column-wise? // // CHECK: ( 1, 2, 3, 4, 5, 6, 7, -1 ) // CHECK: ( 1, 4, 6, 2, 5, 3, 7, -1 ) // CHECK: ( 1, 2, 3, 4, 5, 6, 7, -1 ) // CHECK: ( 1, 4, 6, 2, 5, 3, 7, -1 ) // CHECK: ( 1, 4, 6, 2, 5, 3, 7, -1 ) // CHECK: ( 1, 2, 3, 4, 5, 6, 7, -1 ) // %m1 = sparse_tensor.values %1 : tensor to memref %m2 = sparse_tensor.values %2 : tensor to memref %m3 = sparse_tensor.values %3 : tensor to memref %m4 = sparse_tensor.values %4 : tensor to memref %m5 = sparse_tensor.values %5 : tensor to memref %m6 = sparse_tensor.values %6 : tensor to memref call @dump(%m1) : (memref) -> () call @dump(%m2) : (memref) -> () call @dump(%m3) : (memref) -> () call @dump(%m4) : (memref) -> () call @dump(%m5) : (memref) -> () call @dump(%m6) : (memref) -> () // Release the resources. sparse_tensor.release %1 : tensor sparse_tensor.release %2 : tensor sparse_tensor.release %3 : tensor sparse_tensor.release %4 : tensor sparse_tensor.release %5 : tensor sparse_tensor.release %6 : tensor return } }