blob: ebea39b228d9f3ff823dd6b072fd97048ccac405 [file]
// Copyright 2020 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/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/IR/HALTypes.h"
#include "llvm/ADT/ArrayRef.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
#include "mlir/IR/MLIRContext.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Transforms/DialectConversion.h"
namespace mlir::iree_compiler {
namespace {
struct BufferViewDimPattern : public OpConversionPattern<tensor::DimOp> {
using OpConversionPattern::OpConversionPattern;
LogicalResult
matchAndRewrite(tensor::DimOp dimOp, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
if (!llvm::isa<IREE::HAL::BufferViewType>(adaptor.getSource().getType())) {
return failure();
}
std::optional<int64_t> index = dimOp.getConstantIndex();
assert(index.has_value() && "expect constant index in `std.dim` operation");
rewriter.replaceOpWithNewOp<IREE::HAL::BufferViewDimOp>(
dimOp, dimOp.getResult().getType(), adaptor.getSource(),
rewriter.getIndexAttr(index.value()));
return success();
}
};
struct BufferViewRankPattern : public OpConversionPattern<tensor::RankOp> {
using OpConversionPattern::OpConversionPattern;
LogicalResult
matchAndRewrite(tensor::RankOp rankOp, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
if (!llvm::isa<IREE::HAL::BufferViewType>(adaptor.getTensor().getType())) {
return failure();
}
rewriter.replaceOpWithNewOp<IREE::HAL::BufferViewRankOp>(
rankOp, rankOp.getResult().getType(), adaptor.getTensor());
return success();
}
};
} // namespace
void populateStandardShapeToHALPatterns(MLIRContext *context,
ConversionTarget &conversionTarget,
RewritePatternSet &patterns,
TypeConverter &typeConverter) {
// Ensure all shape related ops are fully converted as we should no longer
// have any types they are valid to be used on after this conversion.
conversionTarget.addIllegalOp<tensor::DimOp, tensor::RankOp>();
patterns.insert<BufferViewDimPattern, BufferViewRankPattern>(context);
}
} // namespace mlir::iree_compiler