Make krnl-to-llvm patterns reusable (#272)
* Make krnl-to-llvm patterns reusable * Change include paths * Change include paths
This commit is contained in:
parent
fe6dc5bd81
commit
13e8070708
|
@ -10,7 +10,6 @@
|
||||||
|
|
||||||
#include "mlir/Conversion/AffineToStandard/AffineToStandard.h"
|
#include "mlir/Conversion/AffineToStandard/AffineToStandard.h"
|
||||||
#include "mlir/Conversion/SCFToStandard/SCFToStandard.h"
|
#include "mlir/Conversion/SCFToStandard/SCFToStandard.h"
|
||||||
#include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h"
|
|
||||||
#include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h"
|
#include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h"
|
||||||
#include "mlir/Dialect/Affine/IR/AffineOps.h"
|
#include "mlir/Dialect/Affine/IR/AffineOps.h"
|
||||||
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
|
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
|
||||||
|
@ -22,6 +21,7 @@
|
||||||
#include "onnx/onnx_pb.h"
|
#include "onnx/onnx_pb.h"
|
||||||
#include "llvm/ADT/Sequence.h"
|
#include "llvm/ADT/Sequence.h"
|
||||||
|
|
||||||
|
#include "src/Conversion/KrnlToLLVM/KrnlToLLVM.hpp"
|
||||||
#include "src/Conversion/ONNXToKrnl/ONNXToKrnlCommon.hpp"
|
#include "src/Conversion/ONNXToKrnl/ONNXToKrnlCommon.hpp"
|
||||||
#include "src/Dialect/Krnl/KrnlOps.hpp"
|
#include "src/Dialect/Krnl/KrnlOps.hpp"
|
||||||
#include "src/Pass/Passes.hpp"
|
#include "src/Pass/Passes.hpp"
|
||||||
|
@ -852,18 +852,31 @@ private:
|
||||||
};
|
};
|
||||||
} // end namespace
|
} // end namespace
|
||||||
|
|
||||||
|
void mlir::populateAffineAndKrnlToLLVMConversion(
|
||||||
|
OwningRewritePatternList &patterns, MLIRContext *ctx,
|
||||||
|
LLVMTypeConverter &typeConverter) {
|
||||||
|
populateAffineToStdConversionPatterns(patterns, ctx);
|
||||||
|
populateLoopToStdConversionPatterns(patterns, ctx);
|
||||||
|
populateStdToLLVMConversionPatterns(typeConverter, patterns);
|
||||||
|
|
||||||
|
patterns.insert<KrnlGlobalOpLowering, KrnlPackedConstOpLowering>(
|
||||||
|
ctx, typeConverter);
|
||||||
|
patterns.insert<KrnlGetRefOpLowering>(ctx, typeConverter);
|
||||||
|
patterns.insert<KrnlMemcpyOpLowering, KrnlEntryPointOpLowering>(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// KRNL + Stadard + Affine dialects lowering to LLVM.
|
// KRNL + Standard + Affine dialects lowering to LLVM.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct ConvertKrlnToLLVMPass
|
struct ConvertKrnlToLLVMPass
|
||||||
: public PassWrapper<ConvertKrlnToLLVMPass, OperationPass<ModuleOp>> {
|
: public PassWrapper<ConvertKrnlToLLVMPass, OperationPass<ModuleOp>> {
|
||||||
void runOnOperation() final;
|
void runOnOperation() final;
|
||||||
};
|
};
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
|
||||||
void ConvertKrlnToLLVMPass::runOnOperation() {
|
void ConvertKrnlToLLVMPass::runOnOperation() {
|
||||||
// Define the target for this lowering i.e. the LLVM dialect.
|
// Define the target for this lowering i.e. the LLVM dialect.
|
||||||
ConversionTarget target(getContext());
|
ConversionTarget target(getContext());
|
||||||
target.addLegalDialect<LLVM::LLVMDialect>();
|
target.addLegalDialect<LLVM::LLVMDialect>();
|
||||||
|
@ -877,17 +890,7 @@ void ConvertKrlnToLLVMPass::runOnOperation() {
|
||||||
// We have a combination of `krnl`, `affine`, and `std` operations. We
|
// We have a combination of `krnl`, `affine`, and `std` operations. We
|
||||||
// lower in stages until all the code is in the LLVM dialect.
|
// lower in stages until all the code is in the LLVM dialect.
|
||||||
OwningRewritePatternList patterns;
|
OwningRewritePatternList patterns;
|
||||||
populateAffineToStdConversionPatterns(patterns, &getContext());
|
populateAffineAndKrnlToLLVMConversion(patterns, &getContext(), typeConverter);
|
||||||
populateLoopToStdConversionPatterns(patterns, &getContext());
|
|
||||||
populateStdToLLVMConversionPatterns(typeConverter, patterns);
|
|
||||||
|
|
||||||
patterns.insert<KrnlGlobalOpLowering, KrnlPackedConstOpLowering>(
|
|
||||||
&getContext(), typeConverter);
|
|
||||||
patterns.insert<KrnlGetRefOpLowering>(&getContext(), typeConverter);
|
|
||||||
|
|
||||||
// Lower from the `krnl` dialect i.e. the Reshape operation.
|
|
||||||
patterns.insert<KrnlMemcpyOpLowering, KrnlEntryPointOpLowering>(
|
|
||||||
&getContext());
|
|
||||||
|
|
||||||
// We want to completely lower to LLVM, so we use a `FullConversion`. This
|
// We want to completely lower to LLVM, so we use a `FullConversion`. This
|
||||||
// ensures that only legal operations will remain after the conversion.
|
// 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.
|
/// Create the pass for lowering `Krnl`, `Affine` and `Std` dialects to LLVM.
|
||||||
std::unique_ptr<mlir::Pass> mlir::createConvertKrnlToLLVMPass() {
|
std::unique_ptr<mlir::Pass> mlir::createConvertKrnlToLLVMPass() {
|
||||||
return std::make_unique<ConvertKrlnToLLVMPass>();
|
return std::make_unique<ConvertKrnlToLLVMPass>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue