20#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
26#define GEN_PASS_DEF_SIMPLIFYASSUMEEQPASS
27#include "circt/Dialect/Verif/Passes.h.inc"
35struct SimplifyAssumeEqPass
36 : verif::impl::SimplifyAssumeEqPassBase<SimplifyAssumeEqPass> {
37 void runOnOperation()
override;
40LogicalResult tryReplaceEqualValues(mlir::Value &from, mlir::Value &to,
41 AssumeOp &op, PatternRewriter &rewriter) {
42 auto *fromOp = from.getDefiningOp();
43 if (fromOp && dyn_cast<verif::SymbolicValueOp>(fromOp)) {
44 rewriter.replaceAllUsesWith(from, to);
45 rewriter.eraseOp(fromOp);
47 return llvm::success();
55 LogicalResult matchAndRewrite(AssumeOp op,
56 PatternRewriter &rewriter)
const override {
57 auto prop = op.getProperty();
58 auto icmp = prop.getDefiningOp<comb::ICmpOp>();
60 return llvm::failure();
62 if (icmp.getPredicate() != comb::ICmpPredicate::eq)
63 return llvm::failure();
65 auto lhs = icmp.getLhs();
66 auto rhs = icmp.getRhs();
69 if (succeeded(tryReplaceEqualValues(lhs, rhs, op, rewriter)))
71 if (succeeded(tryReplaceEqualValues(rhs, lhs, op, rewriter)))
73 return llvm::failure();
78void SimplifyAssumeEqPass::runOnOperation() {
79 RewritePatternSet
patterns(&getContext());
82 if (failed(applyPatternsGreedily(getOperation(), std::move(
patterns))))
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.