[Mlir-commits] [mlir] [MLIR] Make 1-D memref flattening a prerequisite for vector narrow type emulation (PR #157771)
Alan Li
llvmlistbot at llvm.org
Fri Sep 12 12:02:57 PDT 2025
================
@@ -126,10 +127,72 @@ struct TestEmulateNarrowTypePass
"normal sequence"),
llvm::cl::init(false)};
};
+
+struct TestMemRefFlattenAndVectorNarrowTypeEmulationPass
+ : public PassWrapper<TestMemRefFlattenAndVectorNarrowTypeEmulationPass,
+ OperationPass<func::FuncOp>> {
+ MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(
+ TestMemRefFlattenAndVectorNarrowTypeEmulationPass)
+
+ TestMemRefFlattenAndVectorNarrowTypeEmulationPass() = default;
+ TestMemRefFlattenAndVectorNarrowTypeEmulationPass(
+ const TestMemRefFlattenAndVectorNarrowTypeEmulationPass &pass)
+ : PassWrapper(pass) {}
+
+ void getDependentDialects(DialectRegistry ®istry) const override {
+ registry
+ .insert<arith::ArithDialect, func::FuncDialect, memref::MemRefDialect,
+ vector::VectorDialect, affine::AffineDialect>();
+ }
+
+ StringRef getArgument() const final {
+ return "test-memref-flatten-and-vector-narrow-type-emulation";
+ }
+
+ StringRef getDescription() const final {
+ return "Test MemRef flattening and vector narrow type emulation patterns";
+ }
+
+ void runOnOperation() override {
+ Operation *op = getOperation();
+ MLIRContext *ctx = &getContext();
+
+ // Create a type converter for narrow type emulation (8-bit)
+ arith::NarrowTypeEmulationConverter typeConverter(8);
+
+ // Add conversions for memref types with i4 elements
+ memref::populateMemRefNarrowTypeEmulationConversions(typeConverter);
+
+ ConversionTarget target(*ctx);
+ target.addDynamicallyLegalOp<func::FuncOp>([&typeConverter](Operation *op) {
+ return typeConverter.isLegal(cast<func::FuncOp>(op).getFunctionType());
+ });
+ auto opLegalCallback = [&typeConverter](Operation *op) {
+ return typeConverter.isLegal(op);
+ };
+ target.addDynamicallyLegalOp<func::CallOp, func::ReturnOp>(opLegalCallback);
+ target.addDynamicallyLegalDialect<
+ arith::ArithDialect, vector::VectorDialect, memref::MemRefDialect,
+ affine::AffineDialect>(opLegalCallback);
+
+ RewritePatternSet patterns(ctx);
+
+ // Populate all necessary patterns for narrow type emulation and flattening
+ arith::populateArithNarrowTypeEmulationPatterns(typeConverter, patterns);
+ memref::populateMemRefNarrowTypeEmulationPatterns(typeConverter, patterns);
+ vector::populateVectorNarrowTypeEmulationPatterns(typeConverter, patterns);
+ memref::populateFlattenVectorMemrefPatterns(patterns);
----------------
lialan wrote:
I have updated this to remove unnecessary patterns, it turns out that `populateMemRefNarrowTypeEmulationPatterns` must stay because we need it to emulate either `mermen.alloc` or function boundaries.
https://github.com/llvm/llvm-project/pull/157771
More information about the Mlir-commits
mailing list