From 13e8070708b50eede99a50454fd51547596a15f1 Mon Sep 17 00:00:00 2001 From: "Tung D. Le" Date: Thu, 20 Aug 2020 00:58:04 +0900 Subject: [PATCH] Make krnl-to-llvm patterns reusable (#272) * Make krnl-to-llvm patterns reusable * Change include paths * Change include paths --- src/Conversion/KrnlToLLVM/KrnlToLLVM.cpp | 37 +++++++++++++----------- src/Conversion/KrnlToLLVM/KrnlToLLVM.hpp | 27 +++++++++++++++++ 2 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 src/Conversion/KrnlToLLVM/KrnlToLLVM.hpp diff --git a/src/Conversion/KrnlToLLVM/KrnlToLLVM.cpp b/src/Conversion/KrnlToLLVM/KrnlToLLVM.cpp index 5ca2a89..55564cb 100644 --- a/src/Conversion/KrnlToLLVM/KrnlToLLVM.cpp +++ b/src/Conversion/KrnlToLLVM/KrnlToLLVM.cpp @@ -10,7 +10,6 @@ #include "mlir/Conversion/AffineToStandard/AffineToStandard.h" #include "mlir/Conversion/SCFToStandard/SCFToStandard.h" -#include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h" #include "mlir/Dialect/Affine/IR/AffineOps.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" @@ -22,6 +21,7 @@ #include "onnx/onnx_pb.h" #include "llvm/ADT/Sequence.h" +#include "src/Conversion/KrnlToLLVM/KrnlToLLVM.hpp" #include "src/Conversion/ONNXToKrnl/ONNXToKrnlCommon.hpp" #include "src/Dialect/Krnl/KrnlOps.hpp" #include "src/Pass/Passes.hpp" @@ -852,18 +852,31 @@ private: }; } // end namespace +void mlir::populateAffineAndKrnlToLLVMConversion( + OwningRewritePatternList &patterns, MLIRContext *ctx, + LLVMTypeConverter &typeConverter) { + populateAffineToStdConversionPatterns(patterns, ctx); + populateLoopToStdConversionPatterns(patterns, ctx); + populateStdToLLVMConversionPatterns(typeConverter, patterns); + + patterns.insert( + ctx, typeConverter); + patterns.insert(ctx, typeConverter); + patterns.insert(ctx); +} + //===----------------------------------------------------------------------===// -// KRNL + Stadard + Affine dialects lowering to LLVM. +// KRNL + Standard + Affine dialects lowering to LLVM. //===----------------------------------------------------------------------===// namespace { -struct ConvertKrlnToLLVMPass - : public PassWrapper> { +struct ConvertKrnlToLLVMPass + : public PassWrapper> { void runOnOperation() final; }; } // end anonymous namespace -void ConvertKrlnToLLVMPass::runOnOperation() { +void ConvertKrnlToLLVMPass::runOnOperation() { // Define the target for this lowering i.e. the LLVM dialect. ConversionTarget target(getContext()); target.addLegalDialect(); @@ -877,17 +890,7 @@ void ConvertKrlnToLLVMPass::runOnOperation() { // We have a combination of `krnl`, `affine`, and `std` operations. We // lower in stages until all the code is in the LLVM dialect. OwningRewritePatternList patterns; - populateAffineToStdConversionPatterns(patterns, &getContext()); - populateLoopToStdConversionPatterns(patterns, &getContext()); - populateStdToLLVMConversionPatterns(typeConverter, patterns); - - patterns.insert( - &getContext(), typeConverter); - patterns.insert(&getContext(), typeConverter); - - // Lower from the `krnl` dialect i.e. the Reshape operation. - patterns.insert( - &getContext()); + populateAffineAndKrnlToLLVMConversion(patterns, &getContext(), typeConverter); // We want to completely lower to LLVM, so we use a `FullConversion`. This // ensures that only legal operations will remain after the conversion. @@ -898,5 +901,5 @@ void ConvertKrlnToLLVMPass::runOnOperation() { /// Create the pass for lowering `Krnl`, `Affine` and `Std` dialects to LLVM. std::unique_ptr mlir::createConvertKrnlToLLVMPass() { - return std::make_unique(); + return std::make_unique(); } diff --git a/src/Conversion/KrnlToLLVM/KrnlToLLVM.hpp b/src/Conversion/KrnlToLLVM/KrnlToLLVM.hpp new file mode 100644 index 0000000..31bfa43 --- /dev/null +++ b/src/Conversion/KrnlToLLVM/KrnlToLLVM.hpp @@ -0,0 +1,27 @@ +//===------ KrnlToLLVM.hpp - Lowering from KRNL+Affine+Std to LLVM -------===// +// +// Copyright 2019-2020 The IBM Research Authors. +// +// ============================================================================= +// +// +// +//===----------------------------------------------------------------------===// + +#ifndef KRNL_TO_LLVM_H +#define KRNL_TO_LLVM_H + +#include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h" + +namespace mlir { + +class MLIRContext; +class LLVMTypeConverter; +class OwningRewritePatternList; + +void populateAffineAndKrnlToLLVMConversion(OwningRewritePatternList &patterns, + MLIRContext *ctx, LLVMTypeConverter &typeConverter); + +} // namespace mlir + +#endif // KRNL_TO_LLVM_H