15#include "mlir/Dialect/Func/IR/FuncOps.h"
16#include "mlir/IR/Block.h"
17#include "mlir/IR/Operation.h"
18#include "mlir/IR/PatternMatch.h"
19#include "mlir/IR/Region.h"
20#include "mlir/Support/LogicalResult.h"
21#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
42struct RemoveRedundantBranches :
public OpRewritePattern<BrOp> {
43 using OpRewritePattern<BrOp>::OpRewritePattern;
45 LogicalResult matchAndRewrite(BrOp op,
46 PatternRewriter &rewriter)
const final {
47 Block *block = op.getOperation()->getBlock();
48 Block *dest = op.getDest();
50 if (isa<cir::LabelOp>(dest->front()))
53 if (block->getNumSuccessors() == 1 &&
54 dest->getSinglePredecessor() == block) {
56 rewriter.mergeBlocks(dest, block);
64struct RemoveEmptyScope :
public OpRewritePattern<ScopeOp> {
65 using OpRewritePattern<ScopeOp>::OpRewritePattern;
67 LogicalResult matchAndRewrite(ScopeOp op,
68 PatternRewriter &rewriter)
const final {
76 Region ®ion = op.getScopeRegion();
77 if (region.getBlocks().front().getOperations().size() == 1 &&
78 isa<YieldOp>(region.getBlocks().front().front())) {
87struct RemoveEmptySwitch :
public OpRewritePattern<SwitchOp> {
88 using OpRewritePattern<SwitchOp>::OpRewritePattern;
90 LogicalResult matchAndRewrite(SwitchOp op,
91 PatternRewriter &rewriter)
const final {
92 if (!(op.getBody().empty() || isa<YieldOp>(op.getBody().front().front())))
104struct CIRCanonicalizePass :
public CIRCanonicalizeBase<CIRCanonicalizePass> {
105 using CIRCanonicalizeBase::CIRCanonicalizeBase;
115 void runOnOperation()
override;
118void populateCIRCanonicalizePatterns(RewritePatternSet &patterns) {
121 RemoveRedundantBranches,
123 >(patterns.getContext());
127void CIRCanonicalizePass::runOnOperation() {
129 RewritePatternSet patterns(&getContext());
130 populateCIRCanonicalizePatterns(patterns);
134 getOperation()->walk([&](Operation *op) {
143 if (isa<BrOp, BrCondOp, CastOp, ScopeOp, SwitchOp, SelectOp, UnaryOp,
144 ComplexCreateOp, ComplexImagOp, ComplexRealOp, VecCmpOp,
145 VecCreateOp, VecExtractOp, VecShuffleOp, VecShuffleDynamicOp,
146 VecTernaryOp, BitClrsbOp, BitClzOp, BitCtzOp, BitFfsOp, BitParityOp,
147 BitPopcountOp, BitReverseOp, ByteSwapOp, RotateOp>(op))
152 if (applyOpPatternsGreedily(ops, std::move(patterns)).failed())
159 return std::make_unique<CIRCanonicalizePass>();
std::unique_ptr< Pass > createCIRCanonicalizePass()
static bool complexRealOp()
static bool complexImagOp()