My Project
InliningUtils.h
Go to the documentation of this file.
1 //===- InliningUtils.h - Inliner utilities ----------------------*- 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 // This header file defines interfaces for various inlining utility methods.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_TRANSFORMS_INLINING_UTILS_H
14 #define MLIR_TRANSFORMS_INLINING_UTILS_H
15 
17 #include "mlir/IR/Location.h"
18 #include "mlir/IR/Region.h"
19 
20 namespace mlir {
21 
22 class Block;
23 class BlockAndValueMapping;
24 class CallableOpInterface;
25 class CallOpInterface;
26 class FuncOp;
27 class OpBuilder;
28 class Operation;
29 class Region;
30 class Value;
31 
32 //===----------------------------------------------------------------------===//
33 // InlinerInterface
34 //===----------------------------------------------------------------------===//
35 
40  : public DialectInterface::Base<DialectInlinerInterface> {
41 public:
42  DialectInlinerInterface(Dialect *dialect) : Base(dialect) {}
43 
44  //===--------------------------------------------------------------------===//
45  // Analysis Hooks
46  //===--------------------------------------------------------------------===//
47 
53  virtual bool isLegalToInline(Region *dest, Region *src,
54  BlockAndValueMapping &valueMapping) const {
55  return false;
56  }
57 
63  virtual bool isLegalToInline(Operation *op, Region *dest,
64  BlockAndValueMapping &valueMapping) const {
65  return false;
66  }
67 
72  virtual bool shouldAnalyzeRecursively(Operation *op) const { return true; }
73 
74  //===--------------------------------------------------------------------===//
75  // Transformation Hooks
76  //===--------------------------------------------------------------------===//
77 
85  virtual void handleTerminator(Operation *op, Block *newDest) const {
86  llvm_unreachable("must implement handleTerminator in the case of multiple "
87  "inlined blocks");
88  }
89 
98  virtual void handleTerminator(Operation *op,
99  ArrayRef<Value> valuesToReplace) const {
100  llvm_unreachable(
101  "must implement handleTerminator in the case of one inlined block");
102  }
103 
120  Type resultType,
121  Location conversionLoc) const {
122  return nullptr;
123  }
124 };
125 
130  : public DialectInterfaceCollection<DialectInlinerInterface> {
131 public:
132  using Base::Base;
133 
136  virtual void
138 
142 
143  //===--------------------------------------------------------------------===//
144  // Analysis Hooks
145  //===--------------------------------------------------------------------===//
146 
147  virtual bool isLegalToInline(Region *dest, Region *src,
148  BlockAndValueMapping &valueMapping) const;
149  virtual bool isLegalToInline(Operation *op, Region *dest,
150  BlockAndValueMapping &valueMapping) const;
151  virtual bool shouldAnalyzeRecursively(Operation *op) const;
152 
153  //===--------------------------------------------------------------------===//
154  // Transformation Hooks
155  //===--------------------------------------------------------------------===//
156 
157  virtual void handleTerminator(Operation *op, Block *newDest) const;
158  virtual void handleTerminator(Operation *op,
159  ArrayRef<Value> valuesToRepl) const;
160 };
161 
162 //===----------------------------------------------------------------------===//
163 // Inline Methods.
164 //===----------------------------------------------------------------------===//
165 
180  Operation *inlinePoint, BlockAndValueMapping &mapper,
181  ArrayRef<Value> resultsToReplace,
182  Optional<Location> inlineLoc = llvm::None,
183  bool shouldCloneInlinedRegion = true);
184 
189  Operation *inlinePoint,
190  ArrayRef<Value> inlinedOperands,
191  ArrayRef<Value> resultsToReplace,
192  Optional<Location> inlineLoc = llvm::None,
193  bool shouldCloneInlinedRegion = true);
194 
201 LogicalResult inlineCall(InlinerInterface &interface, CallOpInterface call,
202  CallableOpInterface callable, Region *src,
203  bool shouldCloneInlinedRegion = true);
204 
205 } // end namespace mlir
206 
207 #endif // MLIR_TRANSFORMS_INLINING_UTILS_H
Definition: InferTypeOpInterface.cpp:20
Definition: Region.h:23
LogicalResult inlineRegion(InlinerInterface &interface, Region *src, Operation *inlinePoint, BlockAndValueMapping &mapper, ArrayRef< Value > resultsToReplace, Optional< Location > inlineLoc=llvm::None, bool shouldCloneInlinedRegion=true)
Definition: InliningUtils.cpp:128
virtual bool shouldAnalyzeRecursively(Operation *op) const
Definition: InliningUtils.h:72
Definition: Operation.h:27
Definition: DialectInterface.h:27
DialectInterfaceBase< ConcreteType, BaseT > Base
Definition: DialectInterface.h:29
Block represents an ordered list of Operations.
Definition: Block.h:21
virtual void processInlinedBlocks(iterator_range< Region::iterator > inlinedBlocks)
Definition: InliningUtils.h:137
Definition: DialectInterface.h:150
Definition: LLVM.h:40
virtual bool isLegalToInline(Operation *op, Region *dest, BlockAndValueMapping &valueMapping) const
Definition: InliningUtils.h:63
Definition: Location.h:52
LogicalResult inlineCall(InlinerInterface &interface, CallOpInterface call, CallableOpInterface callable, Region *src, bool shouldCloneInlinedRegion=true)
Definition: InliningUtils.cpp:279
Definition: LogicalResult.h:18
Definition: LLVM.h:37
virtual void handleTerminator(Operation *op, Block *newDest) const
Definition: InliningUtils.h:85
DialectInlinerInterface(Dialect *dialect)
Definition: InliningUtils.h:42
Definition: InliningUtils.h:39
Definition: Dialect.h:39
virtual bool isLegalToInline(Region *dest, Region *src, BlockAndValueMapping &valueMapping) const
Definition: InliningUtils.h:53
Definition: Types.h:84
Definition: InliningUtils.h:129
Definition: Value.h:38
Definition: BlockAndValueMapping.h:26
virtual void handleTerminator(Operation *op, ArrayRef< Value > valuesToReplace) const
Definition: InliningUtils.h:98
OperationBuilder< mlir::CallOp > call
Definition: Intrinsics.h:200
Definition: LLVM.h:50
virtual Operation * materializeCallConversion(OpBuilder &builder, Value input, Type resultType, Location conversionLoc) const
Definition: InliningUtils.h:119
Definition: StandardTypes.h:63
Definition: Builders.h:158