My Project
LinalgTransforms.h
Go to the documentation of this file.
1 //===- LinalgTransforms.h - Linalg transformations as patterns --*- C++ -*-===//
2 //
3 // Part of the MLIR Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef DIALECT_LINALG_TRANSFORMS_LINALGTRANSFORMS_H_
10 #define DIALECT_LINALG_TRANSFORMS_LINALGTRANSFORMS_H_
11 
16 #include "mlir/IR/PatternMatch.h"
17 #include "mlir/Pass/Pass.h"
18 
19 #include "llvm/ADT/STLExtras.h"
20 
21 namespace mlir {
22 namespace linalg {
23 
24 // Marker used as attribute name in generated Linalg rewriting transformations.
26  static const StringLiteral kLinalgTransformMarker;
27 };
28 
29 namespace detail {
30 // Implementation detail of isProducedByOpOfType avoids the need for explicit
31 // template instantiations.
32 bool isProducedByOpOfTypeImpl(Operation *consumerOp, Value consumedView,
33  function_ref<bool(Operation *)> isaOpType);
34 } // namespace detail
35 
36 // Returns true if the `consumedView` value use in `consumerOp` is produced by
37 // an op of type `OpTy`. This is used to implement use-def type information on
38 // buffers.
39 template <typename OpTy>
40 bool isProducedByOpOfType(Operation *consumerOp, Value consumedView) {
42  consumerOp, consumedView, [](Operation *op) { return isa<OpTy>(op); });
43 }
44 
46 // The following Declarative Rewrite Rule (DRR) helpers are used in rewrite
47 // patterns. As such, they must not call into `rewriter.erase/replace` APIs and
48 // it is the responsibility of the enclosing PatternRewriter to erase on
49 // success.
51 
63  ArrayRef<int64_t> sizes,
64  StringRef linalgMarker,
65  ArrayRef<unsigned> permutation);
66 
70  PatternRewriter &rewriter, Operation *op, ArrayRef<int64_t> sizes,
71  ArrayRef<int64_t> operandIndicesToFuse, StringRef linalgMarker);
72 
74 template <typename ConcreteOp>
76 
78 template <typename ConcreteOp>
80 
84  Operation *op);
85 
90  ArrayRef<unsigned> permutation);
92  Operation *op,
93  ArrayRef<unsigned> permutation,
94  StringRef linalgMarker);
95 
99  Operation *op);
100 
101 } // namespace linalg
102 } // namespace mlir
103 
104 #endif // DIALECT_LINALG_TRANSFORMS_LINALGTRANSFORMS_H_
Definition: InferTypeOpInterface.cpp:20
Definition: PatternMatch.h:260
Definition: Operation.h:27
LogicalResult tileLinalgOpAndSetMarker(PatternRewriter &rewriter, Operation *op, ArrayRef< int64_t > sizes, StringRef linalgMarker, ArrayRef< unsigned > permutation)
Definition: LinalgTransforms.cpp:43
bool isProducedByOpOfType(Operation *consumerOp, Value consumedView)
Definition: LinalgTransforms.h:40
SmallVector< Value, 0 > permuteGenericLinalgOp(PatternRewriter &rewriter, Operation *op, ArrayRef< unsigned > permutation, StringRef linalgMarker)
Definition: LinalgTransforms.cpp:224
LogicalResult promoteSubviewsLinalgOpPrecondition(Operation *op)
Promote std.subviews feeding linalg operations.
Definition: LinalgTransforms.cpp:260
LogicalResult permuteGenericLinalgOpPrecondition(Operation *op, ArrayRef< unsigned > permutation)
Definition: LinalgTransforms.cpp:209
LogicalResult tileAndFuseLinalgOpAndSetMarker(PatternRewriter &rewriter, Operation *op, ArrayRef< int64_t > sizes, ArrayRef< int64_t > operandIndicesToFuse, StringRef linalgMarker)
Definition: LinalgTransforms.cpp:55
Definition: LLVM.h:49
Definition: LogicalResult.h:18
Definition: LLVM.h:37
SmallVector< Value, 0 > vectorizeGenericLinalgOp(PatternRewriter &rewriter, Operation *op)
Definition: LinalgTransforms.cpp:181
SmallVector< Value, 0 > promoteSubviewsLinalgOp(PatternRewriter &rewriter, Operation *op)
Definition: LinalgTransforms.cpp:273
LogicalResult linalgOpToLoops(PatternRewriter &rewriter, Operation *op)
Emits a loop nest of loop.for with the proper body for op.
Definition: LinalgToLoops.cpp:560
LogicalResult linalgOpToAffineLoops(PatternRewriter &rewriter, Operation *op)
Emits a loop nest of affine.for with the proper body for op.
Definition: LinalgToLoops.cpp:568
Definition: Value.h:38
Definition: LinalgTransforms.h:25
Definition: LLVM.h:35
static const StringLiteral kLinalgTransformMarker
Definition: LinalgTransforms.h:26
LogicalResult vectorizeGenericLinalgOpPrecondition(Operation *op)
Rewrite a linalg.generic into a suitable vector.contraction op.
Definition: LinalgTransforms.cpp:160
bool isProducedByOpOfTypeImpl(Operation *consumerOp, Value consumedView, function_ref< bool(Operation *)> isaOpType)
Definition: LinalgTransforms.cpp:92