12#include "mlir/IR/Operation.h"
13#include "llvm/ADT/SmallSet.h"
35 while (!worklist.empty()) {
36 auto *op = worklist.pop_back_val();
37 if (!op || handled.contains(op) || !op->use_empty() ||
38 op->hasAttr(
"inner_sym"))
41 for (
auto arg : op->getOperands())
42 if (
auto *argOp = arg.getDefiningOp())
43 worklist.push_back(argOp);
50 SmallVector<Operation *> worklist({initialOp});
59 return op->getAttrOfType<StringAttr>(SymbolTable::getSymbolAttrName());
63 root->walk([&](Operation *op) {
64 auto collect = [&](Attribute attr) {
65 if (
auto symbolRef = dyn_cast<FlatSymbolRefAttr>(attr))
68 if (
auto innerRef = dyn_cast<hw::InnerRefAttr>(attr)) {
69 innerRefs.insert({innerRef.getModule(), innerRef.getName()});
73 for (
auto namedAttr : op->getAttrs())
74 namedAttr.getValue().walk(collect);
75 for (
auto result : op->getResults())
76 result.getType().walk(collect);
77 for (
auto ®ion : op->getRegions())
78 for (
auto &block : region)
79 for (
auto arg : block.getArguments())
80 arg.getType().walk(collect);
90 auto *parent = op->getParentOp();
92 parent = parent->getParentOp();
101 return innerRefs.contains({innerRef.getModule(), innerRef.getName()});
109 StringAttr innerSym)
const {
110 return innerRefs.contains({symbol, innerSym});
static StringAttr getSymbolName(Operation *op)
static StringAttr getInnerSymbol(Operation *op)
Get InnerSymbol for an operation.
void pruneUnusedOps(SmallVectorImpl< Operation * > &worklist, Reduction &reduction)
Starting from an initial worklist of operations, traverse through it and its operands and erase opera...
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
An abstract reduction pattern.
void notifyOpErased(Operation *op)
DenseSet< StringAttr > innerRefModules
Symbol names used in inner refs.
bool hasSymbolRef(Operation *op) const
Check whether the given symbol is targeted by a symbol ref.
bool hasInnerRef(Operation *op) const
Check whether an op is targeted by an inner ref.
DenseSet< StringAttr > symbolRefs
Symbol names used in symbol or inner refs.
InnerSymbolUses()=default
bool hasRef(Operation *op) const
Check whether the given symbol is targeted by a symbol ref or inner ref.
DenseSet< std::pair< StringAttr, StringAttr > > innerRefs
Symbol and inner symbol name pairs used in inner refs.