20 #define DEBUG_TYPE "vector-interleave-lowering"
49 class UnrollInterleaveOp final :
public OpRewritePattern<vector::InterleaveOp> {
51 UnrollInterleaveOp(int64_t targetRank,
MLIRContext *context,
55 LogicalResult matchAndRewrite(vector::InterleaveOp op,
57 VectorType resultType = op.getResultVectorType();
62 auto loc = op.getLoc();
63 Value result = arith::ConstantOp::create(rewriter, loc, resultType,
65 for (
auto position : *unrollIterator) {
67 ExtractOp::create(rewriter, loc, op.getLhs(), position);
69 ExtractOp::create(rewriter, loc, op.getRhs(), position);
71 InterleaveOp::create(rewriter, loc, extractLhs, extractRhs);
72 result = InsertOp::create(rewriter, loc, interleave, result, position);
80 int64_t targetRank = 1;
113 class UnrollDeinterleaveOp final
116 UnrollDeinterleaveOp(int64_t targetRank,
MLIRContext *context,
120 LogicalResult matchAndRewrite(vector::DeinterleaveOp op,
122 VectorType resultType = op.getResultVectorType();
127 auto loc = op.getLoc();
128 Value emptyResult = arith::ConstantOp::create(
129 rewriter, loc, resultType, rewriter.
getZeroAttr(resultType));
130 Value evenResult = emptyResult;
131 Value oddResult = emptyResult;
133 for (
auto position : *unrollIterator) {
135 vector::ExtractOp::create(rewriter, loc, op.getSource(), position);
137 vector::DeinterleaveOp::create(rewriter, loc, extractSrc);
138 evenResult = vector::InsertOp::create(
139 rewriter, loc, deinterleave.getRes1(), evenResult, position);
140 oddResult = vector::InsertOp::create(
141 rewriter, loc, deinterleave.getRes2(), oddResult, position);
148 int64_t targetRank = 1;
168 LogicalResult matchAndRewrite(vector::InterleaveOp op,
170 VectorType sourceType = op.getSourceVectorType();
171 if (sourceType.getRank() != 1 || sourceType.isScalable()) {
174 int64_t n = sourceType.getNumElements();
175 auto seq = llvm::seq<int64_t>(2 * n);
176 auto zip = llvm::to_vector(llvm::map_range(
177 seq, [n](int64_t i) {
return (i % 2 ? n : 0) + i / 2; }));
187 patterns.add<UnrollInterleaveOp, UnrollDeinterleaveOp>(
188 targetRank,
patterns.getContext(), benefit);
TypedAttr getZeroAttr(Type type)
MLIRContext is the top-level object for a collection of MLIR operations.
This class represents the benefit of a pattern match in a unitless scheme that ranges from 0 (very li...
A special type of RewriterBase that coordinates the application of a rewrite pattern on the current I...
virtual void replaceOp(Operation *op, ValueRange newValues)
Replace the results of the given (original) operation with the specified list of values (replacements...
OpTy replaceOpWithNewOp(Operation *op, Args &&...args)
Replace the results of the given (original) op with a new op that is created without verification (re...
This class provides an abstraction over the different types of ranges over Values.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
void populateVectorInterleaveToShufflePatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
std::optional< StaticTileOffsetRange > createUnrollIterator(VectorType vType, int64_t targetRank=1)
Returns an iterator for all positions in the leading dimensions of vType up to the targetRank.
void populateVectorInterleaveLoweringPatterns(RewritePatternSet &patterns, int64_t targetRank=1, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
Include the generated interface declarations.
const FrozenRewritePatternSet & patterns
OpRewritePattern is a wrapper around RewritePattern that allows for matching and rewriting against an...
OpRewritePattern(MLIRContext *context, PatternBenefit benefit=1, ArrayRef< StringRef > generatedNames={})
Patterns must specify the root operation name they match against, and can also specify the benefit of...