xref: /llvm-project/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitCPass.cpp (revision 95c2d798148f12565dd4c9ddc753d196e47f230f)
10aa6d57eSMatthias Gehre //===- MemRefToEmitC.cpp - MemRef to EmitC conversion ---------------------===//
20aa6d57eSMatthias Gehre //
30aa6d57eSMatthias Gehre // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40aa6d57eSMatthias Gehre // See https://llvm.org/LICENSE.txt for license information.
50aa6d57eSMatthias Gehre // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60aa6d57eSMatthias Gehre //
70aa6d57eSMatthias Gehre //===----------------------------------------------------------------------===//
80aa6d57eSMatthias Gehre //
90aa6d57eSMatthias Gehre // This file implements a pass to convert memref ops into emitc ops.
100aa6d57eSMatthias Gehre //
110aa6d57eSMatthias Gehre //===----------------------------------------------------------------------===//
120aa6d57eSMatthias Gehre 
130aa6d57eSMatthias Gehre #include "mlir/Conversion/MemRefToEmitC/MemRefToEmitCPass.h"
140aa6d57eSMatthias Gehre 
150aa6d57eSMatthias Gehre #include "mlir/Conversion/MemRefToEmitC/MemRefToEmitC.h"
160aa6d57eSMatthias Gehre #include "mlir/Dialect/EmitC/IR/EmitC.h"
170aa6d57eSMatthias Gehre #include "mlir/Dialect/MemRef/IR/MemRef.h"
180aa6d57eSMatthias Gehre #include "mlir/Pass/Pass.h"
190aa6d57eSMatthias Gehre #include "mlir/Transforms/DialectConversion.h"
200aa6d57eSMatthias Gehre 
210aa6d57eSMatthias Gehre namespace mlir {
220aa6d57eSMatthias Gehre #define GEN_PASS_DEF_CONVERTMEMREFTOEMITC
230aa6d57eSMatthias Gehre #include "mlir/Conversion/Passes.h.inc"
240aa6d57eSMatthias Gehre } // namespace mlir
250aa6d57eSMatthias Gehre 
260aa6d57eSMatthias Gehre using namespace mlir;
270aa6d57eSMatthias Gehre 
280aa6d57eSMatthias Gehre namespace {
290aa6d57eSMatthias Gehre struct ConvertMemRefToEmitCPass
300aa6d57eSMatthias Gehre     : public impl::ConvertMemRefToEmitCBase<ConvertMemRefToEmitCPass> {
310aa6d57eSMatthias Gehre   void runOnOperation() override {
320aa6d57eSMatthias Gehre     TypeConverter converter;
330aa6d57eSMatthias Gehre 
340aa6d57eSMatthias Gehre     // Fallback for other types.
350aa6d57eSMatthias Gehre     converter.addConversion([](Type type) -> std::optional<Type> {
363c537459SLongsheng Mou       if (emitc::isSupportedEmitCType(type))
370aa6d57eSMatthias Gehre         return type;
383c537459SLongsheng Mou       return {};
390aa6d57eSMatthias Gehre     });
400aa6d57eSMatthias Gehre 
410aa6d57eSMatthias Gehre     populateMemRefToEmitCTypeConversion(converter);
420aa6d57eSMatthias Gehre 
43*95c2d798SSimon Camphausen     auto materializeAsUnrealizedCast = [](OpBuilder &builder, Type resultType,
44*95c2d798SSimon Camphausen                                           ValueRange inputs,
45*95c2d798SSimon Camphausen                                           Location loc) -> Value {
46*95c2d798SSimon Camphausen       if (inputs.size() != 1)
47*95c2d798SSimon Camphausen         return Value();
48*95c2d798SSimon Camphausen 
49*95c2d798SSimon Camphausen       return builder.create<UnrealizedConversionCastOp>(loc, resultType, inputs)
50*95c2d798SSimon Camphausen           .getResult(0);
51*95c2d798SSimon Camphausen     };
52*95c2d798SSimon Camphausen 
53*95c2d798SSimon Camphausen     converter.addSourceMaterialization(materializeAsUnrealizedCast);
54*95c2d798SSimon Camphausen     converter.addTargetMaterialization(materializeAsUnrealizedCast);
55*95c2d798SSimon Camphausen 
560aa6d57eSMatthias Gehre     RewritePatternSet patterns(&getContext());
570aa6d57eSMatthias Gehre     populateMemRefToEmitCConversionPatterns(patterns, converter);
580aa6d57eSMatthias Gehre 
590aa6d57eSMatthias Gehre     ConversionTarget target(getContext());
600aa6d57eSMatthias Gehre     target.addIllegalDialect<memref::MemRefDialect>();
610aa6d57eSMatthias Gehre     target.addLegalDialect<emitc::EmitCDialect>();
620aa6d57eSMatthias Gehre 
630aa6d57eSMatthias Gehre     if (failed(applyPartialConversion(getOperation(), target,
640aa6d57eSMatthias Gehre                                       std::move(patterns))))
650aa6d57eSMatthias Gehre       return signalPassFailure();
660aa6d57eSMatthias Gehre   }
670aa6d57eSMatthias Gehre };
680aa6d57eSMatthias Gehre } // namespace
69