@@ -30,7 +30,8 @@ limitations under the License.
30
30
#include " midend/convertEnums.h"
31
31
#include " midend/simplifyKey.h"
32
32
#include " midend/simplifyExpressions.h"
33
- #include " midend/unreachableStates.h"
33
+ #include " midend/simplifyParsers.h"
34
+ #include " midend/resetHeaders.h"
34
35
#include " frontends/p4/strengthReduction.h"
35
36
#include " frontends/p4/typeMap.h"
36
37
#include " frontends/p4/evaluator/evaluator.h"
@@ -53,12 +54,12 @@ void MidEnd::setup_for_P4_14(CompilerOptions&) {
53
54
// human-readable results.
54
55
55
56
addPasses ({
56
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
57
+ new P4::TypeChecking (&refMap, &typeMap, isv1),
57
58
evaluator,
58
59
new P4::DiscoverInlining (&controlsToInline, &refMap, &typeMap, evaluator),
59
60
new P4::InlineDriver (&controlsToInline, new SimpleControlsInliner (&refMap), isv1),
60
61
new P4::RemoveAllUnusedDeclarations (&refMap, isv1),
61
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
62
+ new P4::TypeChecking (&refMap, &typeMap, isv1),
62
63
new P4::DiscoverActionsInlining (&actionsToInline, &refMap, &typeMap),
63
64
new P4::InlineActionsDriver (&actionsToInline, new SimpleActionsInliner (&refMap), isv1),
64
65
new P4::RemoveAllUnusedDeclarations (&refMap, isv1),
@@ -85,78 +86,45 @@ class EnumOn32Bits : public P4::ChooseEnumRepresentation {
85
86
void MidEnd::setup_for_P4_16 (CompilerOptions& options) {
86
87
// we may come through this path even if the program is actually a P4 v1.0 program
87
88
bool isv1 = options.isv1 ();
88
- auto evaluator = new P4::Evaluator (&refMap, &typeMap);
89
+ auto evaluator = new P4::EvaluatorPass (&refMap, &typeMap, isv1 );
89
90
90
91
addPasses ({
91
- new P4::ResolveReferences (&refMap, isv1),
92
- new P4::UnreachableParserStates (&refMap),
93
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
94
- new P4::ConvertEnums (new EnumOn32Bits (), &typeMap),
95
- // Proper semantics for uninitialzed local variables in parser states:
96
- // headers must be invalidated. Must recompute all types after ConvertEnums
97
- new P4::TypeChecking (&refMap, &typeMap, true , isv1),
98
- new P4::ResetHeaders (&typeMap),
99
- // Give each local declaration a unique internal name
92
+ new P4::SimplifyParsers (&refMap, isv1),
93
+ new P4::ConvertEnums (&refMap, &typeMap, isv1,
94
+ new EnumOn32Bits ()),
95
+ new P4::ResetHeaders (&refMap, &typeMap, isv1),
100
96
new P4::UniqueNames (&refMap, isv1),
101
- // Move all local declarations to the beginning
102
97
new P4::MoveDeclarations (),
103
98
new P4::MoveInitializers (),
104
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
105
- new P4::SimplifyExpressions (&refMap, &typeMap),
106
- new P4::ResolveReferences (&refMap, isv1),
107
- new P4::RemoveReturns (&refMap),
108
- // Move some constructor calls into temporaries
99
+ new P4::SimplifyExpressions (&refMap, &typeMap, isv1),
100
+ new P4::RemoveReturns (&refMap, isv1),
109
101
new P4::MoveConstructors (&refMap, isv1),
110
102
new P4::RemoveAllUnusedDeclarations (&refMap, isv1),
111
- new P4::TypeChecking (&refMap, & typeMap, true , isv1 ),
103
+ new P4::ClearTypeMap (& typeMap),
112
104
evaluator,
113
-
114
105
new VisitFunctor ([evaluator](const IR::Node *root) -> const IR::Node * {
115
106
auto toplevel = evaluator->getToplevelBlock ();
116
107
if (toplevel->getMain () == nullptr )
117
108
// nothing further to do
118
109
return nullptr ;
119
110
return root; }),
120
-
121
- // Inlining
122
- new P4::DiscoverInlining (&controlsToInline, &refMap, &typeMap, evaluator),
123
- new P4::InlineDriver (&controlsToInline, new P4::GeneralInliner (isv1), isv1),
124
- new P4::RemoveAllUnusedDeclarations (&refMap, isv1),
125
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
126
- new P4::DiscoverActionsInlining (&actionsToInline, &refMap, &typeMap),
127
- new P4::InlineActionsDriver (&actionsToInline, new P4::ActionsInliner (), isv1),
128
- new P4::RemoveAllUnusedDeclarations (&refMap, isv1),
129
- // TODO: simplify statements and expressions.
130
- // This is required for the correctness of some of the following passes.
131
-
132
- // Clone an action for each use, so we can specialize the action
133
- // per user (e.g., for each table or direct invocation).
111
+ new P4::Inline (&refMap, &typeMap, evaluator, isv1),
112
+ new P4::InlineActions (&refMap, &typeMap, isv1),
134
113
new P4::LocalizeAllActions (&refMap, isv1),
135
- new P4::RemoveAllUnusedDeclarations (&refMap, isv1),
136
- // Table and action parameters also get unique names
137
114
new P4::UniqueParameters (&refMap, isv1),
138
- // Clear types after LocalizeAllActions
139
- new P4::TypeChecking (&refMap, &typeMap, true , isv1),
140
- new P4::SimplifyControlFlow (&refMap, &typeMap),
115
+ new P4::ClearTypeMap (&typeMap),
116
+ new P4::SimplifyControlFlow (&refMap, &typeMap, isv1),
141
117
new P4::RemoveParameters (&refMap, &typeMap, isv1),
142
- new P4::TypeChecking (&refMap, & typeMap, true , isv1 ),
143
- new P4::SimplifyKey (&refMap, &typeMap,
118
+ new P4::ClearTypeMap (& typeMap),
119
+ new P4::SimplifyKey (&refMap, &typeMap, isv1,
144
120
new P4::NonLeftValue (&refMap, &typeMap)),
145
- // Final simplifications
146
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
147
- new P4::SimplifyControlFlow (&refMap, &typeMap),
148
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
149
- new P4::ConstantFolding (&refMap, &typeMap),
121
+ new P4::ConstantFolding (&refMap, &typeMap, isv1),
150
122
new P4::StrengthReduction (),
151
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
152
- new P4::LocalCopyPropagation (&typeMap),
123
+ new P4::LocalCopyPropagation (&refMap, &typeMap, isv1),
153
124
new P4::MoveDeclarations (),
154
- // Create actions for statements that can't be done in control blocks.
155
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
156
- new P4::SynthesizeActions (&refMap, &typeMap),
157
- // Move all stand-alone actions to custom tables
158
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
159
- new P4::MoveActionsToTables (&refMap, &typeMap),
125
+ new P4::SimplifyControlFlow (&refMap, &typeMap, isv1),
126
+ new P4::SynthesizeActions (&refMap, &typeMap, isv1),
127
+ new P4::MoveActionsToTables (&refMap, &typeMap, isv1),
160
128
});
161
129
}
162
130
@@ -172,17 +140,14 @@ MidEnd::MidEnd(CompilerOptions& options) {
172
140
setup_for_P4_16 (options);
173
141
174
142
// BMv2-specific passes
175
- auto evaluator = new P4::Evaluator (&refMap, &typeMap);
143
+ auto evaluator = new P4::EvaluatorPass (&refMap, &typeMap, isv1 );
176
144
addPasses ({
177
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
178
- new P4::SimplifyControlFlow (&refMap, &typeMap),
179
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
145
+ new P4::SimplifyControlFlow (&refMap, &typeMap, isv1),
146
+ new P4::TypeChecking (&refMap, &typeMap, isv1),
180
147
new P4::RemoveLeftSlices (&typeMap),
181
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
148
+ new P4::TypeChecking (&refMap, &typeMap, isv1),
182
149
new LowerExpressions (&typeMap),
183
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
184
- new P4::ConstantFolding (&refMap, &typeMap),
185
- new P4::TypeChecking (&refMap, &typeMap, false , isv1),
150
+ new P4::ConstantFolding (&refMap, &typeMap, isv1),
186
151
evaluator,
187
152
new VisitFunctor ([this , evaluator]() { toplevel = evaluator->getToplevelBlock (); })
188
153
});
0 commit comments