blob: 27f9a80987fc570db13f496abec8652285ca7cf4 [file] [log] [blame] [edit]
// Copyright 2019 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "iree/compiler/Dialect/VM/Conversion/UtilToVM/Patterns.h"
#include "iree/compiler/Dialect/Util/IR/UtilOps.h"
#include "iree/compiler/Dialect/Util/IR/UtilTypes.h"
#include "iree/compiler/Dialect/VM/Conversion/TypeConverter.h"
#include "iree/compiler/Dialect/VM/IR/VMOps.h"
#include "mlir/IR/Attributes.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/Matchers.h"
#include "mlir/Transforms/DialectConversion.h"
namespace mlir::iree_compiler {
void populateUtilAlignmentToVMPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
RewritePatternSet &patterns);
void populateUtilAssignmentToVMPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
RewritePatternSet &patterns);
void populateUtilBufferToVMPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
RewritePatternSet &patterns);
void populateUtilGlobalToVMPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
RewritePatternSet &patterns);
void populateUtilListToVMPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
RewritePatternSet &patterns);
void populateUtilStatusToVMPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
RewritePatternSet &patterns);
void populateUtilStructuralToVMPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
ImportTable &importTable,
RewritePatternSet &patterns);
namespace {
//===----------------------------------------------------------------------===//
// util.null
//===----------------------------------------------------------------------===//
struct NullOpConversion : public OpConversionPattern<IREE::Util::NullOp> {
using Base::Base;
LogicalResult
matchAndRewrite(IREE::Util::NullOp op, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
rewriter.replaceOpWithNewOp<IREE::VM::ConstRefZeroOp>(
op, getTypeConverter()->convertType(op.getType()));
return success();
}
};
//===----------------------------------------------------------------------===//
// util.cmp.eq
//===----------------------------------------------------------------------===//
struct CmpEQOpConversion : public OpConversionPattern<IREE::Util::CmpEQOp> {
using Base::Base;
LogicalResult
matchAndRewrite(IREE::Util::CmpEQOp op, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
auto operandType = adaptor.getLhs().getType();
if (isa<IREE::VM::RefType>(operandType)) {
rewriter.replaceOpWithNewOp<IREE::VM::CmpEQRefOp>(
op, rewriter.getI32Type(), adaptor.getLhs(), adaptor.getRhs());
return success();
}
return failure(); // not used for non-ref types currently
}
};
//===----------------------------------------------------------------------===//
// util.cmp.ne
//===----------------------------------------------------------------------===//
struct CmpNEOpConversion : public OpConversionPattern<IREE::Util::CmpNEOp> {
using Base::Base;
LogicalResult
matchAndRewrite(IREE::Util::CmpNEOp op, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
auto operandType = adaptor.getLhs().getType();
if (isa<IREE::VM::RefType>(operandType)) {
rewriter.replaceOpWithNewOp<IREE::VM::CmpNERefOp>(
op, rewriter.getI32Type(), adaptor.getLhs(), adaptor.getRhs());
return success();
}
return failure(); // not used for non-ref types currently
}
};
} // namespace
void populateUtilToVMPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
ImportTable &importTable,
RewritePatternSet &patterns) {
patterns.insert<NullOpConversion>(typeConverter, context);
patterns.insert<CmpEQOpConversion>(typeConverter, context);
patterns.insert<CmpNEOpConversion>(typeConverter, context);
populateUtilAlignmentToVMPatterns(context, conversionTarget, typeConverter,
patterns);
populateUtilAssignmentToVMPatterns(context, conversionTarget, typeConverter,
patterns);
populateUtilBufferToVMPatterns(context, conversionTarget, typeConverter,
patterns);
populateUtilGlobalToVMPatterns(context, conversionTarget, typeConverter,
patterns);
populateUtilListToVMPatterns(context, conversionTarget, typeConverter,
patterns);
populateUtilStatusToVMPatterns(context, conversionTarget, typeConverter,
patterns);
populateUtilStructuralToVMPatterns(context, conversionTarget, typeConverter,
importTable, patterns);
}
} // namespace mlir::iree_compiler