This reduces the dependencies of the MLIRVector target and makes the dialect consistent with other dialects.
Differential Revision: https://reviews.llvm.org/D118533
The list of Vector is currently undergoing evolutions and is best kept track of
by following the evolution of the
-[VectorOps.td](https://github.com/llvm/llvm-project/blob/main/mlir/include/mlir/Dialect/Vector/VectorOps.td)
+[VectorOps.td](https://github.com/llvm/llvm-project/blob/main/mlir/include/mlir/Dialect/Vector/IR/VectorOps.td)
ODS file (markdown documentation is automatically generated locally when
building and populates the
[Vector doc](https://github.com/llvm/llvm-project/blob/main/mlir/docs/Dialects/Vector.md)).
#include "mlir/Dialect/SCF/Utils/Utils.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
#include "mlir/Dialect/Utils/StaticValueUtils.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/Dialect/X86Vector/Transforms.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Transforms/DialectConversion.h"
--- /dev/null
+//===- IndexingUtils.h - Helpers related to index computations --*- 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This header file defines utilities and common canonicalization patterns for
+// reshape operations.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_DIALECT_UTILS_INDEXINGUTILS_H
+#define MLIR_DIALECT_UTILS_INDEXINGUTILS_H
+
+#include "mlir/Support/LLVM.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/SmallVector.h"
+
+namespace mlir {
+class ArrayAttr;
+
+/// Computes and returns the linearized index of 'offsets' w.r.t. 'basis'.
+int64_t linearize(ArrayRef<int64_t> offsets, ArrayRef<int64_t> basis);
+
+/// Given the strides together with a linear index in the dimension
+/// space, returns the vector-space offsets in each dimension for a
+/// de-linearized index.
+SmallVector<int64_t, 4> delinearize(ArrayRef<int64_t> strides,
+ int64_t linearIndex);
+
+/// Helper that returns a subset of `arrayAttr` as a vector of int64_t.
+SmallVector<int64_t, 4> getI64SubArray(ArrayAttr arrayAttr,
+ unsigned dropFront = 0,
+ unsigned dropBack = 0);
+} // namespace mlir
+
+#endif // MLIR_DIALECT_UTILS_INDEXINGUTILS_H
-add_mlir_dialect(VectorOps vector)
-add_mlir_doc(VectorOps VectorOps Dialects/ -gen-op-doc)
-
-set(LLVM_TARGET_DEFINITIONS VectorOps.td)
-mlir_tablegen(VectorOpsEnums.h.inc -gen-enum-decls)
-mlir_tablegen(VectorOpsEnums.cpp.inc -gen-enum-defs)
-add_public_tablegen_target(MLIRVectorOpsEnumsIncGen)
-add_dependencies(mlir-headers MLIRVectorOpsEnumsIncGen)
+add_subdirectory(IR)
+add_subdirectory(Transforms)
--- /dev/null
+add_mlir_dialect(VectorOps vector)
+add_mlir_doc(VectorOps VectorOps Dialects/ -gen-op-doc)
+
+set(LLVM_TARGET_DEFINITIONS VectorOps.td)
+mlir_tablegen(VectorOpsEnums.h.inc -gen-enum-decls)
+mlir_tablegen(VectorOpsEnums.cpp.inc -gen-enum-defs)
+add_public_tablegen_target(MLIRVectorOpsEnumsIncGen)
+add_dependencies(mlir-headers MLIRVectorOpsEnumsIncGen)
//
//===----------------------------------------------------------------------===//
-#ifndef MLIR_DIALECT_VECTOR_VECTOROPS_H
-#define MLIR_DIALECT_VECTOR_VECTOROPS_H
+#ifndef MLIR_DIALECT_VECTOR_IR_VECTOROPS_H
+#define MLIR_DIALECT_VECTOR_IR_VECTOROPS_H
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "llvm/ADT/StringExtras.h"
// Pull in all enum type definitions and utility function declarations.
-#include "mlir/Dialect/Vector/VectorOpsEnums.h.inc"
+#include "mlir/Dialect/Vector/IR/VectorOpsEnums.h.inc"
namespace mlir {
class MLIRContext;
class RewritePatternSet;
namespace vector {
+class TransferReadOp;
+class TransferWriteOp;
class VectorDialect;
namespace detail {
/// return true for memrefs with no strides.
bool isLastMemrefDimUnitStride(MemRefType type);
-namespace impl {
/// Build the default minor identity map suitable for a vector transfer. This
/// also handles the case memref<... x vector<...>> -> vector<...> in which the
/// rank of the identity map must take the vector element type into account.
AffineMap getTransferMinorIdentityMap(ShapedType shapedType,
VectorType vectorType);
-} // namespace impl
+
+/// Return true if the transfer_write fully writes the data accessed by the
+/// transfer_read.
+bool checkSameValueRAW(TransferWriteOp defWrite, TransferReadOp read);
+
+/// Return true if the write op fully over-write the priorWrite transfer_write
+/// op.
+bool checkSameValueWAW(TransferWriteOp write, TransferWriteOp priorWrite);
+
+/// Same behavior as `isDisjointTransferSet` but doesn't require the operations
+/// to have the same tensor/memref. This allows comparing operations accessing
+/// different tensors.
+bool isDisjointTransferIndices(VectorTransferOpInterface transferA,
+ VectorTransferOpInterface transferB);
+
+/// Return true if we can prove that the transfer operations access disjoint
+/// memory.
+bool isDisjointTransferSet(VectorTransferOpInterface transferA,
+ VectorTransferOpInterface transferB);
} // namespace vector
} // namespace mlir
#define GET_OP_CLASSES
-#include "mlir/Dialect/Vector/VectorOps.h.inc"
-#include "mlir/Dialect/Vector/VectorOpsDialect.h.inc"
+#include "mlir/Dialect/Vector/IR/VectorOps.h.inc"
+#include "mlir/Dialect/Vector/IR/VectorOpsDialect.h.inc"
-#endif // MLIR_DIALECT_VECTOR_VECTOROPS_H
+#endif // MLIR_DIALECT_VECTOR_IR_VECTOROPS_H
--- /dev/null
+# This dialect does currently not have any passes.
//
//===----------------------------------------------------------------------===//
-#ifndef MLIR_DIALECT_VECTOR_VECTORREWRITEPATTERNS_H
-#define MLIR_DIALECT_VECTOR_VECTORREWRITEPATTERNS_H
+#ifndef MLIR_DIALECT_VECTOR_TRANSFORMS_VECTORREWRITEPATTERNS_H
+#define MLIR_DIALECT_VECTOR_TRANSFORMS_VECTORREWRITEPATTERNS_H
#include <utility>
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/PatternMatch.h"
} // namespace vector
} // namespace mlir
-#endif // MLIR_DIALECT_VECTOR_VECTORREWRITEPATTERNS_H
+#endif // MLIR_DIALECT_VECTOR_TRANSFORMS_VECTORREWRITEPATTERNS_H
//
//===----------------------------------------------------------------------===//
-#ifndef MLIR_DIALECT_VECTOR_VECTORTRANSFORMS_H
-#define MLIR_DIALECT_VECTOR_VECTORTRANSFORMS_H
+#ifndef MLIR_DIALECT_VECTOR_TRANSFORMS_VECTORTRANSFORMS_H
+#define MLIR_DIALECT_VECTOR_TRANSFORMS_VECTORTRANSFORMS_H
-#include "mlir/Dialect/Vector/VectorRewritePatterns.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/Transforms/VectorRewritePatterns.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
namespace mlir {
class MLIRContext;
} // namespace vector
} // namespace mlir
-#endif // MLIR_DIALECT_VECTOR_VECTORTRANSFORMS_H
+#endif // MLIR_DIALECT_VECTOR_TRANSFORMS_VECTORTRANSFORMS_H
//
//===----------------------------------------------------------------------===//
-#ifndef MLIR_DIALECT_VECTOR_VECTORUTILS_H_
-#define MLIR_DIALECT_VECTOR_VECTORUTILS_H_
+#ifndef MLIR_DIALECT_VECTOR_UTILS_VECTORUTILS_H_
+#define MLIR_DIALECT_VECTOR_UTILS_VECTORUTILS_H_
#include "mlir/IR/BuiltinAttributes.h"
#include "mlir/Support/LLVM.h"
SmallVector<int64_t, 4> computeStrides(ArrayRef<int64_t> shape,
ArrayRef<int64_t> sizes);
-/// Computes and returns the linearized index of 'offsets' w.r.t. 'basis'.
-int64_t linearize(ArrayRef<int64_t> offsets, ArrayRef<int64_t> basis);
-
-/// Given the strides together with a linear index in the dimension
-/// space, returns the vector-space offsets in each dimension for a
-/// de-linearized index.
-SmallVector<int64_t, 4> delinearize(ArrayRef<int64_t> strides,
- int64_t linearIndex);
-
/// Given the target sizes of a vector, together with vector-space offsets,
/// returns the element-space offsets for each dimension.
SmallVector<int64_t, 4>
makePermutationMap(Operation *insertPoint, ArrayRef<Value> indices,
const DenseMap<Operation *, unsigned> &loopToVectorDim);
-/// Build the default minor identity map suitable for a vector transfer. This
-/// also handles the case memref<... x vector<...>> -> vector<...> in which the
-/// rank of the identity map must take the vector element type into account.
-AffineMap getTransferMinorIdentityMap(ShapedType shapedType,
- VectorType vectorType);
-
-/// Return true if we can prove that the transfer operations access disjoint
-/// memory.
-bool isDisjointTransferSet(VectorTransferOpInterface transferA,
- VectorTransferOpInterface transferB);
-
-/// Same behavior as `isDisjointTransferSet` but doesn't require the operations
-/// to have the same tensor/memref. This allows comparing operations accessing
-/// different tensors.
-bool isDisjointTransferIndices(VectorTransferOpInterface transferA,
- VectorTransferOpInterface transferB);
-
-/// Return true if the transfer_write fully writes the data accessed by the
-/// transfer_read.
-bool checkSameValueRAW(vector::TransferWriteOp defWrite,
- vector::TransferReadOp read);
-
-/// Return true if the write op fully over-write the priorWrite transfer_write
-/// op.
-bool checkSameValueWAW(vector::TransferWriteOp write,
- vector::TransferWriteOp priorWrite);
-
-// Helper that returns a subset of `arrayAttr` as a vector of int64_t.
-SmallVector<int64_t, 4> getI64SubArray(ArrayAttr arrayAttr,
- unsigned dropFront = 0,
- unsigned dropBack = 0);
-
namespace matcher {
/// Matches vector.transfer_read, vector.transfer_write and ops that return a
} // namespace matcher
} // namespace mlir
-#endif // MLIR_DIALECT_VECTOR_VECTORUTILS_H_
+#endif // MLIR_DIALECT_VECTOR_UTILS_VECTORUTILS_H_
#include "mlir/Dialect/Tensor/IR/TensorInferTypeOpInterfaceImpl.h"
#include "mlir/Dialect/Tensor/IR/TensorTilingInterfaceImpl.h"
#include "mlir/Dialect/Tosa/IR/TosaOps.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Dialect/X86Vector/X86VectorDialect.h"
#include "mlir/IR/Dialect.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/SCF/SCF.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/AffineExprVisitor.h"
#include "mlir/IR/BlockAndValueMapping.h"
#include "mlir/IR/Builders.h"
#include "mlir/Conversion/ArmNeon2dToIntr/ArmNeon2dToIntr.h"
#include "../PassDetail.h"
#include "mlir/Dialect/ArmNeon/ArmNeonDialect.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassRegistry.h"
#include "mlir/Dialect/GPU/Passes.h"
#include "mlir/Dialect/LLVMIR/ROCDLDialect.h"
#include "mlir/Dialect/Math/IR/Math.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Transforms/DialectConversion.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
LINK_LIBS PUBLIC
MLIRArithmetic
+ MLIRDialectUtils
MLIRMath
MLIRStandardOpsTransforms
MLIRVector
+ MLIRVectorUtils
)
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/Math/IR/Math.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Utils/IndexingUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/BuiltinDialect.h"
#include "mlir/IR/PatternMatch.h"
MLIRMemRef
MLIRTransforms
MLIRVector
+ MLIRVectorUtils
)
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/SCF/SCF.h"
#include "mlir/Dialect/Utils/StructuredOpsUtils.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/Builders.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
MLIRTargetLLVMIRExport
MLIRTransforms
MLIRVector
+ MLIRVectorTransforms
MLIRX86Vector
MLIRX86VectorTransforms
)
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/Support/MathExtras.h"
#include "mlir/Target/LLVMIR/TypeToLLVM.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorRewritePatterns.h"
+#include "mlir/Dialect/Vector/Transforms/VectorRewritePatterns.h"
#include "mlir/Dialect/X86Vector/Transforms.h"
#include "mlir/Dialect/X86Vector/X86VectorDialect.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/Dialect/LLVMIR/ROCDLDialect.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Transforms/DialectConversion.h"
MLIRMemRef
MLIRTransforms
MLIRVector
+ MLIRVectorTransforms
)
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/SCF/SCF.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Dialect/SPIRV/IR/SPIRVOps.h"
#include "mlir/Dialect/SPIRV/IR/SPIRVTypes.h"
#include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Transforms/DialectConversion.h"
#include <numeric>
MLIRStandard
MLIRTransformUtils
MLIRVector
+ MLIRVectorUtils
MLIRVectorToLLVM
)
#include "mlir/Dialect/Affine/IR/AffineOps.h"
#include "mlir/Dialect/Affine/Utils.h"
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/BlockAndValueMapping.h"
#include "mlir/Support/LLVM.h"
#include "llvm/ADT/STLExtras.h"
//===----------------------------------------------------------------------===//
#include "mlir/Dialect/ArmNeon/ArmNeonDialect.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/OpImplementation.h"
#include "mlir/IR/TypeUtilities.h"
#include "mlir/Dialect/Linalg/ComprehensiveBufferize/VectorInterfaceImpl.h"
#include "mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/Dialect.h"
#include "mlir/IR/Operation.h"
#include "mlir/Dialect/StandardOps/Transforms/Passes.h"
#include "mlir/Dialect/StandardOps/Utils/Utils.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/BuiltinDialect.h"
#include "mlir/IR/Operation.h"
#include "mlir/Pass/Pass.h"
MLIRTransformUtils
MLIRVector
MLIRVectorBufferizableOpInterfaceImpl
+ MLIRVectorTransforms
+ MLIRVectorUtils
MLIRX86VectorTransforms
MLIRVectorToSCF
)
#include "mlir/Dialect/Linalg/Passes.h"
#include "mlir/Dialect/Linalg/Transforms/Hoisting.h"
#include "mlir/Dialect/SCF/Transforms.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/Pass/PassManager.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
#include "mlir/Transforms/Passes.h"
#include "mlir/Dialect/SCF/Utils/Utils.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/AsmState.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/Dominance.h"
#include "mlir/Dialect/SCF/Utils/Utils.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/Dominance.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
continue;
}
auto read = dyn_cast<vector::TransferReadOp>(user);
- if (!read || !isDisjointTransferIndices(
+ if (!read || !vector::isDisjointTransferIndices(
cast<VectorTransferOpInterface>(read.getOperation()),
cast<VectorTransferOpInterface>(
write.transferWriteOp.getOperation()))) {
continue;
if (auto transferWriteUse =
dyn_cast<vector::TransferWriteOp>(use.getOwner())) {
- if (!isDisjointTransferSet(
+ if (!vector::isDisjointTransferSet(
cast<VectorTransferOpInterface>(transferWrite.getOperation()),
cast<VectorTransferOpInterface>(
transferWriteUse.getOperation())))
return WalkResult::advance();
} else if (auto transferReadUse =
dyn_cast<vector::TransferReadOp>(use.getOwner())) {
- if (!isDisjointTransferSet(
+ if (!vector::isDisjointTransferSet(
cast<VectorTransferOpInterface>(transferWrite.getOperation()),
cast<VectorTransferOpInterface>(
transferReadUse.getOperation())))
#include "mlir/Dialect/Linalg/Transforms/Transforms.h"
#include "mlir/Dialect/Linalg/Utils/Utils.h"
#include "mlir/Dialect/Utils/StructuredOpsUtils.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/AffineExpr.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Dialect/Linalg/Utils/Utils.h"
#include "mlir/Dialect/SCF/Transforms.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/IR/AffineExpr.h"
#include "mlir/IR/AffineMap.h"
#include "mlir/Pass/PassManager.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
#include "mlir/Dialect/Utils/StaticValueUtils.h"
#include "mlir/Dialect/Utils/StructuredOpsUtils.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/AffineExpr.h"
#include "mlir/IR/Matchers.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Dialect/Linalg/Utils/Utils.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
#include "mlir/Dialect/Utils/StructuredOpsUtils.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/IR/AffineExpr.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/Math/IR/Math.h"
#include "mlir/Dialect/Math/Transforms/Passes.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/TypeUtilities.h"
LINK_LIBS PUBLIC
MLIRArithmetic
+ MLIRDialectUtils
MLIRIR
MLIRMath
MLIRPass
MLIRTransforms
MLIRX86Vector
MLIRVector
+ MLIRVectorUtils
)
#include "mlir/Dialect/Math/IR/Math.h"
#include "mlir/Dialect/Math/Transforms/Approximation.h"
#include "mlir/Dialect/Math/Transforms/Passes.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Utils/IndexingUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/Dialect/X86Vector/X86VectorDialect.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/MemRef/Transforms/Passes.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
#include "mlir/Dialect/SparseTensor/Transforms/Passes.h"
#include "mlir/Dialect/SparseTensor/Utils/Merger.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/TensorEncoding.h"
#include "llvm/ADT/SmallBitVector.h"
add_mlir_library(MLIRDialectUtils
+ IndexingUtils.cpp
ReshapeOpsUtils.cpp
StructuredOpsUtils.cpp
StaticValueUtils.cpp
--- /dev/null
+//===- IndexingUtils.cpp - Helpers related to index computations ----------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Dialect/Utils/IndexingUtils.h"
+
+#include "mlir/IR/BuiltinAttributes.h"
+
+int64_t mlir::linearize(ArrayRef<int64_t> offsets, ArrayRef<int64_t> basis) {
+ assert(offsets.size() == basis.size());
+ int64_t linearIndex = 0;
+ for (unsigned idx = 0, e = basis.size(); idx < e; ++idx)
+ linearIndex += offsets[idx] * basis[idx];
+ return linearIndex;
+}
+
+llvm::SmallVector<int64_t, 4> mlir::delinearize(ArrayRef<int64_t> sliceStrides,
+ int64_t index) {
+ int64_t rank = sliceStrides.size();
+ SmallVector<int64_t, 4> vectorOffsets(rank);
+ for (int64_t r = 0; r < rank; ++r) {
+ assert(sliceStrides[r] > 0);
+ vectorOffsets[r] = index / sliceStrides[r];
+ index %= sliceStrides[r];
+ }
+ return vectorOffsets;
+}
+
+llvm::SmallVector<int64_t, 4> mlir::getI64SubArray(ArrayAttr arrayAttr,
+ unsigned dropFront,
+ unsigned dropBack) {
+ assert(arrayAttr.size() > dropFront + dropBack && "Out of bounds");
+ auto range = arrayAttr.getAsRange<IntegerAttr>();
+ SmallVector<int64_t, 4> res;
+ res.reserve(arrayAttr.size() - dropFront - dropBack);
+ for (auto it = range.begin() + dropFront, eit = range.end() - dropBack;
+ it != eit; ++it)
+ res.push_back((*it).getValue().getSExtValue());
+ return res;
+}
-add_mlir_dialect_library(MLIRVector
- VectorDropLeadUnitDim.cpp
- VectorInsertExtractStridedSliceRewritePatterns.cpp
- VectorMultiDimReductionTransforms.cpp
- VectorOps.cpp
- VectorTransferOpTransforms.cpp
- VectorTransferSplitRewritePatterns.cpp
- VectorTransferPermutationMapRewritePatterns.cpp
- VectorTransforms.cpp
- VectorUnrollDistribute.cpp
- VectorUtils.cpp
-
- ADDITIONAL_HEADER_DIRS
- ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Vector
-
- DEPENDS
- MLIRVectorOpsIncGen
- MLIRVectorOpsEnumsIncGen
-
- LINK_LIBS PUBLIC
- MLIRArithmetic
- MLIRDialectUtils
- MLIRIR
- MLIRStandard
- MLIRAffine
- MLIRAffineUtils
- MLIRLinalg
- MLIRMemRef
- MLIRSCF
- MLIRAffineAnalysis
- MLIRDataLayoutInterfaces
- MLIRSideEffectInterfaces
- MLIRVectorInterfaces
- )
+add_subdirectory(IR)
+add_subdirectory(Transforms)
+add_subdirectory(Utils)
--- /dev/null
+add_mlir_dialect_library(MLIRVector
+ VectorOps.cpp
+
+ ADDITIONAL_HEADER_DIRS
+ ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Vector/IR
+
+ DEPENDS
+ MLIRVectorOpsIncGen
+ MLIRVectorOpsEnumsIncGen
+
+ LINK_LIBS PUBLIC
+ MLIRAffine
+ MLIRAffineAnalysis
+ MLIRAffineUtils
+ MLIRArithmetic
+ MLIRDialectUtils
+ MLIRIR
+ MLIRMemRef
+ MLIRStandard
+ MLIRSideEffectInterfaces
+ MLIRVectorInterfaces
+ )
//
//===----------------------------------------------------------------------===//
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/Dialect/StandardOps/Utils/Utils.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
+#include "mlir/Dialect/Utils/IndexingUtils.h"
#include "mlir/Dialect/Utils/StructuredOpsUtils.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
#include "mlir/IR/AffineExpr.h"
#include "mlir/IR/AffineMap.h"
#include "mlir/IR/BlockAndValueMapping.h"
#include "llvm/ADT/bit.h"
#include <numeric>
-#include "mlir/Dialect/Vector/VectorOpsDialect.cpp.inc"
+#include "mlir/Dialect/Vector/IR/VectorOpsDialect.cpp.inc"
// Pull in all enum type and utility function definitions.
-#include "mlir/Dialect/Vector/VectorOpsEnums.cpp.inc"
+#include "mlir/Dialect/Vector/IR/VectorOpsEnums.cpp.inc"
using namespace mlir;
using namespace mlir::vector;
return succeeded(successStrides) && (strides.empty() || strides.back() == 1);
}
+AffineMap mlir::vector::getTransferMinorIdentityMap(ShapedType shapedType,
+ VectorType vectorType) {
+ int64_t elementVectorRank = 0;
+ VectorType elementVectorType =
+ shapedType.getElementType().dyn_cast<VectorType>();
+ if (elementVectorType)
+ elementVectorRank += elementVectorType.getRank();
+ // 0-d transfers are to/from tensor<t>/memref<t> and vector<1xt>.
+ // TODO: replace once we have 0-d vectors.
+ if (shapedType.getRank() == 0 &&
+ vectorType.getShape() == ArrayRef<int64_t>{1})
+ return AffineMap::get(
+ /*numDims=*/0, /*numSymbols=*/0,
+ getAffineConstantExpr(0, shapedType.getContext()));
+ return AffineMap::getMinorIdentityMap(
+ shapedType.getRank(), vectorType.getRank() - elementVectorRank,
+ shapedType.getContext());
+}
+
+bool mlir::vector::checkSameValueRAW(vector::TransferWriteOp defWrite,
+ vector::TransferReadOp read) {
+ return !defWrite.hasOutOfBoundsDim() && !defWrite.mask() && !read.mask() &&
+ defWrite.indices() == read.indices() &&
+ defWrite.getVectorType() == read.getVectorType() &&
+ defWrite.permutation_map() == read.permutation_map();
+}
+
+bool mlir::vector::checkSameValueWAW(vector::TransferWriteOp write,
+ vector::TransferWriteOp priorWrite) {
+ return priorWrite.indices() == write.indices() &&
+ priorWrite.mask() == write.mask() &&
+ priorWrite.getVectorType() == write.getVectorType() &&
+ priorWrite.permutation_map() == write.permutation_map();
+}
+
+bool mlir::vector::isDisjointTransferIndices(
+ VectorTransferOpInterface transferA, VectorTransferOpInterface transferB) {
+ // For simplicity only look at transfer of same type.
+ if (transferA.getVectorType() != transferB.getVectorType())
+ return false;
+ unsigned rankOffset = transferA.getLeadingShapedRank();
+ for (unsigned i = 0, e = transferA.indices().size(); i < e; i++) {
+ auto indexA = transferA.indices()[i].getDefiningOp<arith::ConstantOp>();
+ auto indexB = transferB.indices()[i].getDefiningOp<arith::ConstantOp>();
+ // If any of the indices are dynamic we cannot prove anything.
+ if (!indexA || !indexB)
+ continue;
+
+ if (i < rankOffset) {
+ // For leading dimensions, if we can prove that index are different we
+ // know we are accessing disjoint slices.
+ if (indexA.getValue().cast<IntegerAttr>().getInt() !=
+ indexB.getValue().cast<IntegerAttr>().getInt())
+ return true;
+ } else {
+ // For this dimension, we slice a part of the memref we need to make sure
+ // the intervals accessed don't overlap.
+ int64_t distance =
+ std::abs(indexA.getValue().cast<IntegerAttr>().getInt() -
+ indexB.getValue().cast<IntegerAttr>().getInt());
+ if (distance >= transferA.getVectorType().getDimSize(i - rankOffset))
+ return true;
+ }
+ }
+ return false;
+}
+
+bool mlir::vector::isDisjointTransferSet(VectorTransferOpInterface transferA,
+ VectorTransferOpInterface transferB) {
+ if (transferA.source() != transferB.source())
+ return false;
+ return isDisjointTransferIndices(transferA, transferB);
+}
+
//===----------------------------------------------------------------------===//
// CombiningKindAttr
//===----------------------------------------------------------------------===//
addOperations<
#define GET_OP_LIST
-#include "mlir/Dialect/Vector/VectorOps.cpp.inc"
+#include "mlir/Dialect/Vector/IR/VectorOps.cpp.inc"
>();
}
}
#define GET_OP_CLASSES
-#include "mlir/Dialect/Vector/VectorOps.cpp.inc"
+#include "mlir/Dialect/Vector/IR/VectorOps.cpp.inc"
--- /dev/null
+add_mlir_dialect_library(MLIRVectorTransforms
+ VectorDropLeadUnitDim.cpp
+ VectorInsertExtractStridedSliceRewritePatterns.cpp
+ VectorMultiDimReductionTransforms.cpp
+ VectorTransferOpTransforms.cpp
+ VectorTransferSplitRewritePatterns.cpp
+ VectorTransferPermutationMapRewritePatterns.cpp
+ VectorTransforms.cpp
+ VectorUnrollDistribute.cpp
+
+ ADDITIONAL_HEADER_DIRS
+ ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Vector/Transforms
+
+ LINK_LIBS PUBLIC
+ MLIRAffine
+ MLIRAffineAnalysis
+ MLIRAffineUtils
+ MLIRArithmetic
+ MLIRDialectUtils
+ MLIRIR
+ MLIRLinalg
+ MLIRMemRef
+ MLIRSCF
+ MLIRStandard
+ MLIRVector
+ MLIRVectorInterfaces
+ MLIRVectorUtils
+ )
//
//===----------------------------------------------------------------------===//
-#include "mlir/Dialect/Vector/VectorRewritePatterns.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/Transforms/VectorRewritePatterns.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/IR/TypeUtilities.h"
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorRewritePatterns.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Utils/IndexingUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Transforms/VectorRewritePatterns.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/BuiltinTypes.h"
using namespace mlir;
//
//===----------------------------------------------------------------------===//
-#include "mlir/Dialect/Vector/VectorRewritePatterns.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/Transforms/VectorRewritePatterns.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/IR/TypeUtilities.h"
//===----------------------------------------------------------------------===//
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/Dominance.h"
#include "llvm/ADT/STLExtras.h"
} else {
if (auto read = dyn_cast<vector::TransferReadOp>(user)) {
// Don't need to consider disjoint reads.
- if (isDisjointTransferSet(
+ if (vector::isDisjointTransferSet(
cast<VectorTransferOpInterface>(write.getOperation()),
cast<VectorTransferOpInterface>(read.getOperation())))
continue;
if (auto write = dyn_cast<vector::TransferWriteOp>(user)) {
// If there is a write, but we can prove that it is disjoint we can ignore
// the write.
- if (isDisjointTransferSet(
+ if (vector::isDisjointTransferSet(
cast<VectorTransferOpInterface>(write.getOperation()),
cast<VectorTransferOpInterface>(read.getOperation())))
continue;
#include "mlir/Dialect/Affine/IR/AffineOps.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/Interfaces/VectorInterfaces.h"
using namespace mlir;
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/Dialect/Utils/StructuredOpsUtils.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Interfaces/VectorInterfaces.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/Dialect/Utils/StructuredOpsUtils.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/PatternMatch.h"
//===----------------------------------------------------------------------===//
#include "mlir/Dialect/Affine/IR/AffineOps.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Utils/IndexingUtils.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/Interfaces/VectorInterfaces.h"
#include "llvm/ADT/MapVector.h"
--- /dev/null
+add_mlir_dialect_library(MLIRVectorUtils
+ VectorUtils.cpp
+
+ ADDITIONAL_HEADER_DIRS
+ ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Vector/Utils
+
+ LINK_LIBS PUBLIC
+ MLIRAffine
+ MLIRAffineAnalysis
+ MLIRArithmetic
+ MLIRDialectUtils
+ MLIRIR
+ MLIRMemRef
+ MLIRStandard
+ MLIRTensor
+ MLIRVector
+ MLIRVectorInterfaces
+ )
//
//===----------------------------------------------------------------------===//
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
+
#include "mlir/Dialect/Affine/Analysis/LoopAnalysis.h"
#include "mlir/Dialect/Affine/IR/AffineOps.h"
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/IntegerSet.h"
#include "mlir/IR/Operation.h"
return sliceStrides;
}
-int64_t mlir::linearize(ArrayRef<int64_t> offsets, ArrayRef<int64_t> basis) {
- assert(offsets.size() == basis.size());
- int64_t linearIndex = 0;
- for (unsigned idx = 0, e = basis.size(); idx < e; ++idx)
- linearIndex += offsets[idx] * basis[idx];
- return linearIndex;
-}
-
-SmallVector<int64_t, 4> mlir::delinearize(ArrayRef<int64_t> sliceStrides,
- int64_t index) {
- int64_t rank = sliceStrides.size();
- SmallVector<int64_t, 4> vectorOffsets(rank);
- for (int64_t r = 0; r < rank; ++r) {
- assert(sliceStrides[r] > 0);
- vectorOffsets[r] = index / sliceStrides[r];
- index %= sliceStrides[r];
- }
- return vectorOffsets;
-}
-
SmallVector<int64_t, 4> mlir::computeElementOffsetsFromVectorSliceOffsets(
ArrayRef<int64_t> sizes, ArrayRef<int64_t> vectorOffsets) {
SmallVector<int64_t, 4> result;
return makePermutationMap(op->getBlock(), indices, loopToVectorDim);
}
-AffineMap mlir::getTransferMinorIdentityMap(ShapedType shapedType,
- VectorType vectorType) {
- int64_t elementVectorRank = 0;
- VectorType elementVectorType =
- shapedType.getElementType().dyn_cast<VectorType>();
- if (elementVectorType)
- elementVectorRank += elementVectorType.getRank();
- // 0-d transfers are to/from tensor<t>/memref<t> and vector<1xt>.
- // TODO: replace once we have 0-d vectors.
- if (shapedType.getRank() == 0 &&
- vectorType.getShape() == ArrayRef<int64_t>{1})
- return AffineMap::get(
- /*numDims=*/0, /*numSymbols=*/0,
- getAffineConstantExpr(0, shapedType.getContext()));
- return AffineMap::getMinorIdentityMap(
- shapedType.getRank(), vectorType.getRank() - elementVectorRank,
- shapedType.getContext());
-}
-
bool matcher::operatesOnSuperVectorsOf(Operation &op,
VectorType subVectorType) {
// First, extract the vector type and distinguish between:
// between parallel, reduction and possibly other cases.
return ratio.hasValue();
}
-
-bool mlir::isDisjointTransferIndices(VectorTransferOpInterface transferA,
- VectorTransferOpInterface transferB) {
- // For simplicity only look at transfer of same type.
- if (transferA.getVectorType() != transferB.getVectorType())
- return false;
- unsigned rankOffset = transferA.getLeadingShapedRank();
- for (unsigned i = 0, e = transferA.indices().size(); i < e; i++) {
- auto indexA = transferA.indices()[i].getDefiningOp<arith::ConstantOp>();
- auto indexB = transferB.indices()[i].getDefiningOp<arith::ConstantOp>();
- // If any of the indices are dynamic we cannot prove anything.
- if (!indexA || !indexB)
- continue;
-
- if (i < rankOffset) {
- // For leading dimensions, if we can prove that index are different we
- // know we are accessing disjoint slices.
- if (indexA.getValue().cast<IntegerAttr>().getInt() !=
- indexB.getValue().cast<IntegerAttr>().getInt())
- return true;
- } else {
- // For this dimension, we slice a part of the memref we need to make sure
- // the intervals accessed don't overlap.
- int64_t distance =
- std::abs(indexA.getValue().cast<IntegerAttr>().getInt() -
- indexB.getValue().cast<IntegerAttr>().getInt());
- if (distance >= transferA.getVectorType().getDimSize(i - rankOffset))
- return true;
- }
- }
- return false;
-}
-
-bool mlir::isDisjointTransferSet(VectorTransferOpInterface transferA,
- VectorTransferOpInterface transferB) {
- if (transferA.source() != transferB.source())
- return false;
- return isDisjointTransferIndices(transferA, transferB);
-}
-
-bool mlir::checkSameValueRAW(vector::TransferWriteOp defWrite,
- vector::TransferReadOp read) {
- return !defWrite.hasOutOfBoundsDim() && !defWrite.mask() && !read.mask() &&
- defWrite.indices() == read.indices() &&
- defWrite.getVectorType() == read.getVectorType() &&
- defWrite.permutation_map() == read.permutation_map();
-}
-
-bool mlir::checkSameValueWAW(vector::TransferWriteOp write,
- vector::TransferWriteOp priorWrite) {
- return priorWrite.indices() == write.indices() &&
- priorWrite.mask() == write.mask() &&
- priorWrite.getVectorType() == write.getVectorType() &&
- priorWrite.permutation_map() == write.permutation_map();
-}
-
-SmallVector<int64_t, 4> mlir::getI64SubArray(ArrayAttr arrayAttr,
- unsigned dropFront,
- unsigned dropBack) {
- assert(arrayAttr.size() > dropFront + dropBack && "Out of bounds");
- auto range = arrayAttr.getAsRange<IntegerAttr>();
- SmallVector<int64_t, 4> res;
- res.reserve(arrayAttr.size() - dropFront - dropBack);
- for (auto it = range.begin() + dropFront, eit = range.end() - dropBack;
- it != eit; ++it)
- res.push_back((*it).getValue().getSExtValue());
- return res;
-}
//===----------------------------------------------------------------------===//
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Dialect/X86Vector/Transforms.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/IR/Matchers.h"
#define PYTHON_BINDINGS_VECTOR_OPS
include "mlir/Bindings/Python/Attributes.td"
-include "mlir/Dialect/Vector/VectorOps.td"
+include "mlir/Dialect/Vector/IR/VectorOps.td"
#endif
Core
LINK_LIBS PUBLIC
+ MLIRAffineTransforms
+ MLIRAffineUtils
MLIRIR
MLIRPass
- MLIRAffineTransforms
MLIRSupport
- MLIRAffineUtils
+ MLIRVectorUtils
)
#include "mlir/Dialect/Affine/IR/AffineOps.h"
#include "mlir/Dialect/Affine/LoopUtils.h"
#include "mlir/Dialect/Affine/Utils.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
-#include "mlir/Dialect/Vector/VectorUtils.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
+#include "mlir/Dialect/Vector/Utils/VectorUtils.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/Diagnostics.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/Dialect/StandardOps/Transforms/BufferizableOpInterfaceImpl.h"
#include "mlir/Dialect/Tensor/Transforms/BufferizableOpInterfaceImpl.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Pass/PassManager.h"
#include "mlir/Transforms/Passes.h"
#include "mlir/Dialect/Linalg/Transforms/CodegenStrategy.h"
#include "mlir/Dialect/Linalg/Utils/Utils.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Dialect/Linalg/Transforms/Transforms.h"
#include "mlir/Dialect/Linalg/Utils/Utils.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Pass/PassManager.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
#include "mlir/Dialect/Math/IR/Math.h"
#include "mlir/Dialect/Math/Transforms/Passes.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/Math/IR/Math.h"
#include "mlir/Dialect/Math/Transforms/Passes.h"
-#include "mlir/Dialect/Vector/VectorOps.h"
+#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Dialect/X86Vector/X86VectorDialect.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/SCF/SCF.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
-#include "mlir/Dialect/Vector/VectorTransforms.h"
+#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassManager.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
":Support",
":Transforms",
":VectorOps",
+ ":VectorUtils",
"//llvm:Support",
],
)
name = "VectorOps",
srcs = glob(
[
- "lib/Dialect/Vector/*.cpp",
- "lib/Dialect/Vector/*.h",
+ "lib/Dialect/Vector/IR/*.cpp",
],
),
hdrs = glob([
- "include/mlir/Dialect/Vector/*.h",
+ "include/mlir/Dialect/Vector/IR/*.h",
]),
includes = ["include"],
deps = [
":Affine",
":AffineAnalysis",
- ":AffineUtils",
- ":Analysis",
":ArithmeticDialect",
- ":DataLayoutInterfaces",
":DialectUtils",
":IR",
- ":LinalgOps",
":MemRefDialect",
- ":SCFDialect",
":SideEffectInterfaces",
":StandardOps",
":Support",
)
cc_library(
+ name = "VectorTransforms",
+ srcs = glob(
+ [
+ "lib/Dialect/Vector/Transforms/*.cpp",
+ ],
+ ),
+ hdrs = glob([
+ "include/mlir/Dialect/Vector/Transforms/*.h",
+ ]),
+ includes = ["include"],
+ deps = [
+ ":Affine",
+ ":AffineAnalysis",
+ ":Analysis",
+ ":ArithmeticDialect",
+ ":DialectUtils",
+ ":IR",
+ ":LinalgOps",
+ ":MemRefDialect",
+ ":SCFDialect",
+ ":StandardOps",
+ ":Support",
+ ":TensorDialect",
+ ":VectorInterfaces",
+ ":VectorOps",
+ ":VectorUtils",
+ "//llvm:Support",
+ ],
+)
+
+cc_library(
+ name = "VectorUtils",
+ srcs = glob(
+ [
+ "lib/Dialect/Vector/Utils/*.cpp",
+ ],
+ ),
+ hdrs = glob([
+ "include/mlir/Dialect/Vector/Utils/*.h",
+ ]),
+ includes = ["include"],
+ deps = [
+ ":Affine",
+ ":AffineAnalysis",
+ ":ArithmeticDialect",
+ ":DialectUtils",
+ ":IR",
+ ":MemRefDialect",
+ ":StandardOps",
+ ":Support",
+ ":TensorDialect",
+ ":VectorInterfaces",
+ ":VectorOps",
+ "//llvm:Support",
+ ],
+)
+
+cc_library(
name = "Support",
srcs = glob(
[
":VectorBufferizableOpInterfaceImpl",
":VectorOps",
":VectorToSCF",
+ ":VectorTransforms",
+ ":VectorUtils",
":X86VectorTransforms",
"//llvm:Support",
],
td_library(
name = "VectorOpsTdFiles",
- srcs = ["include/mlir/Dialect/Vector/VectorOps.td"],
+ srcs = ["include/mlir/Dialect/Vector/IR/VectorOps.td"],
includes = ["include"],
deps = [
":OpBaseTdFiles",
tbl_outs = [
(
["-gen-op-decls"],
- "include/mlir/Dialect/Vector/VectorOps.h.inc",
+ "include/mlir/Dialect/Vector/IR/VectorOps.h.inc",
),
(
["-gen-op-defs"],
- "include/mlir/Dialect/Vector/VectorOps.cpp.inc",
+ "include/mlir/Dialect/Vector/IR/VectorOps.cpp.inc",
),
(
[
"-gen-dialect-decls",
"-dialect=vector",
],
- "include/mlir/Dialect/Vector/VectorOpsDialect.h.inc",
+ "include/mlir/Dialect/Vector/IR/VectorOpsDialect.h.inc",
),
(
[
"-gen-dialect-defs",
"-dialect=vector",
],
- "include/mlir/Dialect/Vector/VectorOpsDialect.cpp.inc",
+ "include/mlir/Dialect/Vector/IR/VectorOpsDialect.cpp.inc",
),
(
["-gen-enum-decls"],
- "include/mlir/Dialect/Vector/VectorOpsEnums.h.inc",
+ "include/mlir/Dialect/Vector/IR/VectorOpsEnums.h.inc",
),
(
["-gen-enum-defs"],
- "include/mlir/Dialect/Vector/VectorOpsEnums.cpp.inc",
+ "include/mlir/Dialect/Vector/IR/VectorOpsEnums.cpp.inc",
),
(
["-gen-op-doc"],
),
],
tblgen = ":mlir-tblgen",
- td_file = "include/mlir/Dialect/Vector/VectorOps.td",
+ td_file = "include/mlir/Dialect/Vector/IR/VectorOps.td",
deps = [":VectorOpsTdFiles"],
)
":ToLLVMIRTranslation",
":Transforms",
":VectorOps",
+ ":VectorTransforms",
":X86Vector",
":X86VectorTransforms",
"//llvm:Core",
":Support",
":Transforms",
":VectorOps",
+ ":VectorUtils",
"//llvm:Core",
"//llvm:Support",
],
":Support",
":Transforms",
":VectorOps",
+ ":VectorTransforms",
"//llvm:Core",
"//llvm:Support",
],
includes = ["include"],
deps = [
":ArithmeticDialect",
+ ":DialectUtils",
":IR",
":MathDialect",
":Pass",
":Support",
":Transforms",
":VectorOps",
+ ":VectorUtils",
":X86Vector",
"//llvm:Support",
],
deps = [
":ArithmeticDialect",
":ConversionPassIncGen",
+ ":DialectUtils",
":IR",
":LLVMDialect",
":MathDialect",
":Support",
":Transforms",
":VectorOps",
+ ":VectorUtils",
"//llvm:Core",
"//llvm:Support",
],
"//mlir:Support",
"//mlir:Transforms",
"//mlir:VectorOps",
+ "//mlir:VectorUtils",
],
)
"//mlir:TransformUtils",
"//mlir:VectorOps",
"//mlir:VectorToSCF",
+ "//mlir:VectorTransforms",
"//mlir:X86Vector",
],
)