49struct VectorMaskedLoadOpConverter final
53 LogicalResult matchAndRewrite(vector::MaskedLoadOp maskedLoadOp,
54 PatternRewriter &rewriter)
const override {
55 VectorType maskVType = maskedLoadOp.getMaskVectorType();
56 if (maskVType.getShape().size() != 1)
58 maskedLoadOp,
"expected vector.maskedload with 1-D mask");
59 if (maskVType.isScalable())
61 "cannot scalarize a scalable mask");
63 Location loc = maskedLoadOp.getLoc();
64 int64_t maskLength = maskVType.getShape()[0];
67 Value mask = maskedLoadOp.getMask();
68 Value base = maskedLoadOp.getBase();
69 Value iValue = maskedLoadOp.getPassThru();
70 auto indices = llvm::to_vector_of<Value>(maskedLoadOp.getIndices());
71 Value one = arith::ConstantOp::create(rewriter, loc, indexType,
72 IntegerAttr::get(indexType, 1));
73 for (int64_t i = 0; i < maskLength; ++i) {
74 auto maskBit = vector::ExtractOp::create(rewriter, loc, mask, i);
76 auto ifOp = scf::IfOp::create(
77 rewriter, loc, maskBit,
78 [&](OpBuilder &builder, Location loc) {
79 auto loadedValue = memref::LoadOp::create(
80 builder, loc, base,
indices,
false,
81 llvm::MaybeAlign(maskedLoadOp.getAlignment().value_or(0)));
83 vector::InsertOp::create(builder, loc, loadedValue, iValue, i);
84 scf::YieldOp::create(builder, loc, combinedValue.getResult());
86 [&](OpBuilder &builder, Location loc) {
87 scf::YieldOp::create(builder, loc, iValue);
89 iValue = ifOp.getResult(0);
92 arith::AddIOp::create(rewriter, loc,
indices.back(), one);
121struct VectorMaskedStoreOpConverter final
125 LogicalResult matchAndRewrite(vector::MaskedStoreOp maskedStoreOp,
126 PatternRewriter &rewriter)
const override {
127 VectorType maskVType = maskedStoreOp.getMaskVectorType();
128 if (maskVType.getShape().size() != 1)
130 maskedStoreOp,
"expected vector.maskedstore with 1-D mask");
131 if (maskVType.isScalable())
133 "cannot scalarize a scalable mask");
135 Location loc = maskedStoreOp.getLoc();
136 int64_t maskLength = maskVType.getShape()[0];
139 Value mask = maskedStoreOp.getMask();
140 Value base = maskedStoreOp.getBase();
141 Value value = maskedStoreOp.getValueToStore();
142 bool nontemporal =
false;
143 auto indices = llvm::to_vector_of<Value>(maskedStoreOp.getIndices());
144 Value one = arith::ConstantOp::create(rewriter, loc, indexType,
145 IntegerAttr::get(indexType, 1));
146 for (int64_t i = 0; i < maskLength; ++i) {
147 auto maskBit = vector::ExtractOp::create(rewriter, loc, mask, i);
149 auto ifOp = scf::IfOp::create(rewriter, loc, maskBit,
false);
151 auto extractedValue = vector::ExtractOp::create(rewriter, loc, value, i);
152 memref::StoreOp::create(
153 rewriter, loc, extractedValue, base,
indices, nontemporal,
154 llvm::MaybeAlign(maskedStoreOp.getAlignment().value_or(0)));
159 arith::AddIOp::create(rewriter, loc,
indices.back(), one);
162 rewriter.
eraseOp(maskedStoreOp);
172 patterns.
add<VectorMaskedLoadOpConverter, VectorMaskedStoreOpConverter>(
void setInsertionPointToStart(Block *block)
Sets the insertion point to the start of the specified block.
void setInsertionPointAfter(Operation *op)
Sets the insertion point to the node after the specified operation, which will cause subsequent inser...
This class represents the benefit of a pattern match in a unitless scheme that ranges from 0 (very li...
MLIRContext * getContext() const
RewritePatternSet & add(ConstructorArg &&arg, ConstructorArgs &&...args)
Add an instance of each of the pattern types 'Ts' to the pattern list with the given arguments.
virtual void replaceOp(Operation *op, ValueRange newValues)
Replace the results of the given (original) operation with the specified list of values (replacements...
virtual void eraseOp(Operation *op)
This method erases an operation that is known to have no uses.
std::enable_if_t<!std::is_convertible< CallbackT, Twine >::value, LogicalResult > notifyMatchFailure(Location loc, CallbackT &&reasonCallback)
Used to notify the listener that the IR failed to be rewritten because of a match failure,...
void populateVectorMaskedLoadStoreEmulationPatterns(RewritePatternSet &patterns, PatternBenefit benefit=1)
Populate the pattern set with the following patterns:
Include the generated interface declarations.
OpRewritePattern is a wrapper around RewritePattern that allows for matching and rewriting against an...