#include "SparseTensorIterator.h"
#include "CodegenUtils.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/SCF/IR/SCF.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
usingnamespacemlir;
usingnamespacemlir::sparse_tensor;
ValuePair;
ValueTuple;
#define CMPI …
#define C_FALSE …
#define C_TRUE …
#define C_IDX …
#define YIELD …
#define ADDI …
#define ORI(lhs, rhs) …
#define ANDI …
#define SUBI …
#define MULI …
#define MINUI(lhs, rhs) …
#define REMUI(lhs, rhs) …
#define DIVUI(lhs, rhs) …
#define SELECT …
namespace {
template <bool hasPosBuffer>
class SparseLevel : public SparseTensorLevel { … };
class DenseLevel : public SparseTensorLevel { … };
class BatchLevel : public SparseTensorLevel { … };
class CompressedLevel : public SparseLevel<true> { … };
class LooseCompressedLevel : public SparseLevel<true> { … };
class SingletonLevel : public SparseLevel<false> { … };
class NOutOfMLevel : public SparseLevel<false> { … };
}
static scf::ValueVector genWhenInBound(
OpBuilder &b, Location l, SparseIterator &it, ValueRange elseRet,
llvm::function_ref<scf::ValueVector(OpBuilder &, Location, Value)>
builder) { … }
static Value offsetFromMinCrd(OpBuilder &b, Location l, Value minCrd,
Value size) { … }
namespace {
class ConcreteIterator : public SparseIterator { … };
class TrivialIterator : public ConcreteIterator { … };
class DedupIterator : public ConcreteIterator { … };
class SimpleWrapIterator : public SparseIterator { … };
class FilterIterator : public SimpleWrapIterator { … };
class PadIterator : public SimpleWrapIterator { … };
class NonEmptySubSectIterator : public SparseIterator { … };
class SubSectIterator;
struct SubSectIterHelper { … };
class SubSectIterator : public SparseIterator { … };
}
void SparseIterator::genInit(OpBuilder &b, Location l,
const SparseIterator *p) { … }
Value SparseIterator::genNotEnd(OpBuilder &b, Location l) { … }
void SparseIterator::locate(OpBuilder &b, Location l, Value crd) { … }
Value SparseIterator::deref(OpBuilder &b, Location l) { … }
ValueRange SparseIterator::forward(OpBuilder &b, Location l) { … }
ValueRange SparseIterator::forwardIf(OpBuilder &b, Location l, Value cond) { … }
Value DedupIterator::genSegmentHigh(OpBuilder &b, Location l, Value pos) { … }
Value FilterIterator::genCrdNotLegitPredicate(OpBuilder &b, Location l,
Value wrapCrd) { … }
Value FilterIterator::genShouldFilter(OpBuilder &b, Location l) { … }
Value FilterIterator::genNotEndImpl(OpBuilder &b, Location l) { … }
ValueRange FilterIterator::forwardImpl(OpBuilder &b, Location l) { … }
SubSectIterHelper::SubSectIterHelper(const NonEmptySubSectIterator &subSect)
: … { … }
SubSectIterHelper::SubSectIterHelper(const SubSectIterator &iter)
: … { … }
void SubSectIterHelper::deserializeFromTupleId(OpBuilder &b, Location l,
Value tupleId) { … }
void SubSectIterHelper::locate(OpBuilder &b, Location l, Value crd) { … }
Value SubSectIterHelper::genNotEnd(OpBuilder &b, Location l) { … }
Value SubSectIterHelper::deref(OpBuilder &b, Location l) { … }
ValueRange SubSectIterHelper::forward(OpBuilder &b, Location l) { … }
ValueRange NonEmptySubSectIterator::inflateSubSectTree(
OpBuilder &b, Location l, ValueRange reduc, TraverseBuilder builder) const { … }
void TrivialIterator::genInitImpl(OpBuilder &b, Location l,
const SparseIterator *parent) { … }
void NonEmptySubSectIterator::genInitImpl(OpBuilder &b, Location l,
const SparseIterator *) { … }
ValueRange NonEmptySubSectIterator::forwardImpl(OpBuilder &b, Location l) { … }
mlir::sparse_tensor::SparseIterationSpace::SparseIterationSpace(
Location l, OpBuilder &b, Value t, unsigned tid,
std::pair<Level, Level> lvlRange, ValueRange parentPos)
: … { … }
SparseIterationSpace mlir::sparse_tensor::SparseIterationSpace::fromValues(
IterSpaceType dstTp, ValueRange values, unsigned int tid) { … }
std::unique_ptr<SparseIterator>
SparseIterationSpace::extractIterator(OpBuilder &b, Location l) const { … }
std::unique_ptr<SparseTensorLevel>
sparse_tensor::makeSparseTensorLevel(LevelType lt, Value sz, ValueRange b,
unsigned t, Level l) { … }
std::unique_ptr<SparseTensorLevel>
sparse_tensor::makeSparseTensorLevel(OpBuilder &b, Location l, Value t,
unsigned tid, Level lvl) { … }
std::pair<std::unique_ptr<SparseTensorLevel>, std::unique_ptr<SparseIterator>>
sparse_tensor::makeSynLevelAndIterator(Value sz, unsigned tid, unsigned lvl,
SparseEmitStrategy strategy) { … }
std::unique_ptr<SparseIterator>
sparse_tensor::makeSimpleIterator(OpBuilder &b, Location l,
const SparseIterationSpace &iterSpace) { … }
std::unique_ptr<SparseIterator>
sparse_tensor::makeSimpleIterator(const SparseTensorLevel &stl,
SparseEmitStrategy strategy) { … }
std::unique_ptr<SparseIterator>
sparse_tensor::makeSlicedLevelIterator(std::unique_ptr<SparseIterator> &&sit,
Value offset, Value stride, Value size,
SparseEmitStrategy strategy) { … }
std::unique_ptr<SparseIterator>
sparse_tensor::makePaddedIterator(std::unique_ptr<SparseIterator> &&sit,
Value padLow, Value padHigh,
SparseEmitStrategy strategy) { … }
static const SparseIterator *tryUnwrapFilter(const SparseIterator *it) { … }
std::unique_ptr<SparseIterator> sparse_tensor::makeNonEmptySubSectIterator(
OpBuilder &b, Location l, const SparseIterator *parent, Value loopBound,
std::unique_ptr<SparseIterator> &&delegate, Value size, unsigned stride,
SparseEmitStrategy strategy) { … }
std::unique_ptr<SparseIterator> sparse_tensor::makeTraverseSubSectIterator(
OpBuilder &b, Location l, const SparseIterator &subSectIter,
const SparseIterator &parent, std::unique_ptr<SparseIterator> &&wrap,
Value loopBound, unsigned stride, SparseEmitStrategy strategy) { … }
#undef CMPI
#undef C_IDX
#undef YIELD
#undef ADDI
#undef ANDI
#undef SUBI
#undef MULI
#undef SELECT