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"
40struct CIRCanonicalizePass
41 :
public impl::CIRCanonicalizeBase<CIRCanonicalizePass> {
42 using CIRCanonicalizeBase::CIRCanonicalizeBase;
52 void runOnOperation()
override;
55void CIRCanonicalizePass::runOnOperation() {
56 RewritePatternSet patterns(&getContext());
59 mlir::Dialect *cir = getContext().getLoadedDialect<cir::CIRDialect>();
60 for (mlir::RegisteredOperationName op :
61 getContext().getRegisteredOperations())
62 if (&op.getDialect() == cir)
63 op.getCanonicalizationPatterns(patterns, &getContext());
66 llvm::SmallVector<Operation *, 16> ops;
67 getOperation()->walk([&](Operation *op) {
73 if (isa<BrOp, BrCondOp, CastOp, ScopeOp, SwitchOp, SelectOp, UnaryOp,
74 ComplexCreateOp, ComplexImagOp, ComplexRealOp, VecCmpOp,
75 VecCreateOp, VecExtractOp, VecShuffleOp, VecShuffleDynamicOp,
76 VecTernaryOp, BitClrsbOp, BitClzOp, BitCtzOp, BitFfsOp, BitParityOp,
77 BitPopcountOp, BitReverseOp, ByteSwapOp, RotateOp, ConstantOp>(op))
82 if (applyOpPatternsGreedily(ops, std::move(patterns)).failed())
89 return std::make_unique<CIRCanonicalizePass>();
std::unique_ptr< Pass > createCIRCanonicalizePass()