From 110a7bf01096dc87591bf62357d5ccf01d0e64e5 Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 5 Aug 2021 11:32:28 +0200 Subject: [PATCH] Optimizer rules for signextend. --- libevmasm/RuleList.h | 53 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/libevmasm/RuleList.h b/libevmasm/RuleList.h index 4674428ba..ee3265be9 100644 --- a/libevmasm/RuleList.h +++ b/libevmasm/RuleList.h @@ -248,8 +248,8 @@ std::vector> simplificationRuleListPart4( template std::vector> simplificationRuleListPart4_5( - Pattern, - Pattern, + Pattern A, + Pattern B, Pattern, Pattern X, Pattern Y @@ -266,13 +266,17 @@ std::vector> simplificationRuleListPart4_5( {Builtins::OR(Y, Builtins::OR(X, Y)), [=]{ return Builtins::OR(X, Y); }}, {Builtins::OR(Builtins::OR(Y, X), Y), [=]{ return Builtins::OR(Y, X); }}, {Builtins::OR(Y, Builtins::OR(Y, X)), [=]{ return Builtins::OR(Y, X); }}, + {Builtins::SIGNEXTEND(X, Builtins::SIGNEXTEND(X, Y)), [=]() { return Builtins::SIGNEXTEND(X, Y); }}, + {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { + return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); + }}, }; } template std::vector> simplificationRuleListPart5( Pattern A, - Pattern, + Pattern B, Pattern, Pattern X, Pattern @@ -314,6 +318,31 @@ std::vector> simplificationRuleListPart5( [=]() { return A.d() >= Pattern::WordSize / 8; } }); + // Replace SIGNEXTEND(A, X), A >= 31 with ID + rules.push_back({ + Builtins::SIGNEXTEND(A, X), + [=]() -> Pattern { return X; }, + [=]() { return A.d() >= Pattern::WordSize / 8 - 1; } + }); + rules.push_back({ + Builtins::AND(A, Builtins::SIGNEXTEND(B, X)), + [=]() -> Pattern { return Builtins::AND(A, X); }, + [=]() { + return + B.d() < Pattern::WordSize / 8 - 1 && + (A.d() & ((u256(1) << static_cast((B.d() + 1) * 8)) - 1)) == A.d(); + } + }); + rules.push_back({ + Builtins::AND(Builtins::SIGNEXTEND(B, X), A), + [=]() -> Pattern { return Builtins::AND(A, X); }, + [=]() { + return + B.d() < Pattern::WordSize / 8 - 1 && + (A.d() & ((u256(1) << static_cast((B.d() + 1) * 8)) - 1)) == A.d(); + } + }); + for (auto instr: { Instruction::ADDRESS, Instruction::CALLER, @@ -597,6 +626,24 @@ std::vector> simplificationRuleListPart7( } }); + rules.push_back({ + Builtins::SHL(A, Builtins::SIGNEXTEND(B, X)), + [=]() -> Pattern { return Builtins::SIGNEXTEND(A.d() / 8 + B.d(), Builtins::SHL(A, X)); }, + [=] { return A.d() % 8 == 0 && A.d() / 8 + B.d() >= B.d(); } + }); + + rules.push_back({ + Builtins::SIGNEXTEND(A, Builtins::SHR(B, X)), + [=]() -> Pattern { return Builtins::SAR(B, X); }, + [=] { + return + B.d() % 8 == 0 && + B.d() <= Pattern::WordSize && + A.d() <= Pattern::WordSize && + (Pattern::WordSize - B.d()) / 8 == A.d() + 1; + } + }); + return rules; }