51 LOG8(
"ComputeDefUse::clone " << rv->uid);
54 void flow_merge(
Visitor &)
override;
58 enum { SKIPPING, NORMAL, READ_ONLY, WRITE_ONLY } state = SKIPPING;
67 bool operator<(
const loc_t &a)
const {
68 if (node != a.node)
return node->id < a.node->id;
69 if (!parent || !a.parent)
return parent !=
nullptr;
70 return *parent < *a.parent;
73 const T *find()
const {
74 for (
auto *p =
this; p; p = p->parent) {
75 if (
auto *t = p->node->to<T>())
return t;
83 std::set<loc_t> &cached_locs;
85 const loc_t *getLoc() {
return getLoc(getChildContext()); }
87 const loc_t *getLoc(
const IR::Node *n) {
return getLoc(n, getChildContext()); }
98 def_info_t *parent =
nullptr;
100 locset_t valid_bit_defs;
102 std::map<cstring, def_info_t> fields;
103 std::map<le_bitrange, def_info_t> slices;
105 void slices_sanity();
106 std::map<le_bitrange, def_info_t>::iterator slices_overlap_begin(
le_bitrange);
109 void flow_merge(def_info_t &);
110 bool operator==(
const def_info_t &)
const;
111 bool operator!=(
const def_info_t &a)
const {
return !(*
this == a); }
112 def_info_t() =
default;
113 def_info_t(
const def_info_t &);
114 def_info_t(def_info_t &&);
117 void add_uses(
const loc_t *, def_info_t &);
118 void set_live_from_type(def_info_t &di,
const IR::Type *type);
128 static const locset_t empty;
130 profile_t init_apply(
const IR::Node *root)
override {
131 auto rv = Inspector::init_apply(root);
132 LOG3(
"## Midend ComputeDefUse");
138 bool preorder(
const IR::P4Control *)
override;
139 bool preorder(
const IR::P4Table *)
override;
140 bool preorder(
const IR::P4Action *)
override;
141 bool preorder(
const IR::P4Parser *)
override;
142 bool preorder(
const IR::ParserState *)
override;
143 void revisit(
const IR::ParserState *)
override;
144 void loop_revisit(
const IR::ParserState *)
override;
145 void postorder(
const IR::ParserState *)
override;
146 bool preorder(
const IR::Type *)
override {
return false; }
147 bool preorder(
const IR::Annotations *)
override {
return false; }
148 bool preorder(
const IR::KeyElement *)
override;
149 bool preorder(
const IR::AssignmentStatement *)
override;
150 const IR::Expression *do_read(def_info_t &,
const IR::Expression *,
const Context *);
151 const IR::Expression *do_write(def_info_t &,
const IR::Expression *,
const Context *);
152 bool preorder(
const IR::PathExpression *)
override;
153 void loop_revisit(
const IR::PathExpression *)
override;
154 bool preorder(
const IR::MethodCallExpression *)
override;
155 void end_apply()
override;
157 class SetupJoinPoints;
158 void applySetupJoinPoints(
const IR::Node *root)
override;
159 bool filter_join_point(
const IR::Node *)
override;
163 : ResolutionContext(true), cached_locs(*new
std::set<loc_t>), defuse(*new defuse_t) {
165 visitDagOnce =
false;
174 const locset_t &getDefs(
const IR::Node *n)
const {
175 auto it = defuse.defs.find(n);
176 return it == defuse.defs.end() ? empty : it->second;
178 const locset_t &getUses(
const IR::Node *n)
const {
179 auto it = defuse.uses.find(n);
180 return it == defuse.uses.end() ? empty : it->second;
184 friend std::ostream &operator<<(std::ostream &,
const loc_t &);
185 friend std::ostream &operator<<(std::ostream &,
const defuse_t &);
186 friend std::ostream &operator<<(std::ostream &out,
const ComputeDefUse &cdu) {
187 return out << cdu.defuse;
Visitor mixin for looking up names in enclosing scopes from the Visitor::Context.
Definition resolveReferences.h:32