@@ -275,6 +275,7 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleListPart4_5(
275
275
276
276
template <class Pattern >
277
277
std::vector<SimplificationRule<Pattern>> simplificationRuleListPart5 (
278
+ bool _forYulOptimizer,
278
279
Pattern A,
279
280
Pattern B,
280
281
Pattern,
@@ -287,23 +288,27 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleListPart5(
287
288
288
289
std::vector<SimplificationRule<Pattern>> rules;
289
290
290
- // Replace MOD(MUL(X, Y), A) with MULMOD(X, Y, A) iff A=2**N
291
- rules.push_back ({
292
- Builtins::MOD (Builtins::MUL (X, Y), A),
293
- [=]() -> Pattern { return Builtins::MULMOD (X, Y, A); },
294
- [=] {
295
- return A.d () > 0 && ((A.d () & (A.d () - 1 )) == 0 );
296
- }
297
- });
291
+ // The libevmasm optimizer does not support rules resulting in opcodes with more than two arguments.
292
+ if (_forYulOptimizer)
293
+ {
294
+ // Replace MOD(MUL(X, Y), A) with MULMOD(X, Y, A) iff A=2**N
295
+ rules.push_back ({
296
+ Builtins::MOD (Builtins::MUL (X, Y), A),
297
+ [=]() -> Pattern { return Builtins::MULMOD (X, Y, A); },
298
+ [=] {
299
+ return A.d () > 0 && ((A.d () & (A.d () - 1 )) == 0 );
300
+ }
301
+ });
298
302
299
- // Replace MOD(ADD(X, Y), A) with ADDMOD(X, Y, A) iff A=2**N
300
- rules.push_back ({
301
- Builtins::MOD (Builtins::ADD (X, Y), A),
302
- [=]() -> Pattern { return Builtins::ADDMOD (X, Y, A); },
303
- [=] {
304
- return A.d () > 0 && ((A.d () & (A.d () - 1 )) == 0 );
305
- }
306
- });
303
+ // Replace MOD(ADD(X, Y), A) with ADDMOD(X, Y, A) iff A=2**N
304
+ rules.push_back ({
305
+ Builtins::MOD (Builtins::ADD (X, Y), A),
306
+ [=]() -> Pattern { return Builtins::ADDMOD (X, Y, A); },
307
+ [=] {
308
+ return A.d () > 0 && ((A.d () & (A.d () - 1 )) == 0 );
309
+ }
310
+ });
311
+ }
307
312
308
313
// Replace MOD X, <power-of-two> with AND X, <power-of-two> - 1
309
314
for (size_t i = 0 ; i < Pattern::WordSize; ++i)
@@ -816,7 +821,7 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleList(
816
821
rules += simplificationRuleListPart3 (A, B, C, W, X);
817
822
rules += simplificationRuleListPart4 (A, B, C, W, X);
818
823
rules += simplificationRuleListPart4_5 (A, B, C, W, X);
819
- rules += simplificationRuleListPart5 (A, B, C, W, X);
824
+ rules += simplificationRuleListPart5 (_evmVersion. has_value (), A, B, C, W, X);
820
825
rules += simplificationRuleListPart6 (A, B, C, W, X);
821
826
rules += simplificationRuleListPart7 (A, B, C, W, X);
822
827
rules += simplificationRuleListPart8 (A, B, C, W, X);
0 commit comments