[mlir][Pattern] Create a new IRRewriter class to enable sharing code with pattern...
authorRiver Riddle <riddleriver@gmail.com>
Tue, 2 Feb 2021 19:32:52 +0000 (11:32 -0800)
committerRiver Riddle <riddleriver@gmail.com>
Tue, 2 Feb 2021 20:04:51 +0000 (12:04 -0800)
commitec10f0660963c77413f31a9b232b453f09425387
tree8a7f65e2f7c4f70d42bd3c5b140ef55de1b82f5d
parente2bd29a0d680158a66472859a18af0f1d450bbe1
[mlir][Pattern] Create a new IRRewriter class to enable sharing code with pattern rewrites

This revision adds two new classes, RewriterBase and IRRewriter. RewriterBase is a new shared base class between IRRewriter and PatternRewriter. PatternRewriter will continue to be the base class used to perform rewrites within a rewrite pattern. IRRewriter on the other hand, is a new class that allows for tracking IR rewrites from outside of a rewrite pattern. In this revision all of the old API from PatternRewriter is moved to RewriterBase, but the distinction between IRRewriter and PatternRewriter is kept on the chance that a necessary API divergence happens in the future.

Currently if you want to have some utility that transforms a piece of IR and share it between pattern and non-pattern code, you have to duplicate it. This revision enables the creation of utilities that can be invoked from rewrite patterns and normal transformation code:

```c++
void someSharedUtility(RewriterBase &rewriter, ...) {
  // Some interesting IR mutation here.
}

// Some RewritePattern
LogicalResult MyPattern::matchAndRewrite(Operation *op, PatternRewriter &rewriter) {
  ...
  someSharedUtility(rewriter, ...);
  ...
}

// Some Pass
void MyPass::runOnOperation() {
  ...
  IRRewriter rewriter(...);
  someSharedUtility(rewriter, ...);
}
```

Differential Revision: https://reviews.llvm.org/D94638
mlir/include/mlir/IR/PatternMatch.h
mlir/lib/IR/PatternMatch.cpp