17#include "llvm/Support/FormatVariadic.h"
18#include "llvm/Support/MathExtras.h"
22#define GEN_PASS_DEF_MEMREFEMULATEWIDEINT
23#include "mlir/Dialect/MemRef/Transforms/Passes.h.inc"
34struct ConvertMemRefAlloc final : OpConversionPattern<memref::AllocOp> {
35 using OpConversionPattern::OpConversionPattern;
38 matchAndRewrite(memref::AllocOp op, OpAdaptor adaptor,
39 ConversionPatternRewriter &rewriter)
const override {
40 Type newTy = getTypeConverter()->convertType(op.getType());
42 return rewriter.notifyMatchFailure(
44 llvm::formatv(
"failed to convert memref type: {0}", op.getType()));
46 rewriter.replaceOpWithNewOp<memref::AllocOp>(
47 op, newTy, adaptor.getDynamicSizes(), adaptor.getSymbolOperands(),
48 adaptor.getAlignmentAttr());
57struct ConvertMemRefLoad final : OpConversionPattern<memref::LoadOp> {
58 using OpConversionPattern::OpConversionPattern;
61 matchAndRewrite(memref::LoadOp op, OpAdaptor adaptor,
62 ConversionPatternRewriter &rewriter)
const override {
63 Type newResTy = getTypeConverter()->convertType(op.getType());
65 return rewriter.notifyMatchFailure(
66 op->getLoc(), llvm::formatv(
"failed to convert memref type: {0}",
69 rewriter.replaceOpWithNewOp<memref::LoadOp>(
70 op, newResTy, adaptor.getMemref(), adaptor.getIndices(),
80struct ConvertMemRefStore final : OpConversionPattern<memref::StoreOp> {
81 using OpConversionPattern::OpConversionPattern;
84 matchAndRewrite(memref::StoreOp op, OpAdaptor adaptor,
85 ConversionPatternRewriter &rewriter)
const override {
86 Type newTy = getTypeConverter()->convertType(op.getMemRefType());
88 return rewriter.notifyMatchFailure(
89 op->getLoc(), llvm::formatv(
"failed to convert memref type: {0}",
92 rewriter.replaceOpWithNewOp<memref::StoreOp>(
93 op, adaptor.getValue(), adaptor.getMemref(), adaptor.getIndices(),
103struct EmulateWideIntPass final
105 using MemRefEmulateWideIntBase::MemRefEmulateWideIntBase;
107 void runOnOperation()
override {
108 if (!llvm::isPowerOf2_32(widestIntSupported) || widestIntSupported < 2) {
113 Operation *op = getOperation();
116 arith::WideIntEmulationConverter typeConverter(widestIntSupported);
118 ConversionTarget
target(*ctx);
119 target.addDynamicallyLegalDialect<
120 arith::ArithDialect, memref::MemRefDialect, vector::VectorDialect>(
121 [&typeConverter](Operation *op) {
return typeConverter.isLegal(op); });
125 arith::populateArithWideIntEmulationPatterns(typeConverter,
patterns);
144 patterns.add<ConvertMemRefAlloc, ConvertMemRefLoad, ConvertMemRefStore>(
145 typeConverter,
patterns.getContext());
150 typeConverter.addConversion(
151 [&typeConverter](MemRefType ty) -> std::optional<Type> {
152 auto intTy = dyn_cast<IntegerType>(ty.getElementType());
156 if (intTy.getIntOrFloatBitWidth() <=
160 Type newElemTy = typeConverter.convertType(intTy);
164 return ty.cloneWith(std::nullopt, newElemTy);
MLIRContext * getContext()
Return the context this operation is associated with.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Converts integer types that are too wide for the target by splitting them in two halves and thus turn...
unsigned getMaxTargetIntBitWidth() const
void populateMemRefWideIntEmulationPatterns(const arith::WideIntEmulationConverter &typeConverter, RewritePatternSet &patterns)
Appends patterns for emulating wide integer memref operations with ops over narrower integer types.
void populateMemRefWideIntEmulationConversions(arith::WideIntEmulationConverter &typeConverter)
Appends type conversions for emulating wide integer memref operations with ops over narrowe integer t...
Include the generated interface declarations.
const FrozenRewritePatternSet & patterns