32 ScalableMaskedAddIIntrOp>;
35 ScalableMaskedAddFIntrOp>;
38 ScalableMaskedSubIIntrOp>;
41 ScalableMaskedSubFIntrOp>;
44 ScalableMaskedMulIIntrOp>;
47 ScalableMaskedMulFIntrOp>;
50 ScalableMaskedSDivIIntrOp>;
53 ScalableMaskedUDivIIntrOp>;
56 ScalableMaskedDivFIntrOp>;
79template <
typename Op,
typename IntrOp>
84 matchAndRewrite(
Op convertOp,
typename Op::Adaptor,
85 ConversionPatternRewriter &rewriter)
const override {
86 auto loc = convertOp.
getLoc();
88 auto source = convertOp.getSource();
89 VectorType sourceType = source.getType();
90 VectorType resultType = convertOp.getResult().getType();
92 Value result = arith::ConstantOp::create(rewriter, loc, resultType,
93 rewriter.getZeroAttr(resultType));
99 tileShape.back() = sourceType.getShape().back();
105 auto sourceVector = vector::ExtractOp::create(rewriter, loc, source,
106 extractOrInsertPosition);
107 VectorType convertedType =
109 .
setDim(0, resultType.getShape().back());
110 auto convertedVector =
111 IntrOp::create(rewriter, loc,
TypeRange{convertedType}, sourceVector);
112 result = vector::InsertOp::create(rewriter, loc, convertedVector,
result,
113 extractOrInsertPosition);
116 rewriter.replaceOp(convertOp,
result);
121using ConvertToSvboolOpLowering =
122 SvboolConversionOpLowering<ConvertToSvboolOp, ConvertToSvboolIntrOp>;
124using ConvertFromSvboolOpLowering =
125 SvboolConversionOpLowering<ConvertFromSvboolOp, ConvertFromSvboolIntrOp>;
136 matchAndRewrite(PselOp pselOp, PselOp::Adaptor adaptor,
137 ConversionPatternRewriter &rewriter)
const override {
138 auto svboolType = VectorType::get(16, rewriter.getI1Type(),
true);
139 auto loc = pselOp.getLoc();
140 auto svboolP1 = ConvertToSvboolIntrOp::create(rewriter, loc, svboolType,
142 auto indexI32 = arith::IndexCastOp::create(
143 rewriter, loc, rewriter.getI32Type(), pselOp.getIndex());
144 auto pselIntr = PselIntrOp::create(rewriter, loc, svboolType, svboolP1,
145 pselOp.getP2(), indexI32);
146 rewriter.replaceOpWithNewOp<ConvertFromSvboolIntrOp>(
147 pselOp, adaptor.getP1().
getType(), pselIntr);
159struct CreateMaskOpLowering
164 matchAndRewrite(vector::CreateMaskOp createMaskOp,
165 vector::CreateMaskOp::Adaptor adaptor,
166 ConversionPatternRewriter &rewriter)
const override {
167 auto maskType = createMaskOp.getVectorType();
168 if (maskType.getRank() != 1 || !maskType.isScalable())
169 return rewriter.notifyMatchFailure(createMaskOp,
"not 1-D and scalable");
172 auto maskBaseSize = maskType.getDimSize(0);
173 if (maskBaseSize < 2 || maskBaseSize > 16 ||
174 !llvm::isPowerOf2_32(uint32_t(maskBaseSize)))
175 return rewriter.notifyMatchFailure(createMaskOp,
176 "not SVE predicate-sized");
178 auto loc = createMaskOp.getLoc();
179 auto zero = LLVM::ZeroOp::create(rewriter, loc, rewriter.getI64Type());
180 rewriter.replaceOpWithNewOp<WhileLTIntrOp>(createMaskOp, maskType, zero,
181 adaptor.getOperands()[0]);
194 patterns.
add<ConvertFromSvboolOpLowering,
195 ConvertToSvboolOpLowering,
217 patterns.
add<CreateMaskOpLowering>(converter, 4096);
224 target.addLegalOp<BfmmlaOp,
225 ConvertFromSvboolIntrOp,
226 ConvertToSvboolIntrOp,
229 ScalableMaskedAddFIntrOp,
230 ScalableMaskedAddIIntrOp,
231 ScalableMaskedDivFIntrOp,
232 ScalableMaskedMulFIntrOp,
233 ScalableMaskedMulIIntrOp,
234 ScalableMaskedSDivIIntrOp,
235 ScalableMaskedSubFIntrOp,
236 ScalableMaskedSubIIntrOp,
237 ScalableMaskedUDivIIntrOp,
247 target.addIllegalOp<ConvertFromSvboolOp,
251 ScalableMaskedAddFOp,
252 ScalableMaskedAddIOp,
253 ScalableMaskedDivFOp,
254 ScalableMaskedMulFOp,
255 ScalableMaskedMulIOp,
256 ScalableMaskedSDivIOp,
257 ScalableMaskedSubFOp,
258 ScalableMaskedSubIOp,
259 ScalableMaskedUDivIOp,
Utility class for operation conversions targeting the LLVM dialect that match exactly one source oper...
ConvertOpToLLVMPattern(const LLVMTypeConverter &typeConverter, PatternBenefit benefit=1)
Derived class that automatically populates legalization information for different LLVM ops.
Conversion from types to the LLVM IR dialect.
Generic implementation of one-to-one conversion from "SourceOp" to "TargetOp" where the latter belong...
Location getLoc()
The source location the operation was defined or derived from.
This provides public APIs that all operations should have.
RewritePatternSet & add(ConstructorArg &&arg, ConstructorArgs &&...args)
Add an instance of each of the pattern types 'Ts' to the pattern list with the given arguments.
A range-style iterator that allows for iterating over the offsets of all potential tiles of size tile...
This class provides an abstraction over the various different ranges of value types.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
This is a builder type that keeps local references to arguments.
Builder & setDim(unsigned pos, int64_t val)
Set a dim in shape @pos to val.
Include the generated interface declarations.
void configureArmSVELegalizeForExportTarget(LLVMConversionTarget &target)
Configure the target to support lowering ArmSVE ops to ops that map to LLVM intrinsics.
Type getType(OpFoldResult ofr)
Returns the int type of the integer in ofr.
void populateArmSVELegalizeForLLVMExportPatterns(const LLVMTypeConverter &converter, RewritePatternSet &patterns)
Collect a set of patterns to lower ArmSVE ops to ops that map to LLVM intrinsics.