CIRCT 20.0.0git
Loading...
Searching...
No Matches
DropName.cpp
Go to the documentation of this file.
1//===- DropName.cpp - Drop Names -----------------------------------------===//
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//
9// This file defines the DropName pass.
10//
11//===----------------------------------------------------------------------===//
12
16#include "mlir/Pass/Pass.h"
17
18namespace circt {
19namespace firrtl {
20#define GEN_PASS_DEF_DROPNAME
21#include "circt/Dialect/FIRRTL/Passes.h.inc"
22} // namespace firrtl
23} // namespace circt
24
25using namespace circt;
26using namespace firrtl;
27
28namespace {
29struct DropNamesPass : public circt::firrtl::impl::DropNameBase<DropNamesPass> {
30 DropNamesPass(PreserveValues::PreserveMode preserveMode) {
31 this->preserveMode = preserveMode;
32 }
33
34 enum ModAction { Drop, Keep, Demote };
35
36 void runOnOperation() override {
37 size_t namesDropped = 0;
38 size_t namesChanged = 0;
39 if (preserveMode == PreserveValues::None) {
40 // Drop all names.
41 dropNamesIf(namesChanged, namesDropped, [](FNamableOp op) {
42 if (isUselessName(op.getName()))
43 return ModAction::Drop;
44 return ModAction::Demote;
45 });
46 } else if (preserveMode == PreserveValues::Strip) {
47 // Strip all names.
48 dropNamesIf(namesChanged, namesDropped,
49 [](FNamableOp op) { return ModAction::Drop; });
50 } else if (preserveMode == PreserveValues::Named) {
51 // Drop the name if it isn't considered meaningful.
52 dropNamesIf(namesChanged, namesDropped, [](FNamableOp op) {
53 auto name = op.getName();
54 if (isUselessName(name))
55 return ModAction::Drop;
56 if (name.starts_with("_"))
57 return ModAction::Demote;
58 return ModAction::Keep;
59 });
60 } else if (preserveMode == PreserveValues::All) {
61 // Drop the name if it isn't considered meaningful.
62 dropNamesIf(namesChanged, namesDropped, [](FNamableOp op) {
63 if (isUselessName(op.getName()))
64 return ModAction::Demote;
65 return ModAction::Keep;
66 });
67 }
68 numNamesConverted += namesChanged;
69 numNamesDropped += namesDropped;
70 }
71
72private:
73 size_t dropNamesIf(size_t &namesChanged, size_t &namesDropped,
74 llvm::function_ref<ModAction(FNamableOp)> pred) {
75 size_t changedNames = 0;
76 auto emptyNameAttr = StringAttr::get(&getContext(), "");
77 auto droppableNameAttr =
78 NameKindEnumAttr::get(&getContext(), NameKindEnum::DroppableName);
79 getOperation()->walk([&](FNamableOp op) {
80 switch (pred(op)) {
81 case ModAction::Drop:
82 op.setNameAttr(emptyNameAttr);
83 op.setNameKindAttr(droppableNameAttr);
84 ++namesDropped;
85 break;
86 case ModAction::Demote:
87 op.setNameKindAttr(droppableNameAttr);
88 ++namesChanged;
89 break;
90 default:
91 break;
92 }
93 });
94 return changedNames;
95 }
96};
97
98} // end anonymous namespace
99
100std::unique_ptr<mlir::Pass>
102 return std::make_unique<DropNamesPass>(mode);
103}
@ None
Don't explicitly preserve any named values.
Definition Passes.h:54
@ Strip
Strip all names. No name on declaration is preserved.
Definition Passes.h:50
std::unique_ptr< mlir::Pass > createDropNamesPass(PreserveValues::PreserveMode mode=PreserveValues::None)
Definition DropName.cpp:101
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
bool isUselessName(StringRef name)
Return true if this is a possibly useless temporary name.
Definition Naming.cpp:16