blob: 73bf08ccd2210871f5352f58510a51431a168579 [file] [log] [blame]
// Copyright 2021 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/HAL/Conversion2/UtilToHAL/ConvertUtilToHAL.h"
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/Util/Conversion/ConversionPatterns.h"
#include "iree/compiler/Dialect/Util/IR/UtilOps.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/IR/MLIRContext.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Transforms/DialectConversion.h"
namespace mlir {
namespace iree_compiler {
namespace {
struct GlobalConversionPattern
: public OpConversionPattern<IREE::Util::GlobalOp> {
using OpConversionPattern::OpConversionPattern;
LogicalResult matchAndRewrite(
IREE::Util::GlobalOp op, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
auto newType = getTypeConverter()->convertType(op.type());
if (newType == op.type()) return failure();
rewriter.updateRootInPlace(op, [&]() {
// NOTE: the initial value may be invalid here! We rely on
// dialect-specific conversions to handle it.
op.typeAttr(TypeAttr::get(newType));
});
return success();
}
};
} // namespace
void populateUtilToHALPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
OwningRewritePatternList &patterns) {
conversionTarget.addDynamicallyLegalOp<IREE::Util::GlobalOp>(
[&](IREE::Util::GlobalOp op) {
return typeConverter.isLegal(op.type()) &&
(!op.initial_value().hasValue() ||
typeConverter.isLegal(op.initial_valueAttr().getType()));
});
addGenericLegalOp<IREE::Util::GlobalLoadOp>(conversionTarget, typeConverter);
addGenericLegalOp<IREE::Util::GlobalStoreOp>(conversionTarget, typeConverter);
patterns.insert<GlobalConversionPattern,
GenericConvertTypesPattern<IREE::Util::GlobalLoadOp>,
GenericConvertTypesPattern<IREE::Util::GlobalStoreOp>>(
typeConverter, context);
populateUtilConversionPatterns(context, conversionTarget, typeConverter,
patterns);
}
} // namespace iree_compiler
} // namespace mlir