9 #ifndef MLIR_PATTERNMATCHER_H 10 #define MLIR_PATTERNMATCHER_H 16 class PatternRewriter;
30 enum { ImpossibleToMatchSentinel = 65535 };
45 return representation == rhs.representation;
49 return representation < rhs.representation;
54 unsigned short representation;
129 virtual void anchor();
149 virtual void rewrite(
Operation *op, std::unique_ptr<PatternState> state,
171 if (
auto matchResult = match(op)) {
172 rewrite(op, std::move(*matchResult), rewriter);
173 return matchSuccess();
175 return matchFailure();
187 :
Pattern(rootName, benefit, context) {}
206 :
RewritePattern(SourceOp::getOperationName(), benefit, context) {}
211 rewrite(cast<SourceOp>(op), std::move(state), rewriter);
214 rewrite(cast<SourceOp>(op), rewriter);
217 return match(cast<SourceOp>(op));
221 return matchAndRewrite(cast<SourceOp>(op), rewriter);
226 virtual void rewrite(SourceOp op, std::unique_ptr<PatternState> state,
228 rewrite(op, rewriter);
231 llvm_unreachable(
"must override matchAndRewrite or a rewrite method");
234 llvm_unreachable(
"must override match or matchAndRewrite");
238 if (
auto matchResult = match(op)) {
239 rewrite(op, std::move(*matchResult), rewriter);
240 return matchSuccess();
242 return matchFailure();
264 template <
typename OpTy,
typename... Args>
267 OpTy::build(
this, state, args...);
268 auto *op = createOperation(state);
269 auto result = dyn_cast<OpTy>(op);
270 assert(result &&
"Builder didn't return the right type");
277 template <
typename OpTy,
typename... Args>
280 OpTy::build(
this, state, args...);
281 auto *op = createOperation(state);
284 if (!OpTy::verifyInvariants(op)) {
285 auto result = dyn_cast<OpTy>(op);
286 assert(result &&
"Builder didn't return the right type");
304 virtual void inlineRegionBefore(
Region ®ion,
Region &parent,
306 void inlineRegionBefore(
Region ®ion,
Block *before);
312 virtual void cloneRegionBefore(
Region ®ion,
Region &parent,
317 void cloneRegionBefore(
Region ®ion,
Block *before);
333 template <
typename OpTy,
typename... Args>
335 auto newOp = create<OpTy>(op->
getLoc(), std::forward<Args>(args)...);
336 replaceOpWithResultsOfAnotherOp(op, newOp.getOperation(), {});
342 template <
typename OpTy,
typename... Args>
345 auto newOp = create<OpTy>(op->
getLoc(), std::forward<Args>(args)...);
346 replaceOpWithResultsOfAnotherOp(op, newOp.getOperation(),
347 valuesToRemoveIfDead);
357 virtual void mergeBlocks(
Block *source,
Block *dest,
383 template <
typename CallableT>
385 startRootUpdate(root);
387 finalizeRootUpdate(root);
419 using PatternListT = std::vector<std::unique_ptr<RewritePattern>>;
422 PatternListT::iterator
begin() {
return patterns.begin(); }
423 PatternListT::iterator
end() {
return patterns.end(); }
424 PatternListT::const_iterator
begin()
const {
return patterns.begin(); }
425 PatternListT::const_iterator
end()
const {
return patterns.end(); }
435 template <
typename... Ts,
typename ConstructorArg,
436 typename... ConstructorArgs,
437 typename = std::enable_if_t<
sizeof...(Ts) != 0>>
438 void insert(ConstructorArg &&arg, ConstructorArgs &&... args) {
445 0, (patterns.emplace_back(std::make_unique<Ts>(arg, args...)), 0)...};
449 PatternListT patterns;
471 std::vector<RewritePattern *> patterns;
489 #endif // MLIR_PATTERN_MATCH_H bool operator<(const PatternBenefit &rhs) const
Definition: PatternMatch.h:48
Definition: InferTypeOpInterface.cpp:20
virtual void notifyOperationRemoved(Operation *op)
Definition: PatternMatch.h:405
virtual PatternMatchResult matchAndRewrite(SourceOp op, PatternRewriter &rewriter) const
Definition: PatternMatch.h:236
Definition: PatternMatch.h:260
PatternMatchResult matchAndRewrite(Operation *op, PatternRewriter &rewriter) const final
Definition: PatternMatch.h:219
Definition: Operation.h:27
virtual void notifyRootReplaced(Operation *op)
Definition: PatternMatch.h:400
virtual void finalizeRootUpdate(Operation *op)
Definition: PatternMatch.h:374
OperationName getRootKind() const
Definition: PatternMatch.h:93
virtual void cancelRootUpdate(Operation *op)
Definition: PatternMatch.h:378
Block represents an ordered list of Operations.
Definition: Block.h:21
virtual ~Pattern()
Definition: PatternMatch.h:105
PatternListT::iterator begin()
Definition: PatternMatch.h:422
Definition: PatternMatch.h:456
BlockListType::iterator iterator
Definition: Region.h:41
virtual void rewrite(SourceOp op, PatternRewriter &rewriter) const
Definition: PatternMatch.h:230
OpTy create(Location location, Args... args)
Definition: PatternMatch.h:265
PatternListT::const_iterator end() const
Definition: PatternMatch.h:425
Optional< std::unique_ptr< PatternState > > PatternMatchResult
Definition: PatternMatch.h:72
PatternBenefit & operator=(const PatternBenefit &)=default
virtual PatternMatchResult match(SourceOp op) const
Definition: PatternMatch.h:233
ArrayRef< OperationName > getGeneratedOps() const
Definition: PatternMatch.h:180
void insert(ConstructorArg &&arg, ConstructorArgs &&... args)
Definition: PatternMatch.h:438
void erase()
Remove this operation from its parent block and delete it.
Definition: Operation.cpp:501
Definition: Location.h:52
Definition: PatternMatch.h:82
Definition: PatternMatch.h:142
unsigned short getBenefit() const
If the corresponding pattern can match, return its benefit. If the.
Definition: PatternMatch.cpp:20
static PatternBenefit impossibleToMatch()
Definition: PatternMatch.h:37
void replaceOp(Operation *op, ValueRange newValues)
Definition: PatternMatch.h:327
OpListType::iterator iterator
Definition: Block.h:107
void replaceOpWithNewOp(ValueRange valuesToRemoveIfDead, Operation *op, Args &&... args)
Definition: PatternMatch.h:343
Definition: PatternMatch.h:29
bool applyPatternsGreedily(Operation *op, const OwningRewritePatternList &patterns)
Definition: GreedyPatternRewriteDriver.cpp:218
void updateRootInPlace(Operation *root, CallableT &&callable)
Definition: PatternMatch.h:384
void clear()
Definition: PatternMatch.h:426
PatternBenefit getBenefit() const
Definition: PatternMatch.h:89
void rewrite(Operation *op, PatternRewriter &rewriter) const final
Definition: PatternMatch.h:213
Location getLoc()
The source location the operation was defined or derived from.
Definition: Operation.h:107
Definition: OperationSupport.h:261
PatternRewriter(MLIRContext *ctx)
Definition: PatternMatch.h:391
Definition: PatternMatch.h:60
SmallVector< OperationName, 2 > generatedOps
Definition: PatternMatch.h:196
Definition: BlockAndValueMapping.h:26
PatternMatchResult matchSuccess(std::unique_ptr< PatternState > state={}) const
This method indicates that a match was found and has the specified cost.
Definition: PatternMatch.h:116
virtual PatternMatchResult matchAndRewrite(Operation *op, PatternRewriter &rewriter) const
Definition: PatternMatch.h:169
PatternState()
Definition: PatternMatch.h:66
void replaceOpWithNewOp(Operation *op, Args &&... args)
Definition: PatternMatch.h:334
Definition: PatternMatch.h:202
Definition: PatternMatch.h:418
OpTy createChecked(Location location, Args... args)
Definition: PatternMatch.h:278
bool isImpossibleToMatch() const
Definition: PatternMatch.h:38
PatternMatchResult match(Operation *op) const final
Definition: PatternMatch.h:216
Definition: MLIRContext.h:34
bool operator==(const PatternBenefit &rhs) const
Definition: PatternMatch.h:44
static PatternMatchResult matchFailure()
This method indicates that no match was found.
Definition: PatternMatch.h:112
PatternListT::iterator end()
Definition: PatternMatch.h:423
Definition: StandardTypes.h:63
OpRewritePattern(MLIRContext *context, PatternBenefit benefit=1)
Definition: PatternMatch.h:205
virtual void startRootUpdate(Operation *op)
Definition: PatternMatch.h:369
RewritePattern(StringRef rootName, PatternBenefit benefit, MLIRContext *context)
Definition: PatternMatch.h:185
void rewrite(Operation *op, std::unique_ptr< PatternState > state, PatternRewriter &rewriter) const final
Wrappers around the RewritePattern methods that pass the derived op type.
Definition: PatternMatch.h:209
virtual void rewrite(SourceOp op, std::unique_ptr< PatternState > state, PatternRewriter &rewriter) const
Definition: PatternMatch.h:226
Definition: OperationSupport.h:203
virtual ~PatternState()
Definition: PatternMatch.h:62
Definition: Builders.h:158
Definition: OperationSupport.h:640
bool operator!=(const PatternBenefit &rhs) const
Definition: PatternMatch.h:47
PatternListT::const_iterator begin() const
Definition: PatternMatch.h:424