11#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
12#include "mlir/Transforms/Passes.h"
25struct OperationPruner :
public Reduction {
27 userMap = std::make_unique<SymbolUserMap>(table, module);
29 uint64_t
match(Operation *op)
override {
30 if (op->hasTrait<OpTrait::IsTerminator>())
33 return !isa<ModuleOp>(op) &&
34 (op->getNumResults() == 0 || op->use_empty()) &&
35 userMap->useEmpty(op);
37 LogicalResult
rewrite(Operation *op)
override {
41 std::string
getName()
const override {
return "operation-pruner"; }
43 SymbolTableCollection table;
44 std::unique_ptr<SymbolUserMap> userMap;
48struct UnusedSymbolPruner :
public Reduction {
50 symbolTables = std::make_unique<SymbolTableCollection>();
51 symbolUsers = std::make_unique<SymbolUserMap>(*symbolTables, op);
54 uint64_t
match(Operation *op)
override {
55 return isa<SymbolOpInterface>(op) && symbolUsers->useEmpty(op);
58 LogicalResult
rewrite(Operation *op)
override {
63 std::string
getName()
const override {
return "unused-symbol-pruner"; }
65 std::unique_ptr<SymbolTableCollection> symbolTables;
66 std::unique_ptr<SymbolUserMap> symbolUsers;
76 GreedyRewriteConfig config;
77 config.setUseTopDownTraversal(
true);
78 config.setRegionSimplificationLevel(
79 mlir::GreedySimplifyRegionLevel::Disabled);
80 return createCanonicalizerPass(config);
85 patterns.add<UnusedSymbolPruner, 40>();
void pruneUnusedOps(Operation *initialOp, Reduction &reduction)
Starting at the given op, traverse through it and its operands and erase operations that have no more...
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
void populateGenericReducePatterns(MLIRContext *context, ReducePatternSet &patterns)
Populate reduction patterns that are not specific to certain operations or dialects.
std::unique_ptr< Pass > createSimpleCanonicalizerPass()
Create a simple canonicalizer pass.
A reduction pattern that applies an mlir::Pass.
An abstract reduction pattern.
virtual LogicalResult rewrite(Operation *op)
Apply the reduction to a specific operation.
virtual uint64_t match(Operation *op)
Check if the reduction can apply to a specific operation.
virtual std::string getName() const =0
Return a human-readable name for this reduction pattern.
virtual void beforeReduction(mlir::ModuleOp)
Called before the reduction is applied to a new subset of operations.