Index: mlir/include/mlir/Dialect/Affine/IR/AffineOps.td =================================================================== --- mlir/include/mlir/Dialect/Affine/IR/AffineOps.td +++ mlir/include/mlir/Dialect/Affine/IR/AffineOps.td @@ -866,6 +866,19 @@ let results = (outs AnyVector:$result); + let builders = [ + /// Builds an affine vector load op with the specified map and operands. + OpBuilder<"OpBuilder &builder, OperationState &result, " + "VectorType resultType, AffineMap map, ValueRange operands">, + /// Builds an affine vector load op with an identity map and operands. + OpBuilder<"OpBuilder &builder, OperationState &result, " + "VectorType resultType, Value memref, ValueRange indices = {}">, + /// Builds an affine vector load op with the specified map and its operands. + OpBuilder<"OpBuilder &builder, OperationState &result, " + "VectorType resultType, Value memref, AffineMap map, " + "ValueRange mapOperands"> + ]; + let extraClassDeclaration = extraClassDeclarationBase # [{ VectorType getVectorType() { return result().getType().cast(); @@ -920,6 +933,15 @@ [MemWrite]>:$memref, Variadic:$indices); + let skipDefaultBuilders = 1; + let builders = [ + OpBuilder<"OpBuilder &builder, OperationState &result, " + "Value valueToStore, Value memref, ValueRange indices">, + OpBuilder<"OpBuilder &builder, OperationState &result, " + "Value valueToStore, Value memref, AffineMap map, " + "ValueRange mapOperands"> + ]; + let extraClassDeclaration = extraClassDeclarationBase # [{ VectorType getVectorType() { return value().getType().cast(); Index: mlir/lib/Dialect/Affine/IR/AffineOps.cpp =================================================================== --- mlir/lib/Dialect/Affine/IR/AffineOps.cpp +++ mlir/lib/Dialect/Affine/IR/AffineOps.cpp @@ -2792,6 +2792,38 @@ // AffineVectorLoadOp //===----------------------------------------------------------------------===// +void AffineVectorLoadOp::build(OpBuilder &builder, OperationState &result, + VectorType resultType, AffineMap map, + ValueRange operands) { + assert(operands.size() == 1 + map.getNumInputs() && "inconsistent operands"); + result.addOperands(operands); + if (map) + result.addAttribute(getMapAttrName(), AffineMapAttr::get(map)); + result.types.push_back(resultType); +} + +void AffineVectorLoadOp::build(OpBuilder &builder, OperationState &result, + VectorType resultType, Value memref, + AffineMap map, ValueRange mapOperands) { + assert(map.getNumInputs() == mapOperands.size() && "inconsistent index info"); + result.addOperands(memref); + result.addOperands(mapOperands); + result.addAttribute(getMapAttrName(), AffineMapAttr::get(map)); + result.types.push_back(resultType); +} + +void AffineVectorLoadOp::build(OpBuilder &builder, OperationState &result, + VectorType resultType, Value memref, + ValueRange indices) { + auto memrefType = memref.getType().cast(); + auto rank = memrefType.getRank(); + // Create identity map for memrefs with at least one dimension or () -> () + // for zero-dimensional memrefs. + auto map = + rank ? builder.getMultiDimIdentityMap(rank) : builder.getEmptyAffineMap(); + build(builder, result, resultType, memref, map, indices); +} + static ParseResult parseAffineVectorLoadOp(OpAsmParser &parser, OperationState &result) { auto &builder = parser.getBuilder(); @@ -2855,6 +2887,29 @@ // AffineVectorStoreOp //===----------------------------------------------------------------------===// +void AffineVectorStoreOp::build(OpBuilder &builder, OperationState &result, + Value valueToStore, Value memref, AffineMap map, + ValueRange mapOperands) { + assert(map.getNumInputs() == mapOperands.size() && "inconsistent index info"); + result.addOperands(valueToStore); + result.addOperands(memref); + result.addOperands(mapOperands); + result.addAttribute(getMapAttrName(), AffineMapAttr::get(map)); +} + +// Use identity map. +void AffineVectorStoreOp::build(OpBuilder &builder, OperationState &result, + Value valueToStore, Value memref, + ValueRange indices) { + auto memrefType = memref.getType().cast(); + auto rank = memrefType.getRank(); + // Create identity map for memrefs with at least one dimension or () -> () + // for zero-dimensional memrefs. + auto map = + rank ? builder.getMultiDimIdentityMap(rank) : builder.getEmptyAffineMap(); + build(builder, result, valueToStore, memref, map, indices); +} + static ParseResult parseAffineVectorStoreOp(OpAsmParser &parser, OperationState &result) { auto indexTy = parser.getBuilder().getIndexType(); Index: mlir/lib/Dialect/Affine/Transforms/AffineParallelNormalize.cpp =================================================================== --- mlir/lib/Dialect/Affine/Transforms/AffineParallelNormalize.cpp +++ mlir/lib/Dialect/Affine/Transforms/AffineParallelNormalize.cpp @@ -14,11 +14,12 @@ #include "mlir/Dialect/Affine/IR/AffineOps.h" #include "mlir/Dialect/Affine/IR/AffineValueMap.h" #include "mlir/Dialect/Affine/Passes.h" +#include "mlir/Dialect/Affine/Utils.h" #include "mlir/IR/PatternMatch.h" using namespace mlir; -void normalizeAffineParallel(AffineParallelOp op) { +void mlir::normalizeAffineParallel(AffineParallelOp op) { AffineMap lbMap = op.lowerBoundsMap(); SmallVector steps = op.getSteps(); // No need to do any work if the parallel op is already normalized.