CIRCT  19.0.0git
GenericReductions.cpp
Go to the documentation of this file.
1 //===- GenericReductions.cpp - Generic Reduction patterns -----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
11 #include "mlir/Transforms/GreedyPatternRewriteDriver.h"
12 #include "mlir/Transforms/Passes.h"
13 
14 using namespace mlir;
15 using namespace circt;
16 
17 //===----------------------------------------------------------------------===//
18 // Reduction Patterns
19 //===----------------------------------------------------------------------===//
20 
21 /// A sample reduction pattern that removes operations which either produce no
22 /// results or their results have no users.
23 struct OperationPruner : public Reduction {
24  void beforeReduction(mlir::ModuleOp module) override {
25  userMap = std::make_unique<SymbolUserMap>(table, module);
26  }
27  uint64_t match(Operation *op) override {
28  if (op->hasTrait<OpTrait::IsTerminator>())
29  return false;
30 
31  return !isa<ModuleOp>(op) &&
32  (op->getNumResults() == 0 || op->use_empty()) &&
33  userMap->useEmpty(op);
34  }
35  LogicalResult rewrite(Operation *op) override {
36  reduce::pruneUnusedOps(op, *this);
37  return success();
38  }
39  std::string getName() const override { return "operation-pruner"; }
40 
41  SymbolTableCollection table;
42  std::unique_ptr<SymbolUserMap> userMap;
43 };
44 
45 //===----------------------------------------------------------------------===//
46 // Reduction Registration
47 //===----------------------------------------------------------------------===//
48 
49 static std::unique_ptr<Pass> createSimpleCanonicalizerPass() {
50  GreedyRewriteConfig config;
51  config.useTopDownTraversal = true;
52  config.enableRegionSimplification = false;
53  return createCanonicalizerPass(config);
54 }
55 
56 void circt::populateGenericReducePatterns(MLIRContext *context,
58  patterns.add<PassReduction, 3>(context, createCSEPass());
60  patterns.add<OperationPruner, 1>();
61 }
static std::unique_ptr< Pass > createSimpleCanonicalizerPass()
void pruneUnusedOps(Operation *initialOp, Reduction &reduction)
Starting at the given op, traverse through it and its operands and erase operations that have no more...
This file defines an intermediate representation for circuits acting as an abstraction for constraint...
Definition: DebugAnalysis.h:21
void populateGenericReducePatterns(MLIRContext *context, ReducePatternSet &patterns)
Populate reduction patterns that are not specific to certain operations or dialects.
A sample reduction pattern that removes operations which either produce no results or their results h...
LogicalResult rewrite(Operation *op) override
Apply the reduction to a specific operation.
uint64_t match(Operation *op) override
Check if the reduction can apply to a specific operation.
std::unique_ptr< SymbolUserMap > userMap
void beforeReduction(mlir::ModuleOp module) override
Called before the reduction is applied to a new subset of operations.
std::string getName() const override
Return a human-readable name for this reduction pattern.
SymbolTableCollection table
A reduction pattern that applies an mlir::Pass.
Definition: Reduction.h:99
An abstract reduction pattern.
Definition: Reduction.h:24