@@ -163,9 +163,47 @@ RemoveComplexExpressions::createTemporary(const IR::Expression* expression) {
163
163
auto decl = new IR::Declaration_Variable (IR::ID (name), type->getP4Type ());
164
164
newDecls.push_back (decl);
165
165
typeMap->setType (decl, type);
166
- auto assign = new IR::AssignmentStatement (new IR::PathExpression (name), expression);
166
+ auto assign = new IR::AssignmentStatement (
167
+ expression->srcInfo , new IR::PathExpression (name), expression);
167
168
assignments.push_back (assign);
168
- return new IR::PathExpression (name);
169
+ return new IR::PathExpression (expression->srcInfo , new IR::Path (name));
170
+ }
171
+
172
+ const IR::Vector<IR::Argument>*
173
+ RemoveComplexExpressions::simplifyExpressions (const IR::Vector<IR::Argument>* args) {
174
+ bool changes = true ;
175
+ auto result = new IR::Vector<IR::Argument>();
176
+ for (auto arg : *args) {
177
+ auto r = simplifyExpression (arg->expression , false );
178
+ if (r != arg->expression ) {
179
+ changes = true ;
180
+ result->push_back (new IR::Argument (arg->srcInfo , arg->name , r));
181
+ } else {
182
+ result->push_back (arg);
183
+ }
184
+ }
185
+ if (changes)
186
+ return result;
187
+ return args;
188
+ }
189
+
190
+ const IR::Expression*
191
+ RemoveComplexExpressions::simplifyExpression (const IR::Expression* expression, bool force) {
192
+ if (expression->is <IR::ListExpression>()) {
193
+ auto list = expression->to <IR::ListExpression>();
194
+ auto simpl = simplifyExpressions (&list->components );
195
+ if (simpl != &list->components )
196
+ return new IR::ListExpression (expression->srcInfo , *simpl);
197
+ return expression;
198
+ } else {
199
+ ComplexExpression ce;
200
+ (void )expression->apply (ce);
201
+ if (force || ce.isComplex ) {
202
+ LOG3 (" Moved into temporary " << dbp (expression));
203
+ return createTemporary (expression);
204
+ }
205
+ return expression;
206
+ }
169
207
}
170
208
171
209
const IR::Vector<IR::Expression>*
@@ -178,28 +216,10 @@ RemoveComplexExpressions::simplifyExpressions(const IR::Vector<IR::Expression>*
178
216
bool changes = true ;
179
217
auto result = new IR::Vector<IR::Expression>();
180
218
for (auto e : *vec) {
181
- if (e->is <IR::ListExpression>()) {
182
- auto list = e->to <IR::ListExpression>();
183
- auto simpl = simplifyExpressions (&list->components );
184
- if (simpl != &list->components ) {
185
- changes = true ;
186
- auto l = new IR::ListExpression (e->srcInfo , *simpl);
187
- result->push_back (l);
188
- } else {
189
- result->push_back (e);
190
- }
191
- } else {
192
- ComplexExpression ce;
193
- (void )e->apply (ce);
194
- if (force || ce.isComplex ) {
195
- changes = true ;
196
- LOG3 (" Moved into temporary " << dbp (e));
197
- auto tmp = createTemporary (e);
198
- result->push_back (tmp);
199
- } else {
200
- result->push_back (e);
201
- }
202
- }
219
+ auto r = simplifyExpression (e, force);
220
+ if (r != e)
221
+ changes = true ;
222
+ result->push_back (r);
203
223
}
204
224
if (changes)
205
225
return result;
@@ -247,17 +267,19 @@ RemoveComplexExpressions::postorder(IR::MethodCallExpression* expression) {
247
267
::error (" %1% expected 2 arguments" , expression);
248
268
return expression;
249
269
}
250
- auto vec = new IR::Vector<IR::Expression >();
270
+ auto vec = new IR::Vector<IR::Argument >();
251
271
// Digest has two arguments, we have to save the second one.
252
272
// It should be a list expression.
253
273
vec->push_back (expression->arguments ->at (0 ));
254
- auto arg1 = expression->arguments ->at (1 );
274
+ auto arg1 = expression->arguments ->at (1 )-> expression ;
255
275
if (arg1->is <IR::ListExpression>()) {
256
276
auto list = simplifyExpressions (&arg1->to <IR::ListExpression>()->components , true );
257
277
arg1 = new IR::ListExpression (arg1->srcInfo , *list);
258
- vec->push_back (arg1);
278
+ vec->push_back (new IR::Argument ( arg1) );
259
279
} else {
260
- auto tmp = createTemporary (expression->arguments ->at (1 ));
280
+ auto tmp = new IR::Argument (
281
+ expression->arguments ->at (1 )->srcInfo ,
282
+ createTemporary (expression->arguments ->at (1 )->expression ));
261
283
vec->push_back (tmp);
262
284
}
263
285
expression->arguments = vec;
0 commit comments