mirror of
https://github.com/zama-ai/concrete.git
synced 2026-04-17 03:00:54 -04:00
Use `OpConversionPattern` instead of `OpRewritePattern` for operation conversion during dialect conversion. This makes explicit and in-place type conversions unnecessary, since `OpConversionPattern` already properly converts operand types and provides them to the rewrite rule through an operation adaptor. The main contributions of this commit are the two class templates `TypeConvertingReinstantiationPattern` and `GenericOneToOneOpConversionPattern`. The former allows for the definition of a simple replacement rule that re-instantiates an operation after the types of its operands have been converted. This is especially useful for type-polymorphic operations during dialect conversion. The latter allows for the definition of patterns, where one operation needs to be replaced with a different operation after conversion of its operands. The default implementations for the class templates provide conversions rules for operations that have a generic builder method that takes the desired return type(s), the operands and (optionally) a set of attributes. How attributes are discarded during a conversion (either by omitting the builder argument or by passing an empty set of attributes) can be defined through specialization of `ReinstantiationAttributeDismissalStrategy`. Custom replacement rules that deviate from the scheme above should be implemented by specializing `TypeConvertingReinstantiationPattern::matchAndRewrite()` and `GenericOneToOneOpConversionPattern::matchAndRewrite()`.
71 lines
2.1 KiB
C++
71 lines
2.1 KiB
C++
// Part of the Concrete Compiler Project, under the BSD3 License with Zama
|
|
// Exceptions. See
|
|
// https://github.com/zama-ai/concrete-compiler-internal/blob/main/LICENSE.txt
|
|
// for license information.
|
|
|
|
#ifndef CONCRETELANG_CONVERSION_UTILS_DIALECTS_TENSOR_H_
|
|
#define CONCRETELANG_CONVERSION_UTILS_DIALECTS_TENSOR_H_
|
|
|
|
#include "concretelang/Conversion/Utils/ReinstantiatingOpTypeConversion.h"
|
|
#include "mlir/Dialect/Tensor/IR/Tensor.h"
|
|
|
|
namespace mlir {
|
|
namespace concretelang {
|
|
|
|
//
|
|
// Specializations for CollapseShapeOp
|
|
//
|
|
|
|
// Specialization copying attributes not necessary, as the base
|
|
// template works correctly
|
|
template <>
|
|
mlir::LogicalResult
|
|
TypeConvertingReinstantiationPattern<tensor::CollapseShapeOp, false>::
|
|
matchAndRewrite(
|
|
tensor::CollapseShapeOp oldOp,
|
|
mlir::OpConversionPattern<tensor::CollapseShapeOp>::OpAdaptor adaptor,
|
|
mlir::ConversionPatternRewriter &rewriter) const;
|
|
//
|
|
// Specializations for FromElementsOp
|
|
//
|
|
template <>
|
|
mlir::LogicalResult
|
|
TypeConvertingReinstantiationPattern<mlir::tensor::FromElementsOp, false>::
|
|
matchAndRewrite(
|
|
tensor::FromElementsOp oldOp,
|
|
mlir::OpConversionPattern<mlir::tensor::FromElementsOp>::OpAdaptor
|
|
adaptor,
|
|
mlir::ConversionPatternRewriter &rewriter) const;
|
|
|
|
//
|
|
// Specializations for ExpandShapeOp
|
|
//
|
|
|
|
// Specialization copying attributes not necessary, as the base
|
|
// template works correctly
|
|
|
|
template <>
|
|
mlir::LogicalResult
|
|
TypeConvertingReinstantiationPattern<tensor::ExpandShapeOp, false>::
|
|
matchAndRewrite(
|
|
tensor::ExpandShapeOp oldOp,
|
|
mlir::OpConversionPattern<tensor::ExpandShapeOp>::OpAdaptor adaptor,
|
|
mlir::ConversionPatternRewriter &rewriter) const;
|
|
|
|
//
|
|
// Specializations for GenerateOp
|
|
//
|
|
|
|
// Specialization NOT copying attributes omitted
|
|
template <>
|
|
mlir::LogicalResult
|
|
TypeConvertingReinstantiationPattern<tensor::GenerateOp, true>::matchAndRewrite(
|
|
tensor::GenerateOp oldOp,
|
|
mlir::OpConversionPattern<tensor::GenerateOp>::OpAdaptor adaptor,
|
|
mlir::ConversionPatternRewriter &rewriter) const;
|
|
|
|
} // namespace concretelang
|
|
} // namespace mlir
|
|
|
|
#endif // CONCRETELANG_CONVERSION_UTILS_DIALECTS_TENSOR_H_
|