94 lines
4.2 KiB
C++
94 lines
4.2 KiB
C++
//===- EndomorphismSimplification.h -----------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef MLIR_TRANSFORMS_SIMPLIFY_ENDOMORPHISM_H_
|
|
#define MLIR_TRANSFORMS_SIMPLIFY_ENDOMORPHISM_H_
|
|
|
|
#include "mlir/Transforms/HomomorphismSimplification.h"
|
|
|
|
namespace mlir {
|
|
|
|
namespace detail {
|
|
struct CreateAlgebraicOpForEndomorphismSimplification {
|
|
Operation *operator()(Operation *op, IRMapping &operandsRemapping,
|
|
PatternRewriter &rewriter) const {
|
|
return rewriter.clone(*op, operandsRemapping);
|
|
}
|
|
};
|
|
} // namespace detail
|
|
|
|
// If `f` is an endomorphism with respect to the algebraic structure induced by
|
|
// function `g`, transforms `g(f(x1), f(x2) ..., f(xn))` into
|
|
// `f(g(x1, x2, ..., xn))`.
|
|
// `g` is the algebraic operation and `f` is the endomorphism.
|
|
//
|
|
// Functors:
|
|
// ---------
|
|
// `GetEndomorphismOpOperandFn`: `(Operation*) -> OpOperand*`
|
|
// Returns the operand relevant to the endomorphism.
|
|
// There may be other operands that are not relevant.
|
|
//
|
|
// `GetEndomorphismOpResultFn`: `(Operation*) -> OpResult`
|
|
// Returns the result relevant to the endomorphism.
|
|
//
|
|
// `GetAlgebraicOpOperandsFn`: `(Operation*, SmallVector<OpOperand*>&) -> void`
|
|
// Populates into the vector the operands relevant to the endomorphism.
|
|
//
|
|
// `GetAlgebraicOpResultFn`: `(Operation*) -> OpResult`
|
|
// Return the result relevant to the endomorphism.
|
|
//
|
|
// `IsEndomorphismOpFn`: `(Operation*, std::optional<Operation*>) -> bool`
|
|
// Check if the operation is an endomorphism of the required type.
|
|
// Additionally if the optional is present checks if the operations are
|
|
// compatible endomorphisms.
|
|
//
|
|
// `IsAlgebraicOpFn`: `(Operation*) -> bool`
|
|
// Check if the operation is an operation of the algebraic structure.
|
|
template <typename GetEndomorphismOpOperandFn,
|
|
typename GetEndomorphismOpResultFn, typename GetAlgebraicOpOperandsFn,
|
|
typename GetAlgebraicOpResultFn, typename IsEndomorphismOpFn,
|
|
typename IsAlgebraicOpFn>
|
|
struct EndomorphismSimplification
|
|
: HomomorphismSimplification<
|
|
GetEndomorphismOpOperandFn, GetEndomorphismOpResultFn,
|
|
GetAlgebraicOpOperandsFn, GetAlgebraicOpResultFn,
|
|
GetAlgebraicOpResultFn, IsEndomorphismOpFn, IsAlgebraicOpFn,
|
|
detail::CreateAlgebraicOpForEndomorphismSimplification> {
|
|
template <typename GetEndomorphismOpOperandFnArg,
|
|
typename GetEndomorphismOpResultFnArg,
|
|
typename GetAlgebraicOpOperandsFnArg,
|
|
typename GetAlgebraicOpResultFnArg, typename IsEndomorphismOpFnArg,
|
|
typename IsAlgebraicOpFnArg, typename... RewritePatternArgs>
|
|
EndomorphismSimplification(
|
|
GetEndomorphismOpOperandFnArg &&getEndomorphismOpOperand,
|
|
GetEndomorphismOpResultFnArg &&getEndomorphismOpResult,
|
|
GetAlgebraicOpOperandsFnArg &&getAlgebraicOpOperands,
|
|
GetAlgebraicOpResultFnArg &&getAlgebraicOpResult,
|
|
IsEndomorphismOpFnArg &&isEndomorphismOp,
|
|
IsAlgebraicOpFnArg &&isAlgebraicOp, RewritePatternArgs &&...args)
|
|
: HomomorphismSimplification<
|
|
GetEndomorphismOpOperandFn, GetEndomorphismOpResultFn,
|
|
GetAlgebraicOpOperandsFn, GetAlgebraicOpResultFn,
|
|
GetAlgebraicOpResultFn, IsEndomorphismOpFn, IsAlgebraicOpFn,
|
|
detail::CreateAlgebraicOpForEndomorphismSimplification>(
|
|
std::forward<GetEndomorphismOpOperandFnArg>(
|
|
getEndomorphismOpOperand),
|
|
std::forward<GetEndomorphismOpResultFnArg>(getEndomorphismOpResult),
|
|
std::forward<GetAlgebraicOpOperandsFnArg>(getAlgebraicOpOperands),
|
|
std::forward<GetAlgebraicOpResultFnArg>(getAlgebraicOpResult),
|
|
std::forward<GetAlgebraicOpResultFnArg>(getAlgebraicOpResult),
|
|
std::forward<IsEndomorphismOpFnArg>(isEndomorphismOp),
|
|
std::forward<IsAlgebraicOpFnArg>(isAlgebraicOp),
|
|
detail::CreateAlgebraicOpForEndomorphismSimplification(),
|
|
std::forward<RewritePatternArgs>(args)...) {}
|
|
};
|
|
|
|
} // namespace mlir
|
|
|
|
#endif // MLIR_TRANSFORMS_SIMPLIFY_ENDOMORPHISM_H_
|