P4C
The P4 Compiler
Loading...
Searching...
No Matches
local_copyprop.h
1/*
2 * Copyright 2013-present Barefoot Networks, Inc.
3 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef MIDEND_LOCAL_COPYPROP_H_
9#define MIDEND_LOCAL_COPYPROP_H_
10
11#include "frontends/common/resolveReferences/resolveReferences.h"
12#include "frontends/p4/typeChecking/typeChecker.h"
13#include "has_side_effects.h"
14#include "ir/ir.h"
15#include "ir/visitor.h"
16
17namespace P4 {
18using LocalCopyPropPolicyCallbackFn = std::function<bool(
19 const Visitor::Context *, const IR::Expression *, const DeclarationLookup *)>;
46class DoLocalCopyPropagation : public ControlFlowVisitor,
49 ResolutionContext {
50 TypeMap *typeMap;
51 bool working = false;
52 struct VarInfo {
53 bool local = false;
54 bool live = false;
55 const IR::Expression *val = nullptr;
56 };
57 struct TableInfo {
58 std::set<cstring> keyreads, actions;
59 int apply_count = 0;
60 std::map<cstring, const IR::Expression *> key_remap;
61 };
62 struct FuncInfo {
63 std::set<cstring> reads, writes;
64 int apply_count = 0;
65
70 bool is_first_write_insert = false;
71 };
72 std::map<cstring, VarInfo> available;
73 std::shared_ptr<std::map<cstring, TableInfo>> tables;
74 std::shared_ptr<std::map<cstring, FuncInfo>> actions;
75 std::shared_ptr<std::map<cstring, FuncInfo>> methods;
76 std::shared_ptr<std::map<cstring, FuncInfo>> states;
77 TableInfo *inferForTable = nullptr;
78 FuncInfo *inferForFunc = nullptr;
79 bool need_key_rewrite = false;
80 LocalCopyPropPolicyCallbackFn policy;
81 bool elimUnusedTables = false;
82 int uid = -1;
83 static int uid_ctr;
84
85 DoLocalCopyPropagation *clone() const override {
86 auto *rv = new DoLocalCopyPropagation(*this);
87 rv->uid = ++uid_ctr;
88 LOG8("flow_clone(" << uid << ") = " << rv->uid);
89 return rv;
90 }
91 void flow_merge(Visitor &) override;
92 void flow_copy(ControlFlowVisitor &) override;
93 bool operator==(const ControlFlowVisitor &) const override;
94 bool name_overlap(cstring, cstring);
95 void forOverlapAvail(cstring, std::function<void(cstring, VarInfo *)>);
96 void dropValuesUsing(cstring);
97 bool hasSideEffects(const IR::Expression *e, const Visitor::Context *ctxt) {
98 return bool(::P4::hasSideEffects(typeMap, e, ctxt));
99 }
100 bool isHeaderUnionIsValid(const IR::Expression *e);
101
102 class LoopPrepass : public Inspector {
103 DoLocalCopyPropagation &self;
104 void postorder(const IR::BaseAssignmentStatement *) override;
105 void postorder(const IR::MethodCallExpression *) override;
106 void apply_table(TableInfo *tbl);
107 void apply_function(FuncInfo *tbl);
108
109 public:
110 explicit LoopPrepass(DoLocalCopyPropagation &s) : self(s) {}
111 };
112
113 void visit_local_decl(const IR::Declaration_Variable *);
114 const IR::Node *postorder(IR::Declaration_Variable *) override;
115 IR::Expression *preorder(IR::Expression *m) override;
116 const IR::Expression *copyprop_name(cstring name, const Util::SourceInfo &srcInfo);
117 const IR::Expression *postorder(IR::PathExpression *) override;
118 const IR::Expression *preorder(IR::Member *) override;
119 const IR::Expression *preorder(IR::ArrayIndex *) override;
120 IR::Statement *preorder(IR::Statement *) override;
121 const IR::Node *preorder(IR::BaseAssignmentStatement *) override;
122 IR::AssignmentStatement *postorder(IR::AssignmentStatement *) override;
123 IR::IfStatement *postorder(IR::IfStatement *) override;
124 IR::ForStatement *preorder(IR::ForStatement *) override;
125 IR::ForInStatement *preorder(IR::ForInStatement *) override;
126 IR::MethodCallExpression *postorder(IR::MethodCallExpression *) override;
127 IR::P4Action *preorder(IR::P4Action *) override;
128 IR::P4Action *postorder(IR::P4Action *) override;
129 IR::Function *preorder(IR::Function *) override;
130 IR::Function *postorder(IR::Function *) override;
131 IR::P4Control *preorder(IR::P4Control *) override;
132 void apply_table(TableInfo *tbl);
133 void apply_function(FuncInfo *tbl);
134 IR::P4Table *preorder(IR::P4Table *) override;
135 IR::P4Table *postorder(IR::P4Table *) override;
136 const IR::P4Parser *postorder(IR::P4Parser *) override;
137 IR::ParserState *preorder(IR::ParserState *) override;
138 IR::ParserState *postorder(IR::ParserState *) override;
139 void end_apply(const IR::Node *node) override;
140 class ElimDead;
141 class RewriteTableKeys;
142
143 DoLocalCopyPropagation(const DoLocalCopyPropagation &) = default;
144
145 public:
146 DoLocalCopyPropagation(TypeMap *typeMap, LocalCopyPropPolicyCallbackFn policy, bool eut)
147 : typeMap(typeMap),
148 tables(std::make_shared<std::map<cstring, TableInfo>>()),
149 actions(std::make_shared<std::map<cstring, FuncInfo>>()),
150 methods(std::make_shared<std::map<cstring, FuncInfo>>()),
151 states(std::make_shared<std::map<cstring, FuncInfo>>()),
152 policy(policy),
153 elimUnusedTables(eut) {}
154};
155
156class LocalCopyPropagation : public PassManager {
157 public:
158 LocalCopyPropagation(
159 TypeMap *typeMap, TypeChecking *typeChecking = nullptr,
160 LocalCopyPropPolicyCallbackFn policy = [](const Context *, const IR::Expression *,
161 const DeclarationLookup *) -> bool {
162 return true;
163 },
164 bool elimUnusedTables = false) {
165 if (!typeChecking) typeChecking = new TypeChecking(nullptr, typeMap, true);
166 passes.push_back(typeChecking);
167 passes.push_back(new DoLocalCopyPropagation(typeMap, policy, elimUnusedTables));
168 }
169 LocalCopyPropagation(TypeMap *typeMap, LocalCopyPropPolicyCallbackFn policy)
170 : LocalCopyPropagation(typeMap, nullptr, policy) {}
171};
172
173} // namespace P4
174
175#endif /* MIDEND_LOCAL_COPYPROP_H_ */
Definition referenceMap.h:57
Definition local_copyprop.cpp:58
Definition local_copyprop.cpp:134
Definition local_copyprop.h:49
Definition node.h:53
Definition visitor.h:418
Definition visitor.h:811
Definition visitor.h:442
Definition typeChecker.h:55
Definition typeMap.h:32
Definition source_file.h:132
Definition visitor.h:75
Definition cstring.h:85
Definition has_side_effects.h:19
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13