#pragma once #include "mlir/IR/BuiltinTypes.h" #include "mlir/IR/OpDefinition.h" #include "mlir/IR/PatternMatch.h" #include "mlir/IR/Value.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include #include #include #include namespace onnx_mlir { using HSliceId = size_t; using CoreId = size_t; llvm::SmallVector computeRowMajorStrides(llvm::ArrayRef shape); llvm::SmallVector delinearizeIndex(int64_t linearIndex, llvm::ArrayRef shape, llvm::ArrayRef strides); int64_t linearizeIndex(llvm::ArrayRef indices, llvm::ArrayRef strides); int64_t getNumElements(llvm::ArrayRef shape); bool hasByteSizedElementType(mlir::Type elementType); size_t getElementTypeSizeInBytes(mlir::Type elementType); size_t getShapedTypeSizeInBytes(mlir::ShapedType shapedType); bool isMemoryContiguous(llvm::ArrayRef srcShape, llvm::ArrayRef offsets, llvm::ArrayRef sizes, llvm::ArrayRef strides); bool isContiguousSubviewWithDynamicOffsets(llvm::ArrayRef sourceShape, llvm::ArrayRef mixedOffsets, llvm::ArrayRef staticSizes, llvm::ArrayRef staticStrides); template > constexpr C ceilIntegerDivide(A a, B b) { static_assert(std::is_integral_v, "A must be an integer type"); static_assert(std::is_integral_v, "B must be an integer type"); C ac = static_cast(a); C bc = static_cast(b); return 1 + (ac - 1) / bc; } template > constexpr std::pair ceilIntegerDivideWithRemainder(A a, B b) { static_assert(std::is_integral_v, "A must be an integer type"); static_assert(std::is_integral_v, "B must be an integer type"); C ac = static_cast(a); C bc = static_cast(b); return {ceilIntegerDivide(ac, bc), ac % bc}; } template bool isVectorShape(mlir::ArrayRef shape) { return shape.size() == 2 && (shape[0] == 1 || shape[1] == 1); } template bool isMatrixShape(mlir::ArrayRef shape) { return shape.size() == 2; } template bool isHVectorShape(mlir::ArrayRef shape) { return shape.size() == 2 && shape[0] == 1; } inline auto getTensorShape(mlir::Value tensor) { return mlir::cast(tensor.getType()).getShape(); } inline bool haveSameStaticShape(mlir::Value lhs, mlir::Value rhs) { auto lhsType = mlir::dyn_cast(lhs.getType()); auto rhsType = mlir::dyn_cast(rhs.getType()); return lhsType && rhsType && lhsType.hasStaticShape() && rhsType.hasStaticShape() && lhsType.getShape() == rhsType.getShape(); } bool hasStaticPositiveShape(mlir::ArrayRef shape); bool hasStaticPositiveShape(mlir::RankedTensorType type); int64_t getStaticShapeElementCount(mlir::ArrayRef shape); llvm::SmallVector permuteShape(mlir::ArrayRef shape, mlir::ArrayRef permutation); llvm::SmallVector invertPermutation(mlir::ArrayRef permutation); mlir::FailureOr> getTransposePermutationChecked(std::optional permAttr, int64_t rank); llvm::SmallVector getStaticIndexAttrs(mlir::Builder& builder, llvm::ArrayRef values); llvm::SmallVector getUnitStrides(mlir::PatternRewriter& rewriter, int64_t rank); llvm::SmallVector getZeroOffsets(mlir::PatternRewriter& rewriter, int64_t rank); llvm::SmallVector getStaticSizes(mlir::PatternRewriter& rewriter, llvm::ArrayRef shape); } // namespace onnx_mlir