Skip to content

Commit b99f85e

Browse files
dflupuwechman
authored andcommitted
Only apply rules for yul optimizer
1 parent d1e382f commit b99f85e

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

libevmasm/RuleList.h

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleListPart4_5(
275275

276276
template <class Pattern>
277277
std::vector<SimplificationRule<Pattern>> simplificationRuleListPart5(
278+
bool _forYulOptimizer,
278279
Pattern A,
279280
Pattern B,
280281
Pattern,
@@ -287,23 +288,27 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleListPart5(
287288

288289
std::vector<SimplificationRule<Pattern>> rules;
289290

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+
});
298302

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+
}
307312

308313
// Replace MOD X, <power-of-two> with AND X, <power-of-two> - 1
309314
for (size_t i = 0; i < Pattern::WordSize; ++i)
@@ -816,7 +821,7 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleList(
816821
rules += simplificationRuleListPart3(A, B, C, W, X);
817822
rules += simplificationRuleListPart4(A, B, C, W, X);
818823
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);
820825
rules += simplificationRuleListPart6(A, B, C, W, X);
821826
rules += simplificationRuleListPart7(A, B, C, W, X);
822827
rules += simplificationRuleListPart8(A, B, C, W, X);

0 commit comments

Comments
 (0)