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"
30#define GEN_PASS_DEF_CIRCANONICALIZE
31#include "clang/CIR/Dialect/Passes.h.inc"
47struct RemoveRedundantBranches :
public OpRewritePattern<BrOp> {
48 using OpRewritePattern<BrOp>::OpRewritePattern;
50 LogicalResult matchAndRewrite(BrOp op,
51 PatternRewriter &rewriter)
const final {
52 Block *block = op.getOperation()->getBlock();
53 Block *dest = op.getDest();
55 if (isa<cir::LabelOp, cir::IndirectBrOp>(dest->front()))
58 if (block->getNumSuccessors() == 1 &&
59 dest->getSinglePredecessor() == block) {
61 rewriter.mergeBlocks(dest, block);
73struct CIRCanonicalizePass
74 :
public impl::CIRCanonicalizeBase<CIRCanonicalizePass> {
75 using CIRCanonicalizeBase::CIRCanonicalizeBase;
85 void runOnOperation()
override;
88void populateCIRCanonicalizePatterns(RewritePatternSet &patterns) {
91 RemoveRedundantBranches
92 >(patterns.getContext());
96void CIRCanonicalizePass::runOnOperation() {
98 RewritePatternSet patterns(&getContext());
99 populateCIRCanonicalizePatterns(patterns);
102 llvm::SmallVector<Operation *, 16> ops;
103 getOperation()->walk([&](Operation *op) {
109 if (isa<BrOp, BrCondOp, CastOp, ScopeOp, SwitchOp, SelectOp, UnaryOp,
110 ComplexCreateOp, ComplexImagOp, ComplexRealOp, VecCmpOp,
111 VecCreateOp, VecExtractOp, VecShuffleOp, VecShuffleDynamicOp,
112 VecTernaryOp, BitClrsbOp, BitClzOp, BitCtzOp, BitFfsOp, BitParityOp,
113 BitPopcountOp, BitReverseOp, ByteSwapOp, RotateOp>(op))
118 if (applyOpPatternsGreedily(ops, std::move(patterns)).failed())
125 return std::make_unique<CIRCanonicalizePass>();
std::unique_ptr< Pass > createCIRCanonicalizePass()