20#include "llvm/ADT/SmallVector.h"
21#include "llvm/ADT/TypeSwitch.h"
26#define DEBUG_TYPE "linalg-named-to-elementwise"
31 .Case([](SelectOp) {
return ElementwiseKind::select; })
32 .Case([](AddOp) {
return ElementwiseKind::add; })
33 .Case([](SubOp) {
return ElementwiseKind::sub; })
34 .Case([](MulOp) {
return ElementwiseKind::mul; })
35 .Case([](DivOp) {
return ElementwiseKind::div; })
36 .Case([](DivUnsignedOp) {
return ElementwiseKind::div_unsigned; })
37 .Case([](PowFOp) {
return ElementwiseKind::powf; })
38 .Case([](ExpOp) {
return ElementwiseKind::exp; })
39 .Case([](LogOp) {
return ElementwiseKind::log; })
40 .Case([](AbsOp) {
return ElementwiseKind::abs; })
41 .Case([](CeilOp) {
return ElementwiseKind::ceil; })
42 .Case([](FloorOp) {
return ElementwiseKind::floor; })
43 .Case([](NegFOp) {
return ElementwiseKind::negf; })
44 .Case([](ReciprocalOp) {
return ElementwiseKind::reciprocal; })
45 .Case([](RoundOp) {
return ElementwiseKind::round; })
46 .Case([](SqrtOp) {
return ElementwiseKind::sqrt; })
47 .Case([](RsqrtOp) {
return ElementwiseKind::rsqrt; })
48 .Case([](SquareOp) {
return ElementwiseKind::square; })
49 .Case([](TanhOp) {
return ElementwiseKind::tanh; })
50 .Case([](ErfOp) {
return ElementwiseKind::erf; })
51 .DefaultUnreachable(
"unhandled case in named to elementwise");
54template <
typename NamedOpTy>
58 LogicalResult matchAndRewrite(NamedOpTy op,
61 auto kindAttr = ElementwiseKindAttr::get(op.getContext(), getKind(op));
62 attrs.push_back(rewriter.
getNamedAttr(
"kind", kindAttr));
64 rewriter.
getNamedAttr(
"indexing_maps", op.getIndexingMaps()));
67 op.getDpsInits(), attrs);
80 patterns.add<NamedToElementwisePattern<DivUnsignedOp>>(
patterns.getContext());
88 patterns.add<NamedToElementwisePattern<ReciprocalOp>>(
patterns.getContext());
NamedAttribute getNamedAttr(StringRef name, Attribute val)
Operation is the basic unit of execution within MLIR.
A special type of RewriterBase that coordinates the application of a rewrite pattern on the current I...
OpTy replaceOpWithNewOp(Operation *op, Args &&...args)
Replace the results of the given (original) op with a new op that is created without verification (re...
void populateLinalgNamedToElementwisePatterns(RewritePatternSet &patterns)
Populates patterns that convert linalg named ops e.g.
Include the generated interface declarations.
const FrozenRewritePatternSet & patterns
OpRewritePattern is a wrapper around RewritePattern that allows for matching and rewriting against an...