14#define GEN_PASS_DEF_DUPLICATEFUNCTIONELIMINATIONPASS
15#include "mlir/Dialect/Func/Transforms/Passes.h.inc"
22struct DuplicateFuncOpEquivalenceInfo
23 :
public llvm::DenseMapInfo<func::FuncOp> {
25 static unsigned getHashValue(
const func::FuncOp cFunc) {
27 return DenseMapInfo<func::FuncOp>::getHashValue(cFunc);
31 llvm::hash_code
hash = {};
32 func::FuncOp func =
const_cast<func::FuncOp &
>(cFunc);
33 StringAttr symNameAttrName = func.getSymNameAttrName();
34 for (NamedAttribute namedAttr :
35 cFunc->getDiscardableAttrDictionary().getValue()) {
36 StringAttr attrName = namedAttr.getName();
37 if (attrName == symNameAttrName)
39 hash = llvm::hash_combine(
hash, namedAttr);
43 func.getBody().walk([&](Operation *op) {
44 hash = llvm::hash_combine(
54 static bool isEqual(func::FuncOp
lhs, func::FuncOp
rhs) {
57 if (
lhs.isDeclaration() ||
rhs.isDeclaration())
61 if (
lhs->getDiscardableAttrDictionary() !=
62 rhs->getDiscardableAttrDictionary())
68 auto pLhs =
lhs.getProperties();
69 auto pRhs =
rhs.getProperties();
70 pLhs.sym_name =
nullptr;
71 pRhs.sym_name =
nullptr;
81struct DuplicateFunctionEliminationPass
82 :
public func::impl::DuplicateFunctionEliminationPassBase<
83 DuplicateFunctionEliminationPass> {
85 using DuplicateFunctionEliminationPassBase<
86 DuplicateFunctionEliminationPass>::DuplicateFunctionEliminationPassBase;
88 void runOnOperation()
override {
89 auto module = getOperation();
95 module.walk([&](func::FuncOp f) {
96 auto [repr, inserted] = uniqueFuncOps.insert(f);
97 getRepresentant[f.getSymNameAttr()] = *repr;
105 for (
auto it : toBeErased) {
106 StringAttr oldSymbol = it.getSymNameAttr();
107 StringAttr newSymbol = getRepresentant[oldSymbol].getSymNameAttr();
110 return signalPassFailure();
static size_t hash(const T &value)
Local helper to compute std::hash for a value.
*if copies could not be generated due to yet unimplemented cases *copyInPlacementStart and copyOutPlacementStart in copyPlacementBlock *specify the insertion points where the incoming copies and outgoing should be inserted(the insertion happens right before the *insertion point). Since `begin` can itself be invalidated due to the memref *rewriting done from this method
static LogicalResult replaceAllSymbolUses(StringAttr oldSymbol, StringAttr newSymbol, Operation *from)
Attempt to replace all uses of the given symbol 'oldSymbol' with the provided symbol 'newSymbol' that...
Include the generated interface declarations.
llvm::DenseSet< ValueT, ValueInfoT > DenseSet
llvm::DenseMap< KeyT, ValueT, KeyInfoT, BucketT > DenseMap
static llvm::hash_code ignoreHashValue(Value)
Helper that can be used with computeHash above to ignore operation operands/result mapping.
static bool isRegionEquivalentTo(Region *lhs, Region *rhs, function_ref< LogicalResult(Value, Value)> checkEquivalent, function_ref< void(Value, Value)> markEquivalent, OperationEquivalence::Flags flags, function_ref< LogicalResult(ValueRange, ValueRange)> checkCommutativeEquivalent=nullptr)
Compare two regions (including their subregions) and return if they are equivalent.
static llvm::hash_code computeHash(Operation *op, function_ref< llvm::hash_code(Value)> hashOperands=[](Value v) { return hash_value(v);}, function_ref< llvm::hash_code(Value)> hashResults=[](Value v) { return hash_value(v);}, Flags flags=Flags::None)
Compute a hash for the given operation.