13#include "mlir/IR/Threading.h"
14#include "mlir/Pass/Pass.h"
18#define GEN_PASS_DEF_MERGETAPS
19#include "circt/Dialect/Arc/ArcPasses.h.inc"
28struct MergeTapsPass :
public arc::impl::MergeTapsBase<MergeTapsPass> {
29 using MergeTapsBase::MergeTapsBase;
33 void runOnOperation()
override { mergeTaps(); }
37void MergeTapsPass::mergeTaps() {
41 for (
auto tapOp : getOperation().
getBodyBlock()->getOps<arc::TapOp>()) {
42 SmallVector<TapOp> aliasTaps;
43 for (
auto user : tapOp.getOperand().getUsers()) {
46 if (
auto otherTap = dyn_cast<arc::TapOp>(user)) {
48 if (tapOp->getBlock() == otherTap->getBlock())
49 aliasTaps.push_back(otherTap);
52 if (aliasTaps.empty())
55 SmallVector<Attribute> names;
56 aliasTaps.push_back(tapOp);
57 for (
auto mergeTap : aliasTaps) {
58 for (
auto nameAttr : mergeTap.getNames())
59 names.push_back(nameAttr);
60 if (mergeTap != tapOp)
64 llvm::sort(names, [](Attribute a, Attribute b) {
65 return cast<StringAttr>(a).getValue() < cast<StringAttr>(b).getValue();
67 names.erase(llvm::unique(names), names.end());
68 tapOp.setNamesAttr(ArrayAttr::get(tapOp.getContext(), names));
static Block * getBodyBlock(FModuleLike mod)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.