12#include "mlir/IR/Operation.h"
13#include "llvm/ADT/SmallSet.h"
19 SmallVector<Operation *> worklist;
21 worklist.push_back(initialOp);
22 while (!worklist.empty()) {
23 auto *op = worklist.pop_back_val();
24 if (!op->use_empty() || op->hasAttr(
"inner_sym"))
26 for (
auto arg : op->getOperands())
27 if (
auto *argOp = arg.getDefiningOp())
28 if (handled.insert(argOp).second)
29 worklist.push_back(argOp);
40 return op->getAttrOfType<StringAttr>(SymbolTable::getSymbolAttrName());
44 root->walk([&](Operation *op) {
45 auto collect = [&](Attribute attr) {
46 if (
auto symbolRef = dyn_cast<FlatSymbolRefAttr>(attr))
49 if (
auto innerRef = dyn_cast<hw::InnerRefAttr>(attr)) {
50 innerRefs.insert({innerRef.getModule(), innerRef.getName()});
54 for (
auto namedAttr : op->getAttrs())
55 namedAttr.getValue().walk(collect);
56 for (
auto result : op->getResults())
57 result.getType().walk(collect);
58 for (
auto ®ion : op->getRegions())
59 for (
auto &block : region)
60 for (
auto arg : block.getArguments())
61 arg.getType().walk(collect);
71 auto *parent = op->getParentOp();
73 parent = parent->getParentOp();
82 return innerRefs.contains({innerRef.getModule(), innerRef.getName()});
90 StringAttr innerSym)
const {
91 return innerRefs.contains({symbol, innerSym});
static StringAttr getSymbolName(Operation *op)
static StringAttr getInnerSymbol(Operation *op)
Get InnerSymbol for an operation.
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.
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.