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