//===- LoopEmitter.h --------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef MLIR_DIALECT_SPARSETENSOR_TRANSFORMS_UTILS_LOOPEMITTER_H_ #define MLIR_DIALECT_SPARSETENSOR_TRANSFORMS_UTILS_LOOPEMITTER_H_ #include <vector> #include "SparseTensorIterator.h" #include "mlir/Dialect/SparseTensor/IR/Enums.h" #include "mlir/Dialect/SparseTensor/IR/SparseTensor.h" #include "mlir/Dialect/SparseTensor/Transforms/Passes.h" #include "mlir/Dialect/SparseTensor/Utils/Merger.h" #include "mlir/IR/PatternMatch.h" namespace mlir { namespace sparse_tensor { // A compressed <tensor id, level> pair. TensorLevel; // // SparseTensorLoopEmiter class, manages sparse tensors and helps to // generate loop structure to (co)-iterate sparse tensors. // // An example usage: // To generate the following loops over T1<?x?> and T2<?x?> // // for i in TENSOR_1_0 { // for j : TENSOR_2_0 { // for k : TENSOR_1_1 {} // for k : TENSOR_2_1 {} // } // } // // One can use // // LoopEmiter loopEmiter({T1, T1}); // loopEmiter.initializeLoopEmit(); // loopEmiter.enterLoopOverTensorAtLvl(T1, 0); // loopEmiter.enterLoopOverTensorAtLvl(T2, 0); // loopEmiter.enterLoopOverTensorAtLvl(T1, 1); // loopEmiter.exitCurrentLoop(); // loopEmiter.enterLoopOverTensorAtLvl(T2, 1); // loopEmiter.exitCurrentLoop(); // exit k // loopEmiter.exitCurrentLoop(); // exit j // loopEmiter.exitCurrentLoop(); // exit i // class LoopEmitter { … }; // // Utils functions to generate sparse loops. // // Generate a while loop that co-iterates over a set of iterators. std::pair<Operation *, Value> genCoIteration(OpBuilder &builder, Location loc, ArrayRef<SparseIterator *> iters, MutableArrayRef<Value> reduc, Value uniIdx, bool userReducFirst = false); } // namespace sparse_tensor } // namespace mlir #endif // MLIR_DIALECT_SPARSETENSOR_TRANSFORMS_UTILS_LOOPEMITTER_H_