blob: 1ed0b09b6694282cfda2724672820a923dac1d91 [file]
// 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/Conversion/UtilToHAL/Patterns.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/IR/MLIRContext.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Transforms/DialectConversion.h"
namespace mlir::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.getType());
if (newType == op.getType())
return failure();
rewriter.modifyOpInPlace(op, [&]() {
// NOTE: the initial value may be invalid here! We rely on
// dialect-specific conversions to handle it.
op.setTypeAttr(TypeAttr::get(newType));
});
return success();
}
};
} // namespace
void populateUtilToHALPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
TypeConverter &typeConverter,
RewritePatternSet &patterns) {
conversionTarget.addDynamicallyLegalOp<IREE::Util::GlobalOp>(
[&](IREE::Util::GlobalOp op) {
return typeConverter.isLegal(op.getType()) &&
(!op.getInitialValue().has_value() ||
typeConverter.isLegal(op.getInitialValueAttr().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);
populateGenericStructuralConversionPatterns(context, conversionTarget,
typeConverter, patterns);
}
} // namespace mlir::iree_compiler