/src/solidity/libevmasm/RuleList.h
Line | Count | Source |
1 | | /* |
2 | | This file is part of solidity. |
3 | | |
4 | | solidity is free software: you can redistribute it and/or modify |
5 | | it under the terms of the GNU General Public License as published by |
6 | | the Free Software Foundation, either version 3 of the License, or |
7 | | (at your option) any later version. |
8 | | |
9 | | solidity is distributed in the hope that it will be useful, |
10 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | | GNU General Public License for more details. |
13 | | |
14 | | You should have received a copy of the GNU General Public License |
15 | | along with solidity. If not, see <http://www.gnu.org/licenses/>. |
16 | | */ |
17 | | // SPDX-License-Identifier: GPL-3.0 |
18 | | /** |
19 | | * @date 2018 |
20 | | * Templatized list of simplification rules. |
21 | | */ |
22 | | |
23 | | #pragma once |
24 | | |
25 | | |
26 | | #include <libevmasm/Instruction.h> |
27 | | #include <libevmasm/SimplificationRule.h> |
28 | | |
29 | | #include <libsolutil/CommonData.h> |
30 | | |
31 | | #include <boost/multiprecision/detail/min_max.hpp> |
32 | | |
33 | | #include <libyul/Dialect.h> |
34 | | #include <libyul/backends/evm/EVMDialect.h> |
35 | | #include <liblangutil/EVMVersion.h> |
36 | | |
37 | | #include <vector> |
38 | | #include <functional> |
39 | | |
40 | | namespace solidity::evmasm |
41 | | { |
42 | | |
43 | | template <class S> S divWorkaround(S const& _a, S const& _b) |
44 | 124k | { |
45 | 124k | return (S)(bigint(_a) / bigint(_b)); |
46 | 124k | } boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)0, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> solidity::evmasm::divWorkaround<boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)0, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> >(boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)0, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> const&, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)0, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> const&) Line | Count | Source | 44 | 76.0k | { | 45 | 76.0k | return (S)(bigint(_a) / bigint(_b)); | 46 | 76.0k | } |
boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)1, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> solidity::evmasm::divWorkaround<boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)1, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> >(boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)1, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> const&, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)1, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> const&) Line | Count | Source | 44 | 48.4k | { | 45 | 48.4k | return (S)(bigint(_a) / bigint(_b)); | 46 | 48.4k | } |
|
47 | | |
48 | | template <class S> S modWorkaround(S const& _a, S const& _b) |
49 | 316k | { |
50 | 316k | return (S)(bigint(_a) % bigint(_b)); |
51 | 316k | } boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)0, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> solidity::evmasm::modWorkaround<boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)0, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> >(boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)0, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> const&, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)0, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> const&) Line | Count | Source | 49 | 278k | { | 50 | 278k | return (S)(bigint(_a) % bigint(_b)); | 51 | 278k | } |
boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)1, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> solidity::evmasm::modWorkaround<boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)1, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> >(boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)1, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> const&, boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256ul, 256ul, (boost::multiprecision::cpp_integer_type)1, (boost::multiprecision::cpp_int_check_type)0, void>, (boost::multiprecision::expression_template_option)0> const&) Line | Count | Source | 49 | 37.9k | { | 50 | 37.9k | return (S)(bigint(_a) % bigint(_b)); | 51 | 37.9k | } |
|
52 | | |
53 | | // This works around a bug fixed with Boost 1.64. |
54 | | // https://www.boost.org/doc/libs/release/libs/multiprecision/doc/html/boost_multiprecision/map/hist.html#boost_multiprecision.map.hist.multiprecision_2_3_1_boost_1_64 |
55 | | template <class S> S shlWorkaround(S const& _x, unsigned _amount) |
56 | 158k | { |
57 | 158k | return u256((bigint(_x) << _amount) & u256(-1)); |
58 | 158k | } |
59 | | |
60 | | /// @returns k if _x == 2**k, nullopt otherwise |
61 | | inline std::optional<size_t> binaryLogarithm(u256 const& _x) |
62 | 192k | { |
63 | 192k | if (_x == 0) |
64 | 0 | return std::nullopt; |
65 | 192k | size_t msb = boost::multiprecision::msb(_x); |
66 | 192k | return (u256(1) << msb) == _x ? std::make_optional(msb) : std::nullopt; |
67 | 192k | } |
68 | | |
69 | | // simplificationRuleList below was split up into parts to prevent |
70 | | // stack overflows in the JavaScript optimizer for emscripten builds |
71 | | // that affected certain browser versions. |
72 | | template <class Pattern> |
73 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart1( |
74 | | Pattern A, |
75 | | Pattern B, |
76 | | Pattern C, |
77 | | Pattern, |
78 | | Pattern |
79 | | ) |
80 | 78 | { |
81 | 78 | using Word = typename Pattern::Word; |
82 | 78 | using Builtins = typename Pattern::Builtins; |
83 | 78 | return std::vector<SimplificationRule<Pattern>>{ |
84 | | // arithmetic on constants |
85 | 103k | {Builtins::ADD(A, B), [=]{ return A.d() + B.d(); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 85 | 33.8k | {Builtins::ADD(A, B), [=]{ return A.d() + B.d(); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 85 | 69.8k | {Builtins::ADD(A, B), [=]{ return A.d() + B.d(); }}, |
|
86 | 68.7k | {Builtins::MUL(A, B), [=]{ return A.d() * B.d(); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 86 | 62.8k | {Builtins::MUL(A, B), [=]{ return A.d() * B.d(); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 86 | 5.98k | {Builtins::MUL(A, B), [=]{ return A.d() * B.d(); }}, |
|
87 | 1.47M | {Builtins::SUB(A, B), [=]{ return A.d() - B.d(); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 87 | 5.86k | {Builtins::SUB(A, B), [=]{ return A.d() - B.d(); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 87 | 1.47M | {Builtins::SUB(A, B), [=]{ return A.d() - B.d(); }}, |
|
88 | 85.8k | {Builtins::DIV(A, B), [=]{ return B.d() == 0 ? 0 : divWorkaround(A.d(), B.d()); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 88 | 73.2k | {Builtins::DIV(A, B), [=]{ return B.d() == 0 ? 0 : divWorkaround(A.d(), B.d()); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 88 | 12.6k | {Builtins::DIV(A, B), [=]{ return B.d() == 0 ? 0 : divWorkaround(A.d(), B.d()); }}, |
|
89 | 55.4k | {Builtins::SDIV(A, B), [=]{ return B.d() == 0 ? 0 : s2u(divWorkaround(u2s(A.d()), u2s(B.d()))); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 89 | 49.6k | {Builtins::SDIV(A, B), [=]{ return B.d() == 0 ? 0 : s2u(divWorkaround(u2s(A.d()), u2s(B.d()))); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 89 | 5.80k | {Builtins::SDIV(A, B), [=]{ return B.d() == 0 ? 0 : s2u(divWorkaround(u2s(A.d()), u2s(B.d()))); }}, |
|
90 | 279k | {Builtins::MOD(A, B), [=]{ return B.d() == 0 ? 0 : modWorkaround(A.d(), B.d()); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 90 | 223k | {Builtins::MOD(A, B), [=]{ return B.d() == 0 ? 0 : modWorkaround(A.d(), B.d()); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 90 | 55.3k | {Builtins::MOD(A, B), [=]{ return B.d() == 0 ? 0 : modWorkaround(A.d(), B.d()); }}, |
|
91 | 41.2k | {Builtins::SMOD(A, B), [=]{ return B.d() == 0 ? 0 : s2u(modWorkaround(u2s(A.d()), u2s(B.d()))); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 91 | 32.5k | {Builtins::SMOD(A, B), [=]{ return B.d() == 0 ? 0 : s2u(modWorkaround(u2s(A.d()), u2s(B.d()))); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 91 | 8.78k | {Builtins::SMOD(A, B), [=]{ return B.d() == 0 ? 0 : s2u(modWorkaround(u2s(A.d()), u2s(B.d()))); }}, |
|
92 | 31.8k | {Builtins::EXP(A, B), [=]{ return Word(boost::multiprecision::powm(bigint(A.d()), bigint(B.d()), bigint(1) << Pattern::WordSize)); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 92 | 28.5k | {Builtins::EXP(A, B), [=]{ return Word(boost::multiprecision::powm(bigint(A.d()), bigint(B.d()), bigint(1) << Pattern::WordSize)); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 92 | 3.33k | {Builtins::EXP(A, B), [=]{ return Word(boost::multiprecision::powm(bigint(A.d()), bigint(B.d()), bigint(1) << Pattern::WordSize)); }}, |
|
93 | 134k | {Builtins::NOT(A), [=]{ return ~A.d(); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 93 | 93.2k | {Builtins::NOT(A), [=]{ return ~A.d(); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 93 | 40.9k | {Builtins::NOT(A), [=]{ return ~A.d(); }}, |
|
94 | 15.8k | {Builtins::LT(A, B), [=]() -> Word { return A.d() < B.d() ? 1 : 0; }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 94 | 12.6k | {Builtins::LT(A, B), [=]() -> Word { return A.d() < B.d() ? 1 : 0; }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 94 | 3.19k | {Builtins::LT(A, B), [=]() -> Word { return A.d() < B.d() ? 1 : 0; }}, |
|
95 | 17.5k | {Builtins::GT(A, B), [=]() -> Word { return A.d() > B.d() ? 1 : 0; }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 95 | 16.3k | {Builtins::GT(A, B), [=]() -> Word { return A.d() > B.d() ? 1 : 0; }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 95 | 1.27k | {Builtins::GT(A, B), [=]() -> Word { return A.d() > B.d() ? 1 : 0; }}, |
|
96 | 6.33k | {Builtins::SLT(A, B), [=]() -> Word { return u2s(A.d()) < u2s(B.d()) ? 1 : 0; }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#12}::operator()() constLine | Count | Source | 96 | 5.37k | {Builtins::SLT(A, B), [=]() -> Word { return u2s(A.d()) < u2s(B.d()) ? 1 : 0; }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#12}::operator()() constLine | Count | Source | 96 | 952 | {Builtins::SLT(A, B), [=]() -> Word { return u2s(A.d()) < u2s(B.d()) ? 1 : 0; }}, |
|
97 | 6.72k | {Builtins::SGT(A, B), [=]() -> Word { return u2s(A.d()) > u2s(B.d()) ? 1 : 0; }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#13}::operator()() constLine | Count | Source | 97 | 5.95k | {Builtins::SGT(A, B), [=]() -> Word { return u2s(A.d()) > u2s(B.d()) ? 1 : 0; }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#13}::operator()() constLine | Count | Source | 97 | 761 | {Builtins::SGT(A, B), [=]() -> Word { return u2s(A.d()) > u2s(B.d()) ? 1 : 0; }}, |
|
98 | 23.1k | {Builtins::EQ(A, B), [=]() -> Word { return A.d() == B.d() ? 1 : 0; }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 98 | 17.5k | {Builtins::EQ(A, B), [=]() -> Word { return A.d() == B.d() ? 1 : 0; }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 98 | 5.62k | {Builtins::EQ(A, B), [=]() -> Word { return A.d() == B.d() ? 1 : 0; }}, |
|
99 | 1.01M | {Builtins::ISZERO(A), [=]() -> Word { return A.d() == 0 ? 1 : 0; }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#15}::operator()() constLine | Count | Source | 99 | 49.0k | {Builtins::ISZERO(A), [=]() -> Word { return A.d() == 0 ? 1 : 0; }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#15}::operator()() constLine | Count | Source | 99 | 966k | {Builtins::ISZERO(A), [=]() -> Word { return A.d() == 0 ? 1 : 0; }}, |
|
100 | 52.1k | {Builtins::AND(A, B), [=]{ return A.d() & B.d(); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 100 | 48.7k | {Builtins::AND(A, B), [=]{ return A.d() & B.d(); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 100 | 3.36k | {Builtins::AND(A, B), [=]{ return A.d() & B.d(); }}, |
|
101 | 32.2k | {Builtins::OR(A, B), [=]{ return A.d() | B.d(); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#17}::operator()() constLine | Count | Source | 101 | 30.0k | {Builtins::OR(A, B), [=]{ return A.d() | B.d(); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#17}::operator()() constLine | Count | Source | 101 | 2.22k | {Builtins::OR(A, B), [=]{ return A.d() | B.d(); }}, |
|
102 | 15.8k | {Builtins::XOR(A, B), [=]{ return A.d() ^ B.d(); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#18}::operator()() constLine | Count | Source | 102 | 13.4k | {Builtins::XOR(A, B), [=]{ return A.d() ^ B.d(); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#18}::operator()() constLine | Count | Source | 102 | 2.46k | {Builtins::XOR(A, B), [=]{ return A.d() ^ B.d(); }}, |
|
103 | 4.57k | {Builtins::BYTE(A, B), [=]{ |
104 | 4.57k | return |
105 | 4.57k | A.d() >= Pattern::WordSize / 8 ? |
106 | 2.94k | 0 : |
107 | 4.57k | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; |
108 | 4.57k | }}, solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#19}::operator()() constLine | Count | Source | 103 | 4.04k | {Builtins::BYTE(A, B), [=]{ | 104 | 4.04k | return | 105 | 4.04k | A.d() >= Pattern::WordSize / 8 ? | 106 | 2.57k | 0 : | 107 | 4.04k | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; | 108 | 4.04k | }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#19}::operator()() constLine | Count | Source | 103 | 533 | {Builtins::BYTE(A, B), [=]{ | 104 | 533 | return | 105 | 533 | A.d() >= Pattern::WordSize / 8 ? | 106 | 377 | 0 : | 107 | 533 | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; | 108 | 533 | }}, |
|
109 | 65.6k | {Builtins::ADDMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) + bigint(B.d())) % C.d()); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#20}::operator()() constLine | Count | Source | 109 | 59.9k | {Builtins::ADDMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) + bigint(B.d())) % C.d()); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#20}::operator()() constLine | Count | Source | 109 | 5.65k | {Builtins::ADDMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) + bigint(B.d())) % C.d()); }}, |
|
110 | 48.6k | {Builtins::MULMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) * bigint(B.d())) % C.d()); }},solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#21}::operator()() constLine | Count | Source | 110 | 44.4k | {Builtins::MULMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) * bigint(B.d())) % C.d()); }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#21}::operator()() constLine | Count | Source | 110 | 4.26k | {Builtins::MULMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) * bigint(B.d())) % C.d()); }}, |
|
111 | 12.2k | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { |
112 | 12.2k | if (A.d() >= Pattern::WordSize / 8 - 1) |
113 | 6.27k | return B.d(); |
114 | 5.98k | unsigned testBit = unsigned(A.d()) * 8 + 7; |
115 | 5.98k | Word mask = (Word(1) << testBit) - 1; |
116 | 5.98k | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; |
117 | 12.2k | }}, solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#22}::operator()() constLine | Count | Source | 111 | 11.0k | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { | 112 | 11.0k | if (A.d() >= Pattern::WordSize / 8 - 1) | 113 | 5.65k | return B.d(); | 114 | 5.40k | unsigned testBit = unsigned(A.d()) * 8 + 7; | 115 | 5.40k | Word mask = (Word(1) << testBit) - 1; | 116 | 5.40k | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; | 117 | 11.0k | }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#22}::operator()() constLine | Count | Source | 111 | 1.18k | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { | 112 | 1.18k | if (A.d() >= Pattern::WordSize / 8 - 1) | 113 | 616 | return B.d(); | 114 | 572 | unsigned testBit = unsigned(A.d()) * 8 + 7; | 115 | 572 | Word mask = (Word(1) << testBit) - 1; | 116 | 572 | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; | 117 | 1.18k | }}, |
|
118 | 126k | {Builtins::SHL(A, B), [=]{ |
119 | 126k | if (A.d() >= Pattern::WordSize) |
120 | 7.80k | return Word(0); |
121 | 118k | return shlWorkaround(B.d(), unsigned(A.d())); |
122 | 126k | }}, solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#23}::operator()() constLine | Count | Source | 118 | 50.0k | {Builtins::SHL(A, B), [=]{ | 119 | 50.0k | if (A.d() >= Pattern::WordSize) | 120 | 6.95k | return Word(0); | 121 | 43.0k | return shlWorkaround(B.d(), unsigned(A.d())); | 122 | 50.0k | }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#23}::operator()() constLine | Count | Source | 118 | 76.0k | {Builtins::SHL(A, B), [=]{ | 119 | 76.0k | if (A.d() >= Pattern::WordSize) | 120 | 849 | return Word(0); | 121 | 75.2k | return shlWorkaround(B.d(), unsigned(A.d())); | 122 | 76.0k | }}, |
|
123 | 12.2k | {Builtins::SHR(A, B), [=]{ |
124 | 12.2k | if (A.d() >= Pattern::WordSize) |
125 | 4.09k | return Word(0); |
126 | 8.13k | return B.d() >> unsigned(A.d()); |
127 | 12.2k | }} solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#24}::operator()() constLine | Count | Source | 123 | 11.4k | {Builtins::SHR(A, B), [=]{ | 124 | 11.4k | if (A.d() >= Pattern::WordSize) | 125 | 3.70k | return Word(0); | 126 | 7.70k | return B.d() >> unsigned(A.d()); | 127 | 11.4k | }} |
solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#24}::operator()() constLine | Count | Source | 123 | 829 | {Builtins::SHR(A, B), [=]{ | 124 | 829 | if (A.d() >= Pattern::WordSize) | 125 | 390 | return Word(0); | 126 | 439 | return B.d() >> unsigned(A.d()); | 127 | 829 | }} |
|
128 | 78 | }; |
129 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 80 | 75 | { | 81 | 75 | using Word = typename Pattern::Word; | 82 | 75 | using Builtins = typename Pattern::Builtins; | 83 | 75 | return std::vector<SimplificationRule<Pattern>>{ | 84 | | // arithmetic on constants | 85 | 75 | {Builtins::ADD(A, B), [=]{ return A.d() + B.d(); }}, | 86 | 75 | {Builtins::MUL(A, B), [=]{ return A.d() * B.d(); }}, | 87 | 75 | {Builtins::SUB(A, B), [=]{ return A.d() - B.d(); }}, | 88 | 75 | {Builtins::DIV(A, B), [=]{ return B.d() == 0 ? 0 : divWorkaround(A.d(), B.d()); }}, | 89 | 75 | {Builtins::SDIV(A, B), [=]{ return B.d() == 0 ? 0 : s2u(divWorkaround(u2s(A.d()), u2s(B.d()))); }}, | 90 | 75 | {Builtins::MOD(A, B), [=]{ return B.d() == 0 ? 0 : modWorkaround(A.d(), B.d()); }}, | 91 | 75 | {Builtins::SMOD(A, B), [=]{ return B.d() == 0 ? 0 : s2u(modWorkaround(u2s(A.d()), u2s(B.d()))); }}, | 92 | 75 | {Builtins::EXP(A, B), [=]{ return Word(boost::multiprecision::powm(bigint(A.d()), bigint(B.d()), bigint(1) << Pattern::WordSize)); }}, | 93 | 75 | {Builtins::NOT(A), [=]{ return ~A.d(); }}, | 94 | 75 | {Builtins::LT(A, B), [=]() -> Word { return A.d() < B.d() ? 1 : 0; }}, | 95 | 75 | {Builtins::GT(A, B), [=]() -> Word { return A.d() > B.d() ? 1 : 0; }}, | 96 | 75 | {Builtins::SLT(A, B), [=]() -> Word { return u2s(A.d()) < u2s(B.d()) ? 1 : 0; }}, | 97 | 75 | {Builtins::SGT(A, B), [=]() -> Word { return u2s(A.d()) > u2s(B.d()) ? 1 : 0; }}, | 98 | 75 | {Builtins::EQ(A, B), [=]() -> Word { return A.d() == B.d() ? 1 : 0; }}, | 99 | 75 | {Builtins::ISZERO(A), [=]() -> Word { return A.d() == 0 ? 1 : 0; }}, | 100 | 75 | {Builtins::AND(A, B), [=]{ return A.d() & B.d(); }}, | 101 | 75 | {Builtins::OR(A, B), [=]{ return A.d() | B.d(); }}, | 102 | 75 | {Builtins::XOR(A, B), [=]{ return A.d() ^ B.d(); }}, | 103 | 75 | {Builtins::BYTE(A, B), [=]{ | 104 | 75 | return | 105 | 75 | A.d() >= Pattern::WordSize / 8 ? | 106 | 75 | 0 : | 107 | 75 | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; | 108 | 75 | }}, | 109 | 75 | {Builtins::ADDMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) + bigint(B.d())) % C.d()); }}, | 110 | 75 | {Builtins::MULMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) * bigint(B.d())) % C.d()); }}, | 111 | 75 | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { | 112 | 75 | if (A.d() >= Pattern::WordSize / 8 - 1) | 113 | 75 | return B.d(); | 114 | 75 | unsigned testBit = unsigned(A.d()) * 8 + 7; | 115 | 75 | Word mask = (Word(1) << testBit) - 1; | 116 | 75 | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; | 117 | 75 | }}, | 118 | 75 | {Builtins::SHL(A, B), [=]{ | 119 | 75 | if (A.d() >= Pattern::WordSize) | 120 | 75 | return Word(0); | 121 | 75 | return shlWorkaround(B.d(), unsigned(A.d())); | 122 | 75 | }}, | 123 | 75 | {Builtins::SHR(A, B), [=]{ | 124 | 75 | if (A.d() >= Pattern::WordSize) | 125 | 75 | return Word(0); | 126 | 75 | return B.d() >> unsigned(A.d()); | 127 | 75 | }} | 128 | 75 | }; | 129 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 80 | 3 | { | 81 | 3 | using Word = typename Pattern::Word; | 82 | 3 | using Builtins = typename Pattern::Builtins; | 83 | 3 | return std::vector<SimplificationRule<Pattern>>{ | 84 | | // arithmetic on constants | 85 | 3 | {Builtins::ADD(A, B), [=]{ return A.d() + B.d(); }}, | 86 | 3 | {Builtins::MUL(A, B), [=]{ return A.d() * B.d(); }}, | 87 | 3 | {Builtins::SUB(A, B), [=]{ return A.d() - B.d(); }}, | 88 | 3 | {Builtins::DIV(A, B), [=]{ return B.d() == 0 ? 0 : divWorkaround(A.d(), B.d()); }}, | 89 | 3 | {Builtins::SDIV(A, B), [=]{ return B.d() == 0 ? 0 : s2u(divWorkaround(u2s(A.d()), u2s(B.d()))); }}, | 90 | 3 | {Builtins::MOD(A, B), [=]{ return B.d() == 0 ? 0 : modWorkaround(A.d(), B.d()); }}, | 91 | 3 | {Builtins::SMOD(A, B), [=]{ return B.d() == 0 ? 0 : s2u(modWorkaround(u2s(A.d()), u2s(B.d()))); }}, | 92 | 3 | {Builtins::EXP(A, B), [=]{ return Word(boost::multiprecision::powm(bigint(A.d()), bigint(B.d()), bigint(1) << Pattern::WordSize)); }}, | 93 | 3 | {Builtins::NOT(A), [=]{ return ~A.d(); }}, | 94 | 3 | {Builtins::LT(A, B), [=]() -> Word { return A.d() < B.d() ? 1 : 0; }}, | 95 | 3 | {Builtins::GT(A, B), [=]() -> Word { return A.d() > B.d() ? 1 : 0; }}, | 96 | 3 | {Builtins::SLT(A, B), [=]() -> Word { return u2s(A.d()) < u2s(B.d()) ? 1 : 0; }}, | 97 | 3 | {Builtins::SGT(A, B), [=]() -> Word { return u2s(A.d()) > u2s(B.d()) ? 1 : 0; }}, | 98 | 3 | {Builtins::EQ(A, B), [=]() -> Word { return A.d() == B.d() ? 1 : 0; }}, | 99 | 3 | {Builtins::ISZERO(A), [=]() -> Word { return A.d() == 0 ? 1 : 0; }}, | 100 | 3 | {Builtins::AND(A, B), [=]{ return A.d() & B.d(); }}, | 101 | 3 | {Builtins::OR(A, B), [=]{ return A.d() | B.d(); }}, | 102 | 3 | {Builtins::XOR(A, B), [=]{ return A.d() ^ B.d(); }}, | 103 | 3 | {Builtins::BYTE(A, B), [=]{ | 104 | 3 | return | 105 | 3 | A.d() >= Pattern::WordSize / 8 ? | 106 | 3 | 0 : | 107 | 3 | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; | 108 | 3 | }}, | 109 | 3 | {Builtins::ADDMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) + bigint(B.d())) % C.d()); }}, | 110 | 3 | {Builtins::MULMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) * bigint(B.d())) % C.d()); }}, | 111 | 3 | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { | 112 | 3 | if (A.d() >= Pattern::WordSize / 8 - 1) | 113 | 3 | return B.d(); | 114 | 3 | unsigned testBit = unsigned(A.d()) * 8 + 7; | 115 | 3 | Word mask = (Word(1) << testBit) - 1; | 116 | 3 | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; | 117 | 3 | }}, | 118 | 3 | {Builtins::SHL(A, B), [=]{ | 119 | 3 | if (A.d() >= Pattern::WordSize) | 120 | 3 | return Word(0); | 121 | 3 | return shlWorkaround(B.d(), unsigned(A.d())); | 122 | 3 | }}, | 123 | 3 | {Builtins::SHR(A, B), [=]{ | 124 | 3 | if (A.d() >= Pattern::WordSize) | 125 | 3 | return Word(0); | 126 | 3 | return B.d() >> unsigned(A.d()); | 127 | 3 | }} | 128 | 3 | }; | 129 | 3 | } |
|
130 | | |
131 | | |
132 | | template <class Pattern> |
133 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart2( |
134 | | Pattern, |
135 | | Pattern, |
136 | | Pattern, |
137 | | Pattern X, |
138 | | Pattern Y |
139 | | ) |
140 | 78 | { |
141 | 78 | using Word = typename Pattern::Word; |
142 | 78 | using Builtins = typename Pattern::Builtins; |
143 | 78 | return std::vector<SimplificationRule<Pattern>> { |
144 | | // invariants involving known constants |
145 | 10.0k | {Builtins::ADD(X, 0), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 145 | 8.24k | {Builtins::ADD(X, 0), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 145 | 1.83k | {Builtins::ADD(X, 0), [=]{ return X; }}, |
|
146 | 4.28k | {Builtins::ADD(0, X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 146 | 1.59k | {Builtins::ADD(0, X), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 146 | 2.69k | {Builtins::ADD(0, X), [=]{ return X; }}, |
|
147 | 9.14k | {Builtins::SUB(X, 0), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 147 | 652 | {Builtins::SUB(X, 0), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 147 | 8.49k | {Builtins::SUB(X, 0), [=]{ return X; }}, |
|
148 | 412 | {Builtins::SUB(~Word(0), X), [=]() -> Pattern { return Builtins::NOT(X); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 148 | 265 | {Builtins::SUB(~Word(0), X), [=]() -> Pattern { return Builtins::NOT(X); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 148 | 147 | {Builtins::SUB(~Word(0), X), [=]() -> Pattern { return Builtins::NOT(X); }}, |
|
149 | 1.62k | {Builtins::MUL(X, 0), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 149 | 1.58k | {Builtins::MUL(X, 0), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 149 | 35 | {Builtins::MUL(X, 0), [=]{ return Word(0); }}, |
|
150 | 2.67k | {Builtins::MUL(0, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 150 | 2.54k | {Builtins::MUL(0, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 150 | 132 | {Builtins::MUL(0, X), [=]{ return Word(0); }}, |
|
151 | 1.27k | {Builtins::MUL(X, 1), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 151 | 1.24k | {Builtins::MUL(X, 1), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 151 | 38 | {Builtins::MUL(X, 1), [=]{ return X; }}, |
|
152 | 2.45k | {Builtins::MUL(1, X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 152 | 2.36k | {Builtins::MUL(1, X), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 152 | 92 | {Builtins::MUL(1, X), [=]{ return X; }}, |
|
153 | 233 | {Builtins::MUL(X, Word(-1)), [=]() -> Pattern { return Builtins::SUB(0, X); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 153 | 188 | {Builtins::MUL(X, Word(-1)), [=]() -> Pattern { return Builtins::SUB(0, X); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 153 | 45 | {Builtins::MUL(X, Word(-1)), [=]() -> Pattern { return Builtins::SUB(0, X); }}, |
|
154 | 1.12k | {Builtins::MUL(Word(-1), X), [=]() -> Pattern { return Builtins::SUB(0, X); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 154 | 1.10k | {Builtins::MUL(Word(-1), X), [=]() -> Pattern { return Builtins::SUB(0, X); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 154 | 20 | {Builtins::MUL(Word(-1), X), [=]() -> Pattern { return Builtins::SUB(0, X); }}, |
|
155 | 1.69k | {Builtins::DIV(X, 0), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 155 | 1.64k | {Builtins::DIV(X, 0), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 155 | 44 | {Builtins::DIV(X, 0), [=]{ return Word(0); }}, |
|
156 | 918 | {Builtins::DIV(0, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#12}::operator()() constLine | Count | Source | 156 | 841 | {Builtins::DIV(0, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#12}::operator()() constLine | Count | Source | 156 | 77 | {Builtins::DIV(0, X), [=]{ return Word(0); }}, |
|
157 | 1.36k | {Builtins::DIV(X, 1), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#13}::operator()() constLine | Count | Source | 157 | 1.34k | {Builtins::DIV(X, 1), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#13}::operator()() constLine | Count | Source | 157 | 27 | {Builtins::DIV(X, 1), [=]{ return X; }}, |
|
158 | 938 | {Builtins::SDIV(X, 0), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 158 | 695 | {Builtins::SDIV(X, 0), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 158 | 243 | {Builtins::SDIV(X, 0), [=]{ return Word(0); }}, |
|
159 | 3.03k | {Builtins::SDIV(0, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#15}::operator()() constLine | Count | Source | 159 | 2.80k | {Builtins::SDIV(0, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#15}::operator()() constLine | Count | Source | 159 | 223 | {Builtins::SDIV(0, X), [=]{ return Word(0); }}, |
|
160 | 896 | {Builtins::SDIV(X, 1), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 160 | 602 | {Builtins::SDIV(X, 1), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 160 | 294 | {Builtins::SDIV(X, 1), [=]{ return X; }}, |
|
161 | 146 | {Builtins::AND(X, ~Word(0)), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#17}::operator()() constLine | Count | Source | 161 | 105 | {Builtins::AND(X, ~Word(0)), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#17}::operator()() constLine | Count | Source | 161 | 41 | {Builtins::AND(X, ~Word(0)), [=]{ return X; }}, |
|
162 | 560 | {Builtins::AND(~Word(0), X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#18}::operator()() constLine | Count | Source | 162 | 542 | {Builtins::AND(~Word(0), X), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#18}::operator()() constLine | Count | Source | 162 | 18 | {Builtins::AND(~Word(0), X), [=]{ return X; }}, |
|
163 | 7.66k | {Builtins::AND(X, 0), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#19}::operator()() constLine | Count | Source | 163 | 7.58k | {Builtins::AND(X, 0), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#19}::operator()() constLine | Count | Source | 163 | 82 | {Builtins::AND(X, 0), [=]{ return Word(0); }}, |
|
164 | 1.66k | {Builtins::AND(0, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#20}::operator()() constLine | Count | Source | 164 | 1.38k | {Builtins::AND(0, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#20}::operator()() constLine | Count | Source | 164 | 274 | {Builtins::AND(0, X), [=]{ return Word(0); }}, |
|
165 | 5.36k | {Builtins::OR(X, 0), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#21}::operator()() constLine | Count | Source | 165 | 5.29k | {Builtins::OR(X, 0), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#21}::operator()() constLine | Count | Source | 165 | 66 | {Builtins::OR(X, 0), [=]{ return X; }}, |
|
166 | 2.47k | {Builtins::OR(0, X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#22}::operator()() constLine | Count | Source | 166 | 2.09k | {Builtins::OR(0, X), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#22}::operator()() constLine | Count | Source | 166 | 377 | {Builtins::OR(0, X), [=]{ return X; }}, |
|
167 | 772 | {Builtins::OR(X, ~Word(0)), [=]{ return ~Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#23}::operator()() constLine | Count | Source | 167 | 705 | {Builtins::OR(X, ~Word(0)), [=]{ return ~Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#23}::operator()() constLine | Count | Source | 167 | 67 | {Builtins::OR(X, ~Word(0)), [=]{ return ~Word(0); }}, |
|
168 | 516 | {Builtins::OR(~Word(0), X), [=]{ return ~Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#24}::operator()() constLine | Count | Source | 168 | 478 | {Builtins::OR(~Word(0), X), [=]{ return ~Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#24}::operator()() constLine | Count | Source | 168 | 38 | {Builtins::OR(~Word(0), X), [=]{ return ~Word(0); }}, |
|
169 | 686 | {Builtins::XOR(X, 0), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#25}::operator()() constLine | Count | Source | 169 | 662 | {Builtins::XOR(X, 0), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#25}::operator()() constLine | Count | Source | 169 | 24 | {Builtins::XOR(X, 0), [=]{ return X; }}, |
|
170 | 918 | {Builtins::XOR(0, X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#26}::operator()() constLine | Count | Source | 170 | 804 | {Builtins::XOR(0, X), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#26}::operator()() constLine | Count | Source | 170 | 114 | {Builtins::XOR(0, X), [=]{ return X; }}, |
|
171 | 1.10k | {Builtins::MOD(X, 0), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#27}::operator()() constLine | Count | Source | 171 | 1.05k | {Builtins::MOD(X, 0), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#27}::operator()() constLine | Count | Source | 171 | 46 | {Builtins::MOD(X, 0), [=]{ return Word(0); }}, |
|
172 | 719 | {Builtins::MOD(0, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#28}::operator()() constLine | Count | Source | 172 | 583 | {Builtins::MOD(0, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#28}::operator()() constLine | Count | Source | 172 | 136 | {Builtins::MOD(0, X), [=]{ return Word(0); }}, |
|
173 | 3.29k | {Builtins::EQ(X, 0), [=]() -> Pattern { return Builtins::ISZERO(X); },},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#29}::operator()() constLine | Count | Source | 173 | 838 | {Builtins::EQ(X, 0), [=]() -> Pattern { return Builtins::ISZERO(X); },}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#29}::operator()() constLine | Count | Source | 173 | 2.45k | {Builtins::EQ(X, 0), [=]() -> Pattern { return Builtins::ISZERO(X); },}, |
|
174 | 6.32k | {Builtins::EQ(0, X), [=]() -> Pattern { return Builtins::ISZERO(X); },},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#30}::operator()() constLine | Count | Source | 174 | 2.32k | {Builtins::EQ(0, X), [=]() -> Pattern { return Builtins::ISZERO(X); },}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#30}::operator()() constLine | Count | Source | 174 | 3.99k | {Builtins::EQ(0, X), [=]() -> Pattern { return Builtins::ISZERO(X); },}, |
|
175 | 2.16k | {Builtins::SHL(0, X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#31}::operator()() constLine | Count | Source | 175 | 2.12k | {Builtins::SHL(0, X), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#31}::operator()() constLine | Count | Source | 175 | 34 | {Builtins::SHL(0, X), [=]{ return X; }}, |
|
176 | 1.63k | {Builtins::SHR(0, X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#32}::operator()() constLine | Count | Source | 176 | 1.54k | {Builtins::SHR(0, X), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#32}::operator()() constLine | Count | Source | 176 | 85 | {Builtins::SHR(0, X), [=]{ return X; }}, |
|
177 | 1.07k | {Builtins::SHL(X, 0), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#33}::operator()() constLine | Count | Source | 177 | 1.02k | {Builtins::SHL(X, 0), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#33}::operator()() constLine | Count | Source | 177 | 50 | {Builtins::SHL(X, 0), [=]{ return Word(0); }}, |
|
178 | 331 | {Builtins::SHR(X, 0), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#34}::operator()() constLine | Count | Source | 178 | 324 | {Builtins::SHR(X, 0), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#34}::operator()() constLine | Count | Source | 178 | 7 | {Builtins::SHR(X, 0), [=]{ return Word(0); }}, |
|
179 | 1.37k | {Builtins::GT(X, 0), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#35}::operator()() constLine | Count | Source | 179 | 1.22k | {Builtins::GT(X, 0), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#35}::operator()() constLine | Count | Source | 179 | 152 | {Builtins::GT(X, 0), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, |
|
180 | 3.53k | {Builtins::LT(0, X), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#36}::operator()() constLine | Count | Source | 180 | 2.27k | {Builtins::LT(0, X), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#36}::operator()() constLine | Count | Source | 180 | 1.25k | {Builtins::LT(0, X), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, |
|
181 | 2.00k | {Builtins::GT(X, ~Word(0)), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#37}::operator()() constLine | Count | Source | 181 | 1.99k | {Builtins::GT(X, ~Word(0)), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#37}::operator()() constLine | Count | Source | 181 | 7 | {Builtins::GT(X, ~Word(0)), [=]{ return Word(0); }}, |
|
182 | 148 | {Builtins::LT(~Word(0), X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#38}::operator()() constLine | Count | Source | 182 | 135 | {Builtins::LT(~Word(0), X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#38}::operator()() constLine | Count | Source | 182 | 13 | {Builtins::LT(~Word(0), X), [=]{ return Word(0); }}, |
|
183 | 1.01k | {Builtins::GT(0, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#39}::operator()() constLine | Count | Source | 183 | 957 | {Builtins::GT(0, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#39}::operator()() constLine | Count | Source | 183 | 60 | {Builtins::GT(0, X), [=]{ return Word(0); }}, |
|
184 | 659 | {Builtins::LT(X, 0), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#40}::operator()() constLine | Count | Source | 184 | 651 | {Builtins::LT(X, 0), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#40}::operator()() constLine | Count | Source | 184 | 8 | {Builtins::LT(X, 0), [=]{ return Word(0); }}, |
|
185 | 78 | {Builtins::AND(Builtins::BYTE(X, Y), Word(0xff)), [=]() -> Pattern { return Builtins::BYTE(X, Y); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#41}::operator()() constLine | Count | Source | 185 | 41 | {Builtins::AND(Builtins::BYTE(X, Y), Word(0xff)), [=]() -> Pattern { return Builtins::BYTE(X, Y); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#41}::operator()() constLine | Count | Source | 185 | 9 | {Builtins::AND(Builtins::BYTE(X, Y), Word(0xff)), [=]() -> Pattern { return Builtins::BYTE(X, Y); }}, |
|
186 | 168 | {Builtins::BYTE(Word(Pattern::WordSize / 8 - 1), X), [=]() -> Pattern { return Builtins::AND(X, Word(0xff)); }},solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#42}::operator()() constLine | Count | Source | 186 | 162 | {Builtins::BYTE(Word(Pattern::WordSize / 8 - 1), X), [=]() -> Pattern { return Builtins::AND(X, Word(0xff)); }}, |
solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#42}::operator()() constLine | Count | Source | 186 | 6 | {Builtins::BYTE(Word(Pattern::WordSize / 8 - 1), X), [=]() -> Pattern { return Builtins::AND(X, Word(0xff)); }}, |
|
187 | 78 | }; |
188 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleListPart2<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 140 | 75 | { | 141 | 75 | using Word = typename Pattern::Word; | 142 | 75 | using Builtins = typename Pattern::Builtins; | 143 | 75 | return std::vector<SimplificationRule<Pattern>> { | 144 | | // invariants involving known constants | 145 | 75 | {Builtins::ADD(X, 0), [=]{ return X; }}, | 146 | 75 | {Builtins::ADD(0, X), [=]{ return X; }}, | 147 | 75 | {Builtins::SUB(X, 0), [=]{ return X; }}, | 148 | 75 | {Builtins::SUB(~Word(0), X), [=]() -> Pattern { return Builtins::NOT(X); }}, | 149 | 75 | {Builtins::MUL(X, 0), [=]{ return Word(0); }}, | 150 | 75 | {Builtins::MUL(0, X), [=]{ return Word(0); }}, | 151 | 75 | {Builtins::MUL(X, 1), [=]{ return X; }}, | 152 | 75 | {Builtins::MUL(1, X), [=]{ return X; }}, | 153 | 75 | {Builtins::MUL(X, Word(-1)), [=]() -> Pattern { return Builtins::SUB(0, X); }}, | 154 | 75 | {Builtins::MUL(Word(-1), X), [=]() -> Pattern { return Builtins::SUB(0, X); }}, | 155 | 75 | {Builtins::DIV(X, 0), [=]{ return Word(0); }}, | 156 | 75 | {Builtins::DIV(0, X), [=]{ return Word(0); }}, | 157 | 75 | {Builtins::DIV(X, 1), [=]{ return X; }}, | 158 | 75 | {Builtins::SDIV(X, 0), [=]{ return Word(0); }}, | 159 | 75 | {Builtins::SDIV(0, X), [=]{ return Word(0); }}, | 160 | 75 | {Builtins::SDIV(X, 1), [=]{ return X; }}, | 161 | 75 | {Builtins::AND(X, ~Word(0)), [=]{ return X; }}, | 162 | 75 | {Builtins::AND(~Word(0), X), [=]{ return X; }}, | 163 | 75 | {Builtins::AND(X, 0), [=]{ return Word(0); }}, | 164 | 75 | {Builtins::AND(0, X), [=]{ return Word(0); }}, | 165 | 75 | {Builtins::OR(X, 0), [=]{ return X; }}, | 166 | 75 | {Builtins::OR(0, X), [=]{ return X; }}, | 167 | 75 | {Builtins::OR(X, ~Word(0)), [=]{ return ~Word(0); }}, | 168 | 75 | {Builtins::OR(~Word(0), X), [=]{ return ~Word(0); }}, | 169 | 75 | {Builtins::XOR(X, 0), [=]{ return X; }}, | 170 | 75 | {Builtins::XOR(0, X), [=]{ return X; }}, | 171 | 75 | {Builtins::MOD(X, 0), [=]{ return Word(0); }}, | 172 | 75 | {Builtins::MOD(0, X), [=]{ return Word(0); }}, | 173 | 75 | {Builtins::EQ(X, 0), [=]() -> Pattern { return Builtins::ISZERO(X); },}, | 174 | 75 | {Builtins::EQ(0, X), [=]() -> Pattern { return Builtins::ISZERO(X); },}, | 175 | 75 | {Builtins::SHL(0, X), [=]{ return X; }}, | 176 | 75 | {Builtins::SHR(0, X), [=]{ return X; }}, | 177 | 75 | {Builtins::SHL(X, 0), [=]{ return Word(0); }}, | 178 | 75 | {Builtins::SHR(X, 0), [=]{ return Word(0); }}, | 179 | 75 | {Builtins::GT(X, 0), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, | 180 | 75 | {Builtins::LT(0, X), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, | 181 | 75 | {Builtins::GT(X, ~Word(0)), [=]{ return Word(0); }}, | 182 | 75 | {Builtins::LT(~Word(0), X), [=]{ return Word(0); }}, | 183 | 75 | {Builtins::GT(0, X), [=]{ return Word(0); }}, | 184 | 75 | {Builtins::LT(X, 0), [=]{ return Word(0); }}, | 185 | 75 | {Builtins::AND(Builtins::BYTE(X, Y), Word(0xff)), [=]() -> Pattern { return Builtins::BYTE(X, Y); }}, | 186 | 75 | {Builtins::BYTE(Word(Pattern::WordSize / 8 - 1), X), [=]() -> Pattern { return Builtins::AND(X, Word(0xff)); }}, | 187 | 75 | }; | 188 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleListPart2<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 140 | 3 | { | 141 | 3 | using Word = typename Pattern::Word; | 142 | 3 | using Builtins = typename Pattern::Builtins; | 143 | 3 | return std::vector<SimplificationRule<Pattern>> { | 144 | | // invariants involving known constants | 145 | 3 | {Builtins::ADD(X, 0), [=]{ return X; }}, | 146 | 3 | {Builtins::ADD(0, X), [=]{ return X; }}, | 147 | 3 | {Builtins::SUB(X, 0), [=]{ return X; }}, | 148 | 3 | {Builtins::SUB(~Word(0), X), [=]() -> Pattern { return Builtins::NOT(X); }}, | 149 | 3 | {Builtins::MUL(X, 0), [=]{ return Word(0); }}, | 150 | 3 | {Builtins::MUL(0, X), [=]{ return Word(0); }}, | 151 | 3 | {Builtins::MUL(X, 1), [=]{ return X; }}, | 152 | 3 | {Builtins::MUL(1, X), [=]{ return X; }}, | 153 | 3 | {Builtins::MUL(X, Word(-1)), [=]() -> Pattern { return Builtins::SUB(0, X); }}, | 154 | 3 | {Builtins::MUL(Word(-1), X), [=]() -> Pattern { return Builtins::SUB(0, X); }}, | 155 | 3 | {Builtins::DIV(X, 0), [=]{ return Word(0); }}, | 156 | 3 | {Builtins::DIV(0, X), [=]{ return Word(0); }}, | 157 | 3 | {Builtins::DIV(X, 1), [=]{ return X; }}, | 158 | 3 | {Builtins::SDIV(X, 0), [=]{ return Word(0); }}, | 159 | 3 | {Builtins::SDIV(0, X), [=]{ return Word(0); }}, | 160 | 3 | {Builtins::SDIV(X, 1), [=]{ return X; }}, | 161 | 3 | {Builtins::AND(X, ~Word(0)), [=]{ return X; }}, | 162 | 3 | {Builtins::AND(~Word(0), X), [=]{ return X; }}, | 163 | 3 | {Builtins::AND(X, 0), [=]{ return Word(0); }}, | 164 | 3 | {Builtins::AND(0, X), [=]{ return Word(0); }}, | 165 | 3 | {Builtins::OR(X, 0), [=]{ return X; }}, | 166 | 3 | {Builtins::OR(0, X), [=]{ return X; }}, | 167 | 3 | {Builtins::OR(X, ~Word(0)), [=]{ return ~Word(0); }}, | 168 | 3 | {Builtins::OR(~Word(0), X), [=]{ return ~Word(0); }}, | 169 | 3 | {Builtins::XOR(X, 0), [=]{ return X; }}, | 170 | 3 | {Builtins::XOR(0, X), [=]{ return X; }}, | 171 | 3 | {Builtins::MOD(X, 0), [=]{ return Word(0); }}, | 172 | 3 | {Builtins::MOD(0, X), [=]{ return Word(0); }}, | 173 | 3 | {Builtins::EQ(X, 0), [=]() -> Pattern { return Builtins::ISZERO(X); },}, | 174 | 3 | {Builtins::EQ(0, X), [=]() -> Pattern { return Builtins::ISZERO(X); },}, | 175 | 3 | {Builtins::SHL(0, X), [=]{ return X; }}, | 176 | 3 | {Builtins::SHR(0, X), [=]{ return X; }}, | 177 | 3 | {Builtins::SHL(X, 0), [=]{ return Word(0); }}, | 178 | 3 | {Builtins::SHR(X, 0), [=]{ return Word(0); }}, | 179 | 3 | {Builtins::GT(X, 0), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, | 180 | 3 | {Builtins::LT(0, X), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, | 181 | 3 | {Builtins::GT(X, ~Word(0)), [=]{ return Word(0); }}, | 182 | 3 | {Builtins::LT(~Word(0), X), [=]{ return Word(0); }}, | 183 | 3 | {Builtins::GT(0, X), [=]{ return Word(0); }}, | 184 | 3 | {Builtins::LT(X, 0), [=]{ return Word(0); }}, | 185 | 3 | {Builtins::AND(Builtins::BYTE(X, Y), Word(0xff)), [=]() -> Pattern { return Builtins::BYTE(X, Y); }}, | 186 | 3 | {Builtins::BYTE(Word(Pattern::WordSize / 8 - 1), X), [=]() -> Pattern { return Builtins::AND(X, Word(0xff)); }}, | 187 | 3 | }; | 188 | 3 | } |
|
189 | | |
190 | | template <class Pattern> |
191 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart3( |
192 | | Pattern, |
193 | | Pattern, |
194 | | Pattern, |
195 | | Pattern X, |
196 | | Pattern |
197 | | ) |
198 | 78 | { |
199 | 78 | using Word = typename Pattern::Word; |
200 | 78 | using Builtins = typename Pattern::Builtins; |
201 | 78 | return std::vector<SimplificationRule<Pattern>> { |
202 | | // operations involving an expression and itself |
203 | 238 | {Builtins::AND(X, X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 203 | 214 | {Builtins::AND(X, X), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 203 | 24 | {Builtins::AND(X, X), [=]{ return X; }}, |
|
204 | 1.02k | {Builtins::OR(X, X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 204 | 870 | {Builtins::OR(X, X), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 204 | 159 | {Builtins::OR(X, X), [=]{ return X; }}, |
|
205 | 375 | {Builtins::XOR(X, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 205 | 356 | {Builtins::XOR(X, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 205 | 19 | {Builtins::XOR(X, X), [=]{ return Word(0); }}, |
|
206 | 25.4k | {Builtins::SUB(X, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 206 | 5.13k | {Builtins::SUB(X, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 206 | 20.3k | {Builtins::SUB(X, X), [=]{ return Word(0); }}, |
|
207 | 4.67k | {Builtins::EQ(X, X), [=]{ return Word(1); }},solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 207 | 4.66k | {Builtins::EQ(X, X), [=]{ return Word(1); }}, |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 207 | 16 | {Builtins::EQ(X, X), [=]{ return Word(1); }}, |
|
208 | 163 | {Builtins::LT(X, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 208 | 151 | {Builtins::LT(X, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 208 | 12 | {Builtins::LT(X, X), [=]{ return Word(0); }}, |
|
209 | 233 | {Builtins::SLT(X, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 209 | 207 | {Builtins::SLT(X, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 209 | 26 | {Builtins::SLT(X, X), [=]{ return Word(0); }}, |
|
210 | 204 | {Builtins::GT(X, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 210 | 194 | {Builtins::GT(X, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 210 | 10 | {Builtins::GT(X, X), [=]{ return Word(0); }}, |
|
211 | 256 | {Builtins::SGT(X, X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 211 | 135 | {Builtins::SGT(X, X), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 211 | 121 | {Builtins::SGT(X, X), [=]{ return Word(0); }}, |
|
212 | 260 | {Builtins::MOD(X, X), [=]{ return Word(0); }}solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 212 | 255 | {Builtins::MOD(X, X), [=]{ return Word(0); }} |
solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 212 | 5 | {Builtins::MOD(X, X), [=]{ return Word(0); }} |
|
213 | 78 | }; |
214 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleListPart3<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 198 | 75 | { | 199 | 75 | using Word = typename Pattern::Word; | 200 | 75 | using Builtins = typename Pattern::Builtins; | 201 | 75 | return std::vector<SimplificationRule<Pattern>> { | 202 | | // operations involving an expression and itself | 203 | 75 | {Builtins::AND(X, X), [=]{ return X; }}, | 204 | 75 | {Builtins::OR(X, X), [=]{ return X; }}, | 205 | 75 | {Builtins::XOR(X, X), [=]{ return Word(0); }}, | 206 | 75 | {Builtins::SUB(X, X), [=]{ return Word(0); }}, | 207 | 75 | {Builtins::EQ(X, X), [=]{ return Word(1); }}, | 208 | 75 | {Builtins::LT(X, X), [=]{ return Word(0); }}, | 209 | 75 | {Builtins::SLT(X, X), [=]{ return Word(0); }}, | 210 | 75 | {Builtins::GT(X, X), [=]{ return Word(0); }}, | 211 | 75 | {Builtins::SGT(X, X), [=]{ return Word(0); }}, | 212 | 75 | {Builtins::MOD(X, X), [=]{ return Word(0); }} | 213 | 75 | }; | 214 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleListPart3<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 198 | 3 | { | 199 | 3 | using Word = typename Pattern::Word; | 200 | 3 | using Builtins = typename Pattern::Builtins; | 201 | 3 | return std::vector<SimplificationRule<Pattern>> { | 202 | | // operations involving an expression and itself | 203 | 3 | {Builtins::AND(X, X), [=]{ return X; }}, | 204 | 3 | {Builtins::OR(X, X), [=]{ return X; }}, | 205 | 3 | {Builtins::XOR(X, X), [=]{ return Word(0); }}, | 206 | 3 | {Builtins::SUB(X, X), [=]{ return Word(0); }}, | 207 | 3 | {Builtins::EQ(X, X), [=]{ return Word(1); }}, | 208 | 3 | {Builtins::LT(X, X), [=]{ return Word(0); }}, | 209 | 3 | {Builtins::SLT(X, X), [=]{ return Word(0); }}, | 210 | 3 | {Builtins::GT(X, X), [=]{ return Word(0); }}, | 211 | 3 | {Builtins::SGT(X, X), [=]{ return Word(0); }}, | 212 | 3 | {Builtins::MOD(X, X), [=]{ return Word(0); }} | 213 | 3 | }; | 214 | 3 | } |
|
215 | | |
216 | | template <class Pattern> |
217 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart4( |
218 | | Pattern, |
219 | | Pattern, |
220 | | Pattern, |
221 | | Pattern X, |
222 | | Pattern Y |
223 | | ) |
224 | 78 | { |
225 | 78 | using Word = typename Pattern::Word; |
226 | 78 | using Builtins = typename Pattern::Builtins; |
227 | 78 | return std::vector<SimplificationRule<Pattern>> { |
228 | | // logical instruction combinations |
229 | 648 | {Builtins::NOT(Builtins::NOT(X)), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 229 | 584 | {Builtins::NOT(Builtins::NOT(X)), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 229 | 64 | {Builtins::NOT(Builtins::NOT(X)), [=]{ return X; }}, |
|
230 | 405 | {Builtins::XOR(X, Builtins::XOR(X, Y)), [=]{ return Y; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 230 | 268 | {Builtins::XOR(X, Builtins::XOR(X, Y)), [=]{ return Y; }}, |
solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 230 | 137 | {Builtins::XOR(X, Builtins::XOR(X, Y)), [=]{ return Y; }}, |
|
231 | 288 | {Builtins::XOR(X, Builtins::XOR(Y, X)), [=]{ return Y; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 231 | 264 | {Builtins::XOR(X, Builtins::XOR(Y, X)), [=]{ return Y; }}, |
solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 231 | 24 | {Builtins::XOR(X, Builtins::XOR(Y, X)), [=]{ return Y; }}, |
|
232 | 292 | {Builtins::XOR(Builtins::XOR(X, Y), X), [=]{ return Y; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 232 | 292 | {Builtins::XOR(Builtins::XOR(X, Y), X), [=]{ return Y; }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() const |
233 | 282 | {Builtins::XOR(Builtins::XOR(Y, X), X), [=]{ return Y; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 233 | 282 | {Builtins::XOR(Builtins::XOR(Y, X), X), [=]{ return Y; }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() const |
234 | 438 | {Builtins::OR(X, Builtins::AND(X, Y)), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 234 | 209 | {Builtins::OR(X, Builtins::AND(X, Y)), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 234 | 229 | {Builtins::OR(X, Builtins::AND(X, Y)), [=]{ return X; }}, |
|
235 | 270 | {Builtins::OR(X, Builtins::AND(Y, X)), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 235 | 178 | {Builtins::OR(X, Builtins::AND(Y, X)), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 235 | 92 | {Builtins::OR(X, Builtins::AND(Y, X)), [=]{ return X; }}, |
|
236 | 312 | {Builtins::OR(Builtins::AND(X, Y), X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 236 | 312 | {Builtins::OR(Builtins::AND(X, Y), X), [=]{ return X; }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#8}::operator()() const |
237 | 944 | {Builtins::OR(Builtins::AND(Y, X), X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 237 | 944 | {Builtins::OR(Builtins::AND(Y, X), X), [=]{ return X; }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() const |
238 | 262 | {Builtins::AND(X, Builtins::OR(X, Y)), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 238 | 156 | {Builtins::AND(X, Builtins::OR(X, Y)), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 238 | 106 | {Builtins::AND(X, Builtins::OR(X, Y)), [=]{ return X; }}, |
|
239 | 223 | {Builtins::AND(X, Builtins::OR(Y, X)), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 239 | 221 | {Builtins::AND(X, Builtins::OR(Y, X)), [=]{ return X; }}, |
solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 239 | 2 | {Builtins::AND(X, Builtins::OR(Y, X)), [=]{ return X; }}, |
|
240 | 211 | {Builtins::AND(Builtins::OR(X, Y), X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#12}::operator()() constLine | Count | Source | 240 | 211 | {Builtins::AND(Builtins::OR(X, Y), X), [=]{ return X; }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#12}::operator()() const |
241 | 187 | {Builtins::AND(Builtins::OR(Y, X), X), [=]{ return X; }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#13}::operator()() constLine | Count | Source | 241 | 187 | {Builtins::AND(Builtins::OR(Y, X), X), [=]{ return X; }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#13}::operator()() const |
242 | 91 | {Builtins::AND(X, Builtins::NOT(X)), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 242 | 90 | {Builtins::AND(X, Builtins::NOT(X)), [=]{ return Word(0); }}, |
solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 242 | 1 | {Builtins::AND(X, Builtins::NOT(X)), [=]{ return Word(0); }}, |
|
243 | 181 | {Builtins::AND(Builtins::NOT(X), X), [=]{ return Word(0); }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#15}::operator()() constLine | Count | Source | 243 | 181 | {Builtins::AND(Builtins::NOT(X), X), [=]{ return Word(0); }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#15}::operator()() const |
244 | 186 | {Builtins::OR(X, Builtins::NOT(X)), [=]{ return ~Word(0); }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 244 | 173 | {Builtins::OR(X, Builtins::NOT(X)), [=]{ return ~Word(0); }}, |
solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 244 | 13 | {Builtins::OR(X, Builtins::NOT(X)), [=]{ return ~Word(0); }}, |
|
245 | 217 | {Builtins::OR(Builtins::NOT(X), X), [=]{ return ~Word(0); }},solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#17}::operator()() constLine | Count | Source | 245 | 217 | {Builtins::OR(Builtins::NOT(X), X), [=]{ return ~Word(0); }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#17}::operator()() const |
246 | 78 | }; |
247 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 224 | 75 | { | 225 | 75 | using Word = typename Pattern::Word; | 226 | 75 | using Builtins = typename Pattern::Builtins; | 227 | 75 | return std::vector<SimplificationRule<Pattern>> { | 228 | | // logical instruction combinations | 229 | 75 | {Builtins::NOT(Builtins::NOT(X)), [=]{ return X; }}, | 230 | 75 | {Builtins::XOR(X, Builtins::XOR(X, Y)), [=]{ return Y; }}, | 231 | 75 | {Builtins::XOR(X, Builtins::XOR(Y, X)), [=]{ return Y; }}, | 232 | 75 | {Builtins::XOR(Builtins::XOR(X, Y), X), [=]{ return Y; }}, | 233 | 75 | {Builtins::XOR(Builtins::XOR(Y, X), X), [=]{ return Y; }}, | 234 | 75 | {Builtins::OR(X, Builtins::AND(X, Y)), [=]{ return X; }}, | 235 | 75 | {Builtins::OR(X, Builtins::AND(Y, X)), [=]{ return X; }}, | 236 | 75 | {Builtins::OR(Builtins::AND(X, Y), X), [=]{ return X; }}, | 237 | 75 | {Builtins::OR(Builtins::AND(Y, X), X), [=]{ return X; }}, | 238 | 75 | {Builtins::AND(X, Builtins::OR(X, Y)), [=]{ return X; }}, | 239 | 75 | {Builtins::AND(X, Builtins::OR(Y, X)), [=]{ return X; }}, | 240 | 75 | {Builtins::AND(Builtins::OR(X, Y), X), [=]{ return X; }}, | 241 | 75 | {Builtins::AND(Builtins::OR(Y, X), X), [=]{ return X; }}, | 242 | 75 | {Builtins::AND(X, Builtins::NOT(X)), [=]{ return Word(0); }}, | 243 | 75 | {Builtins::AND(Builtins::NOT(X), X), [=]{ return Word(0); }}, | 244 | 75 | {Builtins::OR(X, Builtins::NOT(X)), [=]{ return ~Word(0); }}, | 245 | 75 | {Builtins::OR(Builtins::NOT(X), X), [=]{ return ~Word(0); }}, | 246 | 75 | }; | 247 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleListPart4<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 224 | 3 | { | 225 | 3 | using Word = typename Pattern::Word; | 226 | 3 | using Builtins = typename Pattern::Builtins; | 227 | 3 | return std::vector<SimplificationRule<Pattern>> { | 228 | | // logical instruction combinations | 229 | 3 | {Builtins::NOT(Builtins::NOT(X)), [=]{ return X; }}, | 230 | 3 | {Builtins::XOR(X, Builtins::XOR(X, Y)), [=]{ return Y; }}, | 231 | 3 | {Builtins::XOR(X, Builtins::XOR(Y, X)), [=]{ return Y; }}, | 232 | 3 | {Builtins::XOR(Builtins::XOR(X, Y), X), [=]{ return Y; }}, | 233 | 3 | {Builtins::XOR(Builtins::XOR(Y, X), X), [=]{ return Y; }}, | 234 | 3 | {Builtins::OR(X, Builtins::AND(X, Y)), [=]{ return X; }}, | 235 | 3 | {Builtins::OR(X, Builtins::AND(Y, X)), [=]{ return X; }}, | 236 | 3 | {Builtins::OR(Builtins::AND(X, Y), X), [=]{ return X; }}, | 237 | 3 | {Builtins::OR(Builtins::AND(Y, X), X), [=]{ return X; }}, | 238 | 3 | {Builtins::AND(X, Builtins::OR(X, Y)), [=]{ return X; }}, | 239 | 3 | {Builtins::AND(X, Builtins::OR(Y, X)), [=]{ return X; }}, | 240 | 3 | {Builtins::AND(Builtins::OR(X, Y), X), [=]{ return X; }}, | 241 | 3 | {Builtins::AND(Builtins::OR(Y, X), X), [=]{ return X; }}, | 242 | 3 | {Builtins::AND(X, Builtins::NOT(X)), [=]{ return Word(0); }}, | 243 | 3 | {Builtins::AND(Builtins::NOT(X), X), [=]{ return Word(0); }}, | 244 | 3 | {Builtins::OR(X, Builtins::NOT(X)), [=]{ return ~Word(0); }}, | 245 | 3 | {Builtins::OR(Builtins::NOT(X), X), [=]{ return ~Word(0); }}, | 246 | 3 | }; | 247 | 3 | } |
|
248 | | |
249 | | template <class Pattern> |
250 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart4_5( |
251 | | Pattern A, |
252 | | Pattern B, |
253 | | Pattern, |
254 | | Pattern X, |
255 | | Pattern Y |
256 | | ) |
257 | 78 | { |
258 | 78 | using Builtins = typename Pattern::Builtins; |
259 | 78 | return std::vector<SimplificationRule<Pattern>>{ |
260 | | // idempotent operations |
261 | 1.39k | {Builtins::AND(Builtins::AND(X, Y), Y), [=]{ return Builtins::AND(X, Y); }},solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 261 | 1.39k | {Builtins::AND(Builtins::AND(X, Y), Y), [=]{ return Builtins::AND(X, Y); }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() const |
262 | 546 | {Builtins::AND(Y, Builtins::AND(X, Y)), [=]{ return Builtins::AND(X, Y); }},solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 262 | 388 | {Builtins::AND(Y, Builtins::AND(X, Y)), [=]{ return Builtins::AND(X, Y); }}, |
solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 262 | 158 | {Builtins::AND(Y, Builtins::AND(X, Y)), [=]{ return Builtins::AND(X, Y); }}, |
|
263 | 441 | {Builtins::AND(Builtins::AND(Y, X), Y), [=]{ return Builtins::AND(Y, X); }},solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 263 | 441 | {Builtins::AND(Builtins::AND(Y, X), Y), [=]{ return Builtins::AND(Y, X); }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() const |
264 | 879 | {Builtins::AND(Y, Builtins::AND(Y, X)), [=]{ return Builtins::AND(Y, X); }},solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 264 | 634 | {Builtins::AND(Y, Builtins::AND(Y, X)), [=]{ return Builtins::AND(Y, X); }}, |
solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 264 | 245 | {Builtins::AND(Y, Builtins::AND(Y, X)), [=]{ return Builtins::AND(Y, X); }}, |
|
265 | 537 | {Builtins::OR(Builtins::OR(X, Y), Y), [=]{ return Builtins::OR(X, Y); }},solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 265 | 537 | {Builtins::OR(Builtins::OR(X, Y), Y), [=]{ return Builtins::OR(X, Y); }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() const |
266 | 523 | {Builtins::OR(Y, Builtins::OR(X, Y)), [=]{ return Builtins::OR(X, Y); }},solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 266 | 494 | {Builtins::OR(Y, Builtins::OR(X, Y)), [=]{ return Builtins::OR(X, Y); }}, |
solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 266 | 29 | {Builtins::OR(Y, Builtins::OR(X, Y)), [=]{ return Builtins::OR(X, Y); }}, |
|
267 | 717 | {Builtins::OR(Builtins::OR(Y, X), Y), [=]{ return Builtins::OR(Y, X); }},solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 267 | 717 | {Builtins::OR(Builtins::OR(Y, X), Y), [=]{ return Builtins::OR(Y, X); }}, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() const |
268 | 1.84k | {Builtins::OR(Y, Builtins::OR(Y, X)), [=]{ return Builtins::OR(Y, X); }},solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 268 | 1.71k | {Builtins::OR(Y, Builtins::OR(Y, X)), [=]{ return Builtins::OR(Y, X); }}, |
solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 268 | 132 | {Builtins::OR(Y, Builtins::OR(Y, X)), [=]{ return Builtins::OR(Y, X); }}, |
|
269 | 359 | {Builtins::SIGNEXTEND(X, Builtins::SIGNEXTEND(X, Y)), [=]() { return Builtins::SIGNEXTEND(X, Y); }},solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 269 | 339 | {Builtins::SIGNEXTEND(X, Builtins::SIGNEXTEND(X, Y)), [=]() { return Builtins::SIGNEXTEND(X, Y); }}, |
solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 269 | 20 | {Builtins::SIGNEXTEND(X, Builtins::SIGNEXTEND(X, Y)), [=]() { return Builtins::SIGNEXTEND(X, Y); }}, |
|
270 | 1.49k | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { |
271 | 1.49k | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); |
272 | 1.49k | }}, solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 270 | 1.19k | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { | 271 | 1.19k | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); | 272 | 1.19k | }}, |
solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 270 | 294 | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { | 271 | 294 | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); | 272 | 294 | }}, |
|
273 | 78 | }; |
274 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleListPart4_5<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 257 | 75 | { | 258 | 75 | using Builtins = typename Pattern::Builtins; | 259 | 75 | return std::vector<SimplificationRule<Pattern>>{ | 260 | | // idempotent operations | 261 | 75 | {Builtins::AND(Builtins::AND(X, Y), Y), [=]{ return Builtins::AND(X, Y); }}, | 262 | 75 | {Builtins::AND(Y, Builtins::AND(X, Y)), [=]{ return Builtins::AND(X, Y); }}, | 263 | 75 | {Builtins::AND(Builtins::AND(Y, X), Y), [=]{ return Builtins::AND(Y, X); }}, | 264 | 75 | {Builtins::AND(Y, Builtins::AND(Y, X)), [=]{ return Builtins::AND(Y, X); }}, | 265 | 75 | {Builtins::OR(Builtins::OR(X, Y), Y), [=]{ return Builtins::OR(X, Y); }}, | 266 | 75 | {Builtins::OR(Y, Builtins::OR(X, Y)), [=]{ return Builtins::OR(X, Y); }}, | 267 | 75 | {Builtins::OR(Builtins::OR(Y, X), Y), [=]{ return Builtins::OR(Y, X); }}, | 268 | 75 | {Builtins::OR(Y, Builtins::OR(Y, X)), [=]{ return Builtins::OR(Y, X); }}, | 269 | 75 | {Builtins::SIGNEXTEND(X, Builtins::SIGNEXTEND(X, Y)), [=]() { return Builtins::SIGNEXTEND(X, Y); }}, | 270 | 75 | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { | 271 | 75 | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); | 272 | 75 | }}, | 273 | 75 | }; | 274 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleListPart4_5<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 257 | 3 | { | 258 | 3 | using Builtins = typename Pattern::Builtins; | 259 | 3 | return std::vector<SimplificationRule<Pattern>>{ | 260 | | // idempotent operations | 261 | 3 | {Builtins::AND(Builtins::AND(X, Y), Y), [=]{ return Builtins::AND(X, Y); }}, | 262 | 3 | {Builtins::AND(Y, Builtins::AND(X, Y)), [=]{ return Builtins::AND(X, Y); }}, | 263 | 3 | {Builtins::AND(Builtins::AND(Y, X), Y), [=]{ return Builtins::AND(Y, X); }}, | 264 | 3 | {Builtins::AND(Y, Builtins::AND(Y, X)), [=]{ return Builtins::AND(Y, X); }}, | 265 | 3 | {Builtins::OR(Builtins::OR(X, Y), Y), [=]{ return Builtins::OR(X, Y); }}, | 266 | 3 | {Builtins::OR(Y, Builtins::OR(X, Y)), [=]{ return Builtins::OR(X, Y); }}, | 267 | 3 | {Builtins::OR(Builtins::OR(Y, X), Y), [=]{ return Builtins::OR(Y, X); }}, | 268 | 3 | {Builtins::OR(Y, Builtins::OR(Y, X)), [=]{ return Builtins::OR(Y, X); }}, | 269 | 3 | {Builtins::SIGNEXTEND(X, Builtins::SIGNEXTEND(X, Y)), [=]() { return Builtins::SIGNEXTEND(X, Y); }}, | 270 | 3 | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { | 271 | 3 | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); | 272 | 3 | }}, | 273 | 3 | }; | 274 | 3 | } |
|
275 | | |
276 | | template <class Pattern> |
277 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart5( |
278 | | bool _forYulOptimizer, |
279 | | Pattern A, |
280 | | Pattern B, |
281 | | Pattern, |
282 | | Pattern X, |
283 | | Pattern Y |
284 | | ) |
285 | 78 | { |
286 | 78 | using Word = typename Pattern::Word; |
287 | 78 | using Builtins = typename Pattern::Builtins; |
288 | | |
289 | 78 | std::vector<SimplificationRule<Pattern>> rules; |
290 | | |
291 | | // The libevmasm optimizer does not support rules resulting in opcodes with more than two arguments. |
292 | 78 | if (_forYulOptimizer) |
293 | 75 | { |
294 | | // Replace MOD(MUL(X, Y), A) with MULMOD(X, Y, A) iff A=2**N |
295 | 75 | rules.push_back({ |
296 | 75 | Builtins::MOD(Builtins::MUL(X, Y), A), |
297 | 705 | [=]() -> Pattern { return Builtins::MULMOD(X, Y, A); },solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 297 | 705 | [=]() -> Pattern { return Builtins::MULMOD(X, Y, A); }, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() const |
298 | 8.54k | [=] { |
299 | 8.54k | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); |
300 | 8.54k | } solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 298 | 8.54k | [=] { | 299 | 8.54k | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 300 | 8.54k | } |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() const |
301 | 75 | }); |
302 | | |
303 | | // Replace MOD(ADD(X, Y), A) with ADDMOD(X, Y, A) iff A=2**N |
304 | 75 | rules.push_back({ |
305 | 75 | Builtins::MOD(Builtins::ADD(X, Y), A), |
306 | 1.17k | [=]() -> Pattern { return Builtins::ADDMOD(X, Y, A); },solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 306 | 1.17k | [=]() -> Pattern { return Builtins::ADDMOD(X, Y, A); }, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() const |
307 | 9.37k | [=] { |
308 | 9.37k | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); |
309 | 9.37k | } solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 307 | 9.37k | [=] { | 308 | 9.37k | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 309 | 9.37k | } |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() const |
310 | 75 | }); |
311 | 75 | } |
312 | | |
313 | | // Replace MOD X, <power-of-two> with AND X, <power-of-two> - 1 |
314 | 20.0k | for (size_t i = 0; i < Pattern::WordSize; ++i) |
315 | 19.9k | { |
316 | 19.9k | Word value = Word(1) << i; |
317 | 19.9k | rules.push_back({ |
318 | 19.9k | Builtins::MOD(X, value), |
319 | 52.0k | [=]() -> Pattern { return Builtins::AND(X, value - 1); }solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 319 | 46.4k | [=]() -> Pattern { return Builtins::AND(X, value - 1); } |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 319 | 5.61k | [=]() -> Pattern { return Builtins::AND(X, value - 1); } |
|
320 | 19.9k | }); |
321 | 19.9k | } |
322 | | |
323 | | // Replace SHL >=256, X with 0 |
324 | 78 | rules.push_back({ |
325 | 78 | Builtins::SHL(A, X), |
326 | 5.28k | [=]() -> Pattern { return Word(0); },solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 326 | 5.08k | [=]() -> Pattern { return Word(0); }, |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 326 | 201 | [=]() -> Pattern { return Word(0); }, |
|
327 | 197k | [=]() { return A.d() >= Pattern::WordSize; }solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 327 | 172k | [=]() { return A.d() >= Pattern::WordSize; } |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 327 | 24.9k | [=]() { return A.d() >= Pattern::WordSize; } |
|
328 | 78 | }); |
329 | | |
330 | | // Replace SHR >=256, X with 0 |
331 | 78 | rules.push_back({ |
332 | 78 | Builtins::SHR(A, X), |
333 | 1.42k | [=]() -> Pattern { return Word(0); },solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 333 | 1.29k | [=]() -> Pattern { return Word(0); }, |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 333 | 133 | [=]() -> Pattern { return Word(0); }, |
|
334 | 156k | [=]() { return A.d() >= Pattern::WordSize; }solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 334 | 137k | [=]() { return A.d() >= Pattern::WordSize; } |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 334 | 19.0k | [=]() { return A.d() >= Pattern::WordSize; } |
|
335 | 78 | }); |
336 | | |
337 | | // Replace BYTE(A, X), A >= 32 with 0 |
338 | 78 | rules.push_back({ |
339 | 78 | Builtins::BYTE(A, X), |
340 | 915 | [=]() -> Pattern { return Word(0); },solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 340 | 788 | [=]() -> Pattern { return Word(0); }, |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 340 | 127 | [=]() -> Pattern { return Word(0); }, |
|
341 | 11.8k | [=]() { return A.d() >= Pattern::WordSize / 8; }solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 341 | 11.5k | [=]() { return A.d() >= Pattern::WordSize / 8; } |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 341 | 361 | [=]() { return A.d() >= Pattern::WordSize / 8; } |
|
342 | 78 | }); |
343 | | |
344 | | // Replace SIGNEXTEND(A, X), A >= 31 with ID |
345 | 78 | rules.push_back({ |
346 | 78 | Builtins::SIGNEXTEND(A, X), |
347 | 2.44k | [=]() -> Pattern { return X; },solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#12}::operator()() constLine | Count | Source | 347 | 2.03k | [=]() -> Pattern { return X; }, |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#12}::operator()() constLine | Count | Source | 347 | 408 | [=]() -> Pattern { return X; }, |
|
348 | 24.5k | [=]() { return A.d() >= Pattern::WordSize / 8 - 1; }solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#13}::operator()() constLine | Count | Source | 348 | 22.0k | [=]() { return A.d() >= Pattern::WordSize / 8 - 1; } |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#13}::operator()() constLine | Count | Source | 348 | 2.49k | [=]() { return A.d() >= Pattern::WordSize / 8 - 1; } |
|
349 | 78 | }); |
350 | 78 | rules.push_back({ |
351 | 78 | Builtins::AND(A, Builtins::SIGNEXTEND(B, X)), |
352 | 1.27k | [=]() -> Pattern { return Builtins::AND(A, X); },solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 352 | 1.18k | [=]() -> Pattern { return Builtins::AND(A, X); }, |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 352 | 88 | [=]() -> Pattern { return Builtins::AND(A, X); }, |
|
353 | 5.18k | [=]() { |
354 | 5.18k | return |
355 | 5.18k | B.d() < Pattern::WordSize / 8 - 1 && |
356 | 5.18k | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); |
357 | 5.18k | } solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#15}::operator()() constLine | Count | Source | 353 | 4.90k | [=]() { | 354 | 4.90k | return | 355 | 4.90k | B.d() < Pattern::WordSize / 8 - 1 && | 356 | 4.90k | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 357 | 4.90k | } |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#15}::operator()() constLine | Count | Source | 353 | 276 | [=]() { | 354 | 276 | return | 355 | 276 | B.d() < Pattern::WordSize / 8 - 1 && | 356 | 276 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 357 | 276 | } |
|
358 | 78 | }); |
359 | 78 | rules.push_back({ |
360 | 78 | Builtins::AND(Builtins::SIGNEXTEND(B, X), A), |
361 | 1.06k | [=]() -> Pattern { return Builtins::AND(A, X); },solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 361 | 721 | [=]() -> Pattern { return Builtins::AND(A, X); }, |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 361 | 342 | [=]() -> Pattern { return Builtins::AND(A, X); }, |
|
362 | 5.81k | [=]() { |
363 | 5.81k | return |
364 | 5.81k | B.d() < Pattern::WordSize / 8 - 1 && |
365 | 5.81k | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); |
366 | 5.81k | } solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#17}::operator()() constLine | Count | Source | 362 | 5.08k | [=]() { | 363 | 5.08k | return | 364 | 5.08k | B.d() < Pattern::WordSize / 8 - 1 && | 365 | 5.08k | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 366 | 5.08k | } |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#17}::operator()() constLine | Count | Source | 362 | 729 | [=]() { | 363 | 729 | return | 364 | 729 | B.d() < Pattern::WordSize / 8 - 1 && | 365 | 729 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 366 | 729 | } |
|
367 | 78 | }); |
368 | | |
369 | 78 | for (auto instr: { |
370 | 78 | Instruction::ADDRESS, |
371 | 78 | Instruction::CALLER, |
372 | 78 | Instruction::ORIGIN, |
373 | 78 | Instruction::COINBASE |
374 | 78 | }) |
375 | 312 | { |
376 | 312 | assertThrow(Pattern::WordSize > 160, OptimizerException, ""); |
377 | 312 | Word const mask = (Word(1) << 160) - 1; |
378 | 312 | rules.push_back({ |
379 | 312 | Builtins::AND(Pattern{instr}, mask), |
380 | 312 | [=]() -> Pattern { return {instr}; }solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#18}::operator()() constLine | Count | Source | 380 | 14 | [=]() -> Pattern { return {instr}; } |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#18}::operator()() constLine | Count | Source | 380 | 15 | [=]() -> Pattern { return {instr}; } |
|
381 | 312 | }); |
382 | 312 | rules.push_back({ |
383 | 312 | Builtins::AND(mask, Pattern{instr}), |
384 | 312 | [=]() -> Pattern { return {instr}; }solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#19}::operator()() constLine | Count | Source | 384 | 9 | [=]() -> Pattern { return {instr}; } |
solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#19}::operator()() constLine | Count | Source | 384 | 4 | [=]() -> Pattern { return {instr}; } |
|
385 | 312 | }); |
386 | 312 | } |
387 | | |
388 | 78 | return rules; |
389 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleListPart5<solidity::yul::Pattern>(bool, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 285 | 75 | { | 286 | 75 | using Word = typename Pattern::Word; | 287 | 75 | using Builtins = typename Pattern::Builtins; | 288 | | | 289 | 75 | std::vector<SimplificationRule<Pattern>> rules; | 290 | | | 291 | | // The libevmasm optimizer does not support rules resulting in opcodes with more than two arguments. | 292 | 75 | if (_forYulOptimizer) | 293 | 75 | { | 294 | | // Replace MOD(MUL(X, Y), A) with MULMOD(X, Y, A) iff A=2**N | 295 | 75 | rules.push_back({ | 296 | 75 | Builtins::MOD(Builtins::MUL(X, Y), A), | 297 | 75 | [=]() -> Pattern { return Builtins::MULMOD(X, Y, A); }, | 298 | 75 | [=] { | 299 | 75 | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 300 | 75 | } | 301 | 75 | }); | 302 | | | 303 | | // Replace MOD(ADD(X, Y), A) with ADDMOD(X, Y, A) iff A=2**N | 304 | 75 | rules.push_back({ | 305 | 75 | Builtins::MOD(Builtins::ADD(X, Y), A), | 306 | 75 | [=]() -> Pattern { return Builtins::ADDMOD(X, Y, A); }, | 307 | 75 | [=] { | 308 | 75 | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 309 | 75 | } | 310 | 75 | }); | 311 | 75 | } | 312 | | | 313 | | // Replace MOD X, <power-of-two> with AND X, <power-of-two> - 1 | 314 | 19.2k | for (size_t i = 0; i < Pattern::WordSize; ++i) | 315 | 19.2k | { | 316 | 19.2k | Word value = Word(1) << i; | 317 | 19.2k | rules.push_back({ | 318 | 19.2k | Builtins::MOD(X, value), | 319 | 19.2k | [=]() -> Pattern { return Builtins::AND(X, value - 1); } | 320 | 19.2k | }); | 321 | 19.2k | } | 322 | | | 323 | | // Replace SHL >=256, X with 0 | 324 | 75 | rules.push_back({ | 325 | 75 | Builtins::SHL(A, X), | 326 | 75 | [=]() -> Pattern { return Word(0); }, | 327 | 75 | [=]() { return A.d() >= Pattern::WordSize; } | 328 | 75 | }); | 329 | | | 330 | | // Replace SHR >=256, X with 0 | 331 | 75 | rules.push_back({ | 332 | 75 | Builtins::SHR(A, X), | 333 | 75 | [=]() -> Pattern { return Word(0); }, | 334 | 75 | [=]() { return A.d() >= Pattern::WordSize; } | 335 | 75 | }); | 336 | | | 337 | | // Replace BYTE(A, X), A >= 32 with 0 | 338 | 75 | rules.push_back({ | 339 | 75 | Builtins::BYTE(A, X), | 340 | 75 | [=]() -> Pattern { return Word(0); }, | 341 | 75 | [=]() { return A.d() >= Pattern::WordSize / 8; } | 342 | 75 | }); | 343 | | | 344 | | // Replace SIGNEXTEND(A, X), A >= 31 with ID | 345 | 75 | rules.push_back({ | 346 | 75 | Builtins::SIGNEXTEND(A, X), | 347 | 75 | [=]() -> Pattern { return X; }, | 348 | 75 | [=]() { return A.d() >= Pattern::WordSize / 8 - 1; } | 349 | 75 | }); | 350 | 75 | rules.push_back({ | 351 | 75 | Builtins::AND(A, Builtins::SIGNEXTEND(B, X)), | 352 | 75 | [=]() -> Pattern { return Builtins::AND(A, X); }, | 353 | 75 | [=]() { | 354 | 75 | return | 355 | 75 | B.d() < Pattern::WordSize / 8 - 1 && | 356 | 75 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 357 | 75 | } | 358 | 75 | }); | 359 | 75 | rules.push_back({ | 360 | 75 | Builtins::AND(Builtins::SIGNEXTEND(B, X), A), | 361 | 75 | [=]() -> Pattern { return Builtins::AND(A, X); }, | 362 | 75 | [=]() { | 363 | 75 | return | 364 | 75 | B.d() < Pattern::WordSize / 8 - 1 && | 365 | 75 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 366 | 75 | } | 367 | 75 | }); | 368 | | | 369 | 75 | for (auto instr: { | 370 | 75 | Instruction::ADDRESS, | 371 | 75 | Instruction::CALLER, | 372 | 75 | Instruction::ORIGIN, | 373 | 75 | Instruction::COINBASE | 374 | 75 | }) | 375 | 300 | { | 376 | 300 | assertThrow(Pattern::WordSize > 160, OptimizerException, ""); | 377 | 300 | Word const mask = (Word(1) << 160) - 1; | 378 | 300 | rules.push_back({ | 379 | 300 | Builtins::AND(Pattern{instr}, mask), | 380 | 300 | [=]() -> Pattern { return {instr}; } | 381 | 300 | }); | 382 | 300 | rules.push_back({ | 383 | 300 | Builtins::AND(mask, Pattern{instr}), | 384 | 300 | [=]() -> Pattern { return {instr}; } | 385 | 300 | }); | 386 | 300 | } | 387 | | | 388 | 75 | return rules; | 389 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleListPart5<solidity::evmasm::Pattern>(bool, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 285 | 3 | { | 286 | 3 | using Word = typename Pattern::Word; | 287 | 3 | using Builtins = typename Pattern::Builtins; | 288 | | | 289 | 3 | std::vector<SimplificationRule<Pattern>> rules; | 290 | | | 291 | | // The libevmasm optimizer does not support rules resulting in opcodes with more than two arguments. | 292 | 3 | if (_forYulOptimizer) | 293 | 0 | { | 294 | | // Replace MOD(MUL(X, Y), A) with MULMOD(X, Y, A) iff A=2**N | 295 | 0 | rules.push_back({ | 296 | 0 | Builtins::MOD(Builtins::MUL(X, Y), A), | 297 | 0 | [=]() -> Pattern { return Builtins::MULMOD(X, Y, A); }, | 298 | 0 | [=] { | 299 | 0 | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 300 | 0 | } | 301 | 0 | }); | 302 | | | 303 | | // Replace MOD(ADD(X, Y), A) with ADDMOD(X, Y, A) iff A=2**N | 304 | 0 | rules.push_back({ | 305 | 0 | Builtins::MOD(Builtins::ADD(X, Y), A), | 306 | 0 | [=]() -> Pattern { return Builtins::ADDMOD(X, Y, A); }, | 307 | 0 | [=] { | 308 | 0 | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 309 | 0 | } | 310 | 0 | }); | 311 | 0 | } | 312 | | | 313 | | // Replace MOD X, <power-of-two> with AND X, <power-of-two> - 1 | 314 | 771 | for (size_t i = 0; i < Pattern::WordSize; ++i) | 315 | 768 | { | 316 | 768 | Word value = Word(1) << i; | 317 | 768 | rules.push_back({ | 318 | 768 | Builtins::MOD(X, value), | 319 | 768 | [=]() -> Pattern { return Builtins::AND(X, value - 1); } | 320 | 768 | }); | 321 | 768 | } | 322 | | | 323 | | // Replace SHL >=256, X with 0 | 324 | 3 | rules.push_back({ | 325 | 3 | Builtins::SHL(A, X), | 326 | 3 | [=]() -> Pattern { return Word(0); }, | 327 | 3 | [=]() { return A.d() >= Pattern::WordSize; } | 328 | 3 | }); | 329 | | | 330 | | // Replace SHR >=256, X with 0 | 331 | 3 | rules.push_back({ | 332 | 3 | Builtins::SHR(A, X), | 333 | 3 | [=]() -> Pattern { return Word(0); }, | 334 | 3 | [=]() { return A.d() >= Pattern::WordSize; } | 335 | 3 | }); | 336 | | | 337 | | // Replace BYTE(A, X), A >= 32 with 0 | 338 | 3 | rules.push_back({ | 339 | 3 | Builtins::BYTE(A, X), | 340 | 3 | [=]() -> Pattern { return Word(0); }, | 341 | 3 | [=]() { return A.d() >= Pattern::WordSize / 8; } | 342 | 3 | }); | 343 | | | 344 | | // Replace SIGNEXTEND(A, X), A >= 31 with ID | 345 | 3 | rules.push_back({ | 346 | 3 | Builtins::SIGNEXTEND(A, X), | 347 | 3 | [=]() -> Pattern { return X; }, | 348 | 3 | [=]() { return A.d() >= Pattern::WordSize / 8 - 1; } | 349 | 3 | }); | 350 | 3 | rules.push_back({ | 351 | 3 | Builtins::AND(A, Builtins::SIGNEXTEND(B, X)), | 352 | 3 | [=]() -> Pattern { return Builtins::AND(A, X); }, | 353 | 3 | [=]() { | 354 | 3 | return | 355 | 3 | B.d() < Pattern::WordSize / 8 - 1 && | 356 | 3 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 357 | 3 | } | 358 | 3 | }); | 359 | 3 | rules.push_back({ | 360 | 3 | Builtins::AND(Builtins::SIGNEXTEND(B, X), A), | 361 | 3 | [=]() -> Pattern { return Builtins::AND(A, X); }, | 362 | 3 | [=]() { | 363 | 3 | return | 364 | 3 | B.d() < Pattern::WordSize / 8 - 1 && | 365 | 3 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 366 | 3 | } | 367 | 3 | }); | 368 | | | 369 | 3 | for (auto instr: { | 370 | 3 | Instruction::ADDRESS, | 371 | 3 | Instruction::CALLER, | 372 | 3 | Instruction::ORIGIN, | 373 | 3 | Instruction::COINBASE | 374 | 3 | }) | 375 | 12 | { | 376 | 12 | assertThrow(Pattern::WordSize > 160, OptimizerException, ""); | 377 | 12 | Word const mask = (Word(1) << 160) - 1; | 378 | 12 | rules.push_back({ | 379 | 12 | Builtins::AND(Pattern{instr}, mask), | 380 | 12 | [=]() -> Pattern { return {instr}; } | 381 | 12 | }); | 382 | 12 | rules.push_back({ | 383 | 12 | Builtins::AND(mask, Pattern{instr}), | 384 | 12 | [=]() -> Pattern { return {instr}; } | 385 | 12 | }); | 386 | 12 | } | 387 | | | 388 | 3 | return rules; | 389 | 3 | } |
|
390 | | |
391 | | template <class Pattern> |
392 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart6( |
393 | | Pattern, |
394 | | Pattern, |
395 | | Pattern, |
396 | | Pattern X, |
397 | | Pattern Y |
398 | | ) |
399 | 78 | { |
400 | 78 | using Builtins = typename Pattern::Builtins; |
401 | | |
402 | 78 | std::vector<SimplificationRule<Pattern>> rules; |
403 | | // Double negation of opcodes with boolean result |
404 | 78 | for (auto instr: { |
405 | 78 | Instruction::EQ, |
406 | 78 | Instruction::LT, |
407 | 78 | Instruction::SLT, |
408 | 78 | Instruction::GT, |
409 | 78 | Instruction::SGT |
410 | 78 | }) |
411 | 390 | { |
412 | 390 | typename Builtins::PatternGeneratorInstance op{instr}; |
413 | 390 | rules.push_back({ |
414 | 390 | Builtins::ISZERO(Builtins::ISZERO(op(X, Y))), |
415 | 54.8k | [=]() -> Pattern { return op(X, Y); }solidity::evmasm::simplificationRuleListPart6<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 415 | 946 | [=]() -> Pattern { return op(X, Y); } |
solidity::evmasm::simplificationRuleListPart6<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 415 | 53.8k | [=]() -> Pattern { return op(X, Y); } |
|
416 | 390 | }); |
417 | 390 | } |
418 | | |
419 | 78 | rules.push_back({ |
420 | 78 | Builtins::ISZERO(Builtins::ISZERO(Builtins::ISZERO(X))), |
421 | 5.95k | [=]() -> Pattern { return Builtins::ISZERO(X); }solidity::evmasm::simplificationRuleListPart6<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 421 | 4.73k | [=]() -> Pattern { return Builtins::ISZERO(X); } |
solidity::evmasm::simplificationRuleListPart6<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 421 | 1.22k | [=]() -> Pattern { return Builtins::ISZERO(X); } |
|
422 | 78 | }); |
423 | | |
424 | 78 | rules.push_back({ |
425 | 78 | Builtins::ISZERO(Builtins::XOR(X, Y)), |
426 | 1.15k | [=]() -> Pattern { return Builtins::EQ(X, Y); }solidity::evmasm::simplificationRuleListPart6<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 426 | 272 | [=]() -> Pattern { return Builtins::EQ(X, Y); } |
solidity::evmasm::simplificationRuleListPart6<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 426 | 879 | [=]() -> Pattern { return Builtins::EQ(X, Y); } |
|
427 | 78 | }); |
428 | | |
429 | 78 | rules.push_back({ |
430 | 78 | Builtins::ISZERO(Builtins::SUB(X, Y)), |
431 | 138k | [=]() -> Pattern { return Builtins::EQ(X, Y); }solidity::evmasm::simplificationRuleListPart6<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 431 | 1.07k | [=]() -> Pattern { return Builtins::EQ(X, Y); } |
solidity::evmasm::simplificationRuleListPart6<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 431 | 137k | [=]() -> Pattern { return Builtins::EQ(X, Y); } |
|
432 | 78 | }); |
433 | | |
434 | 78 | return rules; |
435 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleListPart6<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 399 | 75 | { | 400 | 75 | using Builtins = typename Pattern::Builtins; | 401 | | | 402 | 75 | std::vector<SimplificationRule<Pattern>> rules; | 403 | | // Double negation of opcodes with boolean result | 404 | 75 | for (auto instr: { | 405 | 75 | Instruction::EQ, | 406 | 75 | Instruction::LT, | 407 | 75 | Instruction::SLT, | 408 | 75 | Instruction::GT, | 409 | 75 | Instruction::SGT | 410 | 75 | }) | 411 | 375 | { | 412 | 375 | typename Builtins::PatternGeneratorInstance op{instr}; | 413 | 375 | rules.push_back({ | 414 | 375 | Builtins::ISZERO(Builtins::ISZERO(op(X, Y))), | 415 | 375 | [=]() -> Pattern { return op(X, Y); } | 416 | 375 | }); | 417 | 375 | } | 418 | | | 419 | 75 | rules.push_back({ | 420 | 75 | Builtins::ISZERO(Builtins::ISZERO(Builtins::ISZERO(X))), | 421 | 75 | [=]() -> Pattern { return Builtins::ISZERO(X); } | 422 | 75 | }); | 423 | | | 424 | 75 | rules.push_back({ | 425 | 75 | Builtins::ISZERO(Builtins::XOR(X, Y)), | 426 | 75 | [=]() -> Pattern { return Builtins::EQ(X, Y); } | 427 | 75 | }); | 428 | | | 429 | 75 | rules.push_back({ | 430 | 75 | Builtins::ISZERO(Builtins::SUB(X, Y)), | 431 | 75 | [=]() -> Pattern { return Builtins::EQ(X, Y); } | 432 | 75 | }); | 433 | | | 434 | 75 | return rules; | 435 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleListPart6<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 399 | 3 | { | 400 | 3 | using Builtins = typename Pattern::Builtins; | 401 | | | 402 | 3 | std::vector<SimplificationRule<Pattern>> rules; | 403 | | // Double negation of opcodes with boolean result | 404 | 3 | for (auto instr: { | 405 | 3 | Instruction::EQ, | 406 | 3 | Instruction::LT, | 407 | 3 | Instruction::SLT, | 408 | 3 | Instruction::GT, | 409 | 3 | Instruction::SGT | 410 | 3 | }) | 411 | 15 | { | 412 | 15 | typename Builtins::PatternGeneratorInstance op{instr}; | 413 | 15 | rules.push_back({ | 414 | 15 | Builtins::ISZERO(Builtins::ISZERO(op(X, Y))), | 415 | 15 | [=]() -> Pattern { return op(X, Y); } | 416 | 15 | }); | 417 | 15 | } | 418 | | | 419 | 3 | rules.push_back({ | 420 | 3 | Builtins::ISZERO(Builtins::ISZERO(Builtins::ISZERO(X))), | 421 | 3 | [=]() -> Pattern { return Builtins::ISZERO(X); } | 422 | 3 | }); | 423 | | | 424 | 3 | rules.push_back({ | 425 | 3 | Builtins::ISZERO(Builtins::XOR(X, Y)), | 426 | 3 | [=]() -> Pattern { return Builtins::EQ(X, Y); } | 427 | 3 | }); | 428 | | | 429 | 3 | rules.push_back({ | 430 | 3 | Builtins::ISZERO(Builtins::SUB(X, Y)), | 431 | 3 | [=]() -> Pattern { return Builtins::EQ(X, Y); } | 432 | 3 | }); | 433 | | | 434 | 3 | return rules; | 435 | 3 | } |
|
436 | | |
437 | | template <class Pattern> |
438 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart7( |
439 | | Pattern A, |
440 | | Pattern B, |
441 | | Pattern, |
442 | | Pattern X, |
443 | | Pattern Y, |
444 | | Pattern Z |
445 | | ) |
446 | 78 | { |
447 | 78 | using Word = typename Pattern::Word; |
448 | 78 | using Builtins = typename Pattern::Builtins; |
449 | | |
450 | 78 | std::vector<SimplificationRule<Pattern>> rules; |
451 | | // Associative operations |
452 | 78 | for (auto&& instrAndFunc: std::vector<std::pair<Instruction, std::function<Word(Word, Word)>>>{ |
453 | 78 | {Instruction::ADD, std::plus<Word>()}, |
454 | 78 | {Instruction::MUL, std::multiplies<Word>()}, |
455 | 78 | {Instruction::AND, std::bit_and<Word>()}, |
456 | 78 | {Instruction::OR, std::bit_or<Word>()}, |
457 | 78 | {Instruction::XOR, std::bit_xor<Word>()} |
458 | 78 | }) |
459 | 390 | { |
460 | 390 | typename Builtins::PatternGeneratorInstance op{instrAndFunc.first}; |
461 | 390 | std::function<Word(Word, Word)> fun = instrAndFunc.second; |
462 | | // Moving constants to the outside, order matters here - we first add rules |
463 | | // for constants and then for non-constants. |
464 | | // xa can be (X, A) or (A, X) |
465 | 390 | for (auto const& opXA: {op(X, A), op(A, X)}) |
466 | 780 | { |
467 | 780 | rules += std::vector<SimplificationRule<Pattern>>{{ |
468 | | // (X+A)+B -> X+(A+B) |
469 | 780 | op(opXA, B), |
470 | 49.2k | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 470 | 42.8k | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 470 | 6.39k | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } |
|
471 | 780 | }, { |
472 | | // (X+A)+Y -> (X+Y)+A |
473 | 780 | op(opXA, Y), |
474 | 30.9k | [=]() -> Pattern { return op(op(X, Y), A); }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 474 | 24.0k | [=]() -> Pattern { return op(op(X, Y), A); } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 474 | 6.86k | [=]() -> Pattern { return op(op(X, Y), A); } |
|
475 | 780 | }, { |
476 | | // B+(X+A) -> X+(A+B) |
477 | 780 | op(B, opXA), |
478 | 18.4k | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 478 | 7.79k | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 478 | 10.6k | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } |
|
479 | 780 | }, { |
480 | | // Y+(X+A) -> (Y+X)+A |
481 | 780 | op(Y, opXA), |
482 | 16.4k | [=]() -> Pattern { return op(op(Y, X), A); }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 482 | 14.8k | [=]() -> Pattern { return op(op(Y, X), A); } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 482 | 1.55k | [=]() -> Pattern { return op(op(Y, X), A); } |
|
483 | 780 | }}; |
484 | 780 | } |
485 | 390 | } |
486 | | |
487 | | // Combine two SHL by constant |
488 | 78 | rules.push_back({ |
489 | | // SHL(B, SHL(A, X)) -> SHL(min(A+B, 256), X) |
490 | 78 | Builtins::SHL(B, Builtins::SHL(A, X)), |
491 | 4.11k | [=]() -> Pattern { |
492 | 4.11k | bigint sum = bigint(A.d()) + B.d(); |
493 | 4.11k | if (sum >= Pattern::WordSize) |
494 | 644 | return Builtins::AND(X, Word(0)); |
495 | 3.47k | else |
496 | 3.47k | return Builtins::SHL(Word(sum), X); |
497 | 4.11k | } solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 491 | 3.85k | [=]() -> Pattern { | 492 | 3.85k | bigint sum = bigint(A.d()) + B.d(); | 493 | 3.85k | if (sum >= Pattern::WordSize) | 494 | 643 | return Builtins::AND(X, Word(0)); | 495 | 3.21k | else | 496 | 3.21k | return Builtins::SHL(Word(sum), X); | 497 | 3.85k | } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 491 | 266 | [=]() -> Pattern { | 492 | 266 | bigint sum = bigint(A.d()) + B.d(); | 493 | 266 | if (sum >= Pattern::WordSize) | 494 | 1 | return Builtins::AND(X, Word(0)); | 495 | 265 | else | 496 | 265 | return Builtins::SHL(Word(sum), X); | 497 | 266 | } |
|
498 | 78 | }); |
499 | | |
500 | | // Combine two SHR by constant |
501 | 78 | rules.push_back({ |
502 | | // SHR(B, SHR(A, X)) -> SHR(min(A+B, 256), X) |
503 | 78 | Builtins::SHR(B, Builtins::SHR(A, X)), |
504 | 3.95k | [=]() -> Pattern { |
505 | 3.95k | bigint sum = bigint(A.d()) + B.d(); |
506 | 3.95k | if (sum >= Pattern::WordSize) |
507 | 617 | return Builtins::AND(X, Word(0)); |
508 | 3.33k | else |
509 | 3.33k | return Builtins::SHR(Word(sum), X); |
510 | 3.95k | } solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 504 | 3.77k | [=]() -> Pattern { | 505 | 3.77k | bigint sum = bigint(A.d()) + B.d(); | 506 | 3.77k | if (sum >= Pattern::WordSize) | 507 | 617 | return Builtins::AND(X, Word(0)); | 508 | 3.16k | else | 509 | 3.16k | return Builtins::SHR(Word(sum), X); | 510 | 3.77k | } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 504 | 174 | [=]() -> Pattern { | 505 | 174 | bigint sum = bigint(A.d()) + B.d(); | 506 | 174 | if (sum >= Pattern::WordSize) | 507 | 0 | return Builtins::AND(X, Word(0)); | 508 | 174 | else | 509 | 174 | return Builtins::SHR(Word(sum), X); | 510 | 174 | } |
|
511 | 78 | }); |
512 | | |
513 | | // Combine SHL-SHR by constant |
514 | 78 | rules.push_back({ |
515 | | // SHR(B, SHL(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) |
516 | 78 | Builtins::SHR(B, Builtins::SHL(A, X)), |
517 | 11.9k | [=]() -> Pattern { |
518 | 11.9k | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); |
519 | | |
520 | 11.9k | if (A.d() > B.d()) |
521 | 3.21k | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); |
522 | 8.69k | else if (B.d() > A.d()) |
523 | 7.91k | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); |
524 | 785 | else |
525 | 785 | return Builtins::AND(X, mask); |
526 | 11.9k | }, solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 517 | 11.5k | [=]() -> Pattern { | 518 | 11.5k | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); | 519 | | | 520 | 11.5k | if (A.d() > B.d()) | 521 | 3.00k | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); | 522 | 8.51k | else if (B.d() > A.d()) | 523 | 7.75k | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); | 524 | 756 | else | 525 | 756 | return Builtins::AND(X, mask); | 526 | 11.5k | }, |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 517 | 389 | [=]() -> Pattern { | 518 | 389 | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); | 519 | | | 520 | 389 | if (A.d() > B.d()) | 521 | 208 | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); | 522 | 181 | else if (B.d() > A.d()) | 523 | 152 | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); | 524 | 29 | else | 525 | 29 | return Builtins::AND(X, mask); | 526 | 389 | }, |
|
527 | 11.9k | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 527 | 11.5k | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 527 | 389 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } |
|
528 | 78 | }); |
529 | | |
530 | | // Combine SHR-SHL by constant |
531 | 78 | rules.push_back({ |
532 | | // SHL(B, SHR(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) |
533 | 78 | Builtins::SHL(B, Builtins::SHR(A, X)), |
534 | 13.6k | [=]() -> Pattern { |
535 | 13.6k | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); |
536 | | |
537 | 13.6k | if (A.d() > B.d()) |
538 | 6.83k | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); |
539 | 6.85k | else if (B.d() > A.d()) |
540 | 5.98k | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); |
541 | 868 | else |
542 | 868 | return Builtins::AND(X, mask); |
543 | 13.6k | }, solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 534 | 13.1k | [=]() -> Pattern { | 535 | 13.1k | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); | 536 | | | 537 | 13.1k | if (A.d() > B.d()) | 538 | 6.44k | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); | 539 | 6.74k | else if (B.d() > A.d()) | 540 | 5.94k | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); | 541 | 798 | else | 542 | 798 | return Builtins::AND(X, mask); | 543 | 13.1k | }, |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 534 | 506 | [=]() -> Pattern { | 535 | 506 | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); | 536 | | | 537 | 506 | if (A.d() > B.d()) | 538 | 394 | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); | 539 | 112 | else if (B.d() > A.d()) | 540 | 42 | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); | 541 | 70 | else | 542 | 70 | return Builtins::AND(X, mask); | 543 | 506 | }, |
|
544 | 13.6k | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 544 | 13.1k | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 544 | 506 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } |
|
545 | 78 | }); |
546 | | |
547 | | // Move AND with constant across SHL and SHR by constant |
548 | 78 | for (auto instr: {Instruction::SHL, Instruction::SHR}) |
549 | 156 | { |
550 | 156 | typename Builtins::PatternGeneratorInstance shiftOp{instr}; |
551 | 22.1k | auto replacement = [=]() -> Pattern { |
552 | 22.1k | Word mask = |
553 | 22.1k | instr == Instruction::SHL ? |
554 | 14.5k | shlWorkaround(A.d(), unsigned(B.d())) : |
555 | 22.1k | A.d() >> unsigned(B.d()); |
556 | 22.1k | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); |
557 | 22.1k | }; solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 551 | 21.0k | auto replacement = [=]() -> Pattern { | 552 | 21.0k | Word mask = | 553 | 21.0k | instr == Instruction::SHL ? | 554 | 13.8k | shlWorkaround(A.d(), unsigned(B.d())) : | 555 | 21.0k | A.d() >> unsigned(B.d()); | 556 | 21.0k | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); | 557 | 21.0k | }; |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 551 | 1.07k | auto replacement = [=]() -> Pattern { | 552 | 1.07k | Word mask = | 553 | 1.07k | instr == Instruction::SHL ? | 554 | 714 | shlWorkaround(A.d(), unsigned(B.d())) : | 555 | 1.07k | A.d() >> unsigned(B.d()); | 556 | 1.07k | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); | 557 | 1.07k | }; |
|
558 | 156 | rules.push_back({ |
559 | | // SH[L/R](B, AND(X, A)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) |
560 | 156 | shiftOp(B, Builtins::AND(X, A)), |
561 | 156 | replacement, |
562 | 20.7k | [=] { return B.d() < Pattern::WordSize; }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#12}::operator()() constLine | Count | Source | 562 | 19.8k | [=] { return B.d() < Pattern::WordSize; } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#12}::operator()() constLine | Count | Source | 562 | 909 | [=] { return B.d() < Pattern::WordSize; } |
|
563 | 156 | }); |
564 | 156 | rules.push_back({ |
565 | | // SH[L/R](B, AND(A, X)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) |
566 | 156 | shiftOp(B, Builtins::AND(A, X)), |
567 | 156 | replacement, |
568 | 1.44k | [=] { return B.d() < Pattern::WordSize; }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#13}::operator()() constLine | Count | Source | 568 | 1.28k | [=] { return B.d() < Pattern::WordSize; } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#13}::operator()() constLine | Count | Source | 568 | 161 | [=] { return B.d() < Pattern::WordSize; } |
|
569 | 156 | }); |
570 | 156 | } |
571 | | |
572 | | // Combine alternating AND/OR/AND with constant, |
573 | | // AND(OR(AND(X, A), Y), B) -> OR(AND(X, A & B), AND(Y, B)) |
574 | | // Many versions due to commutativity. |
575 | 78 | for (auto const& inner: {Builtins::AND(X, A), Builtins::AND(A, X)}) |
576 | 156 | for (auto const& second: {Builtins::OR(inner, Y), Builtins::OR(Y, inner)}) |
577 | 312 | { |
578 | | // We might swap X and Y but this is not an issue anymore. |
579 | 312 | rules.push_back({ |
580 | 312 | Builtins::AND(second, B), |
581 | 2.71k | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 581 | 2.55k | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#14}::operator()() constLine | Count | Source | 581 | 153 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } |
|
582 | 312 | }); |
583 | 312 | rules.push_back({ |
584 | 312 | Builtins::AND(B, second), |
585 | 3.24k | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#15}::operator()() constLine | Count | Source | 585 | 2.23k | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#15}::operator()() constLine | Count | Source | 585 | 1.00k | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } |
|
586 | 312 | }); |
587 | 312 | } |
588 | | |
589 | 78 | rules.push_back({ |
590 | | // MUL(X, SHL(Y, 1)) -> SHL(Y, X) |
591 | 78 | Builtins::MUL(X, Builtins::SHL(Y, Word(1))), |
592 | 78 | [=]() -> Pattern { |
593 | 76 | return Builtins::SHL(Y, X); |
594 | 76 | } solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 592 | 67 | [=]() -> Pattern { | 593 | 67 | return Builtins::SHL(Y, X); | 594 | 67 | } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#16}::operator()() constLine | Count | Source | 592 | 9 | [=]() -> Pattern { | 593 | 9 | return Builtins::SHL(Y, X); | 594 | 9 | } |
|
595 | 78 | }); |
596 | 78 | rules.push_back({ |
597 | | // MUL(SHL(X, 1), Y) -> SHL(X, Y) |
598 | 78 | Builtins::MUL(Builtins::SHL(X, Word(1)), Y), |
599 | 89 | [=]() -> Pattern { |
600 | 89 | return Builtins::SHL(X, Y); |
601 | 89 | } solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#17}::operator()() constLine | Count | Source | 599 | 89 | [=]() -> Pattern { | 600 | 89 | return Builtins::SHL(X, Y); | 601 | 89 | } |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#17}::operator()() const |
602 | 78 | }); |
603 | | |
604 | 78 | rules.push_back({ |
605 | | // DIV(X, SHL(Y, 1)) -> SHR(Y, X) |
606 | 78 | Builtins::DIV(X, Builtins::SHL(Y, Word(1))), |
607 | 78 | [=]() -> Pattern { |
608 | 43 | return Builtins::SHR(Y, X); |
609 | 43 | } solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#18}::operator()() constLine | Count | Source | 607 | 43 | [=]() -> Pattern { | 608 | 43 | return Builtins::SHR(Y, X); | 609 | 43 | } |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#18}::operator()() const |
610 | 78 | }); |
611 | | |
612 | 46.5k | std::function<bool()> feasibilityFunction = [=]() { |
613 | 46.5k | if (B.d() > Pattern::WordSize) |
614 | 0 | return false; |
615 | 46.5k | unsigned bAsUint = static_cast<unsigned>(B.d()); |
616 | 46.5k | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); |
617 | 46.5k | }; solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#19}::operator()() constLine | Count | Source | 612 | 45.0k | std::function<bool()> feasibilityFunction = [=]() { | 613 | 45.0k | if (B.d() > Pattern::WordSize) | 614 | 0 | return false; | 615 | 45.0k | unsigned bAsUint = static_cast<unsigned>(B.d()); | 616 | 45.0k | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); | 617 | 45.0k | }; |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#19}::operator()() constLine | Count | Source | 612 | 1.44k | std::function<bool()> feasibilityFunction = [=]() { | 613 | 1.44k | if (B.d() > Pattern::WordSize) | 614 | 0 | return false; | 615 | 1.44k | unsigned bAsUint = static_cast<unsigned>(B.d()); | 616 | 1.44k | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); | 617 | 1.44k | }; |
|
618 | | |
619 | 78 | rules.push_back({ |
620 | | // AND(A, SHR(B, X)) -> A & ((2^256-1) >> B) == ((2^256-1) >> B) |
621 | 78 | Builtins::AND(A, Builtins::SHR(B, X)), |
622 | 78 | [=]() -> Pattern { return Builtins::SHR(B, X); },solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#20}::operator()() constLine | Count | Source | 622 | 45 | [=]() -> Pattern { return Builtins::SHR(B, X); }, |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#20}::operator()() constLine | Count | Source | 622 | 2 | [=]() -> Pattern { return Builtins::SHR(B, X); }, |
|
623 | 78 | feasibilityFunction |
624 | 78 | }); |
625 | | |
626 | 78 | rules.push_back({ |
627 | | // AND(SHR(B, X), A) -> ((2^256-1) >> B) & A == ((2^256-1) >> B) |
628 | 78 | Builtins::AND(Builtins::SHR(B, X), A), |
629 | 1.05k | [=]() -> Pattern { return Builtins::SHR(B, X); },solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#21}::operator()() constLine | Count | Source | 629 | 1.01k | [=]() -> Pattern { return Builtins::SHR(B, X); }, |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#21}::operator()() constLine | Count | Source | 629 | 37 | [=]() -> Pattern { return Builtins::SHR(B, X); }, |
|
630 | 78 | feasibilityFunction |
631 | 78 | }); |
632 | | |
633 | 78 | rules.push_back({ |
634 | | // AND(SHL(Z, X), SHL(Z, Y)) -> SHL(Z, AND(X, Y)) |
635 | 78 | Builtins::AND(Builtins::SHL(Z, X), Builtins::SHL(Z, Y)), |
636 | 1.09k | [=]() -> Pattern { return Builtins::SHL(Z, Builtins::AND(X, Y)); }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#22}::operator()() constLine | Count | Source | 636 | 1.09k | [=]() -> Pattern { return Builtins::SHL(Z, Builtins::AND(X, Y)); } |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#22}::operator()() const |
637 | 78 | }); |
638 | | |
639 | 78 | rules.push_back({ |
640 | 78 | Builtins::BYTE(A, Builtins::SHL(B, X)), |
641 | 84 | [=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); },solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#23}::operator()() constLine | Count | Source | 641 | 75 | [=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); }, |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#23}::operator()() constLine | Count | Source | 641 | 9 | [=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); }, |
|
642 | 640 | [=] { return B.d() % 8 == 0 && A.d() <= 32 && B.d() <= 256; }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#24}::operator()() constLine | Count | Source | 642 | 615 | [=] { return B.d() % 8 == 0 && A.d() <= 32 && B.d() <= 256; } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#24}::operator()() constLine | Count | Source | 642 | 25 | [=] { return B.d() % 8 == 0 && A.d() <= 32 && B.d() <= 256; } |
|
643 | 78 | }); |
644 | | |
645 | 78 | rules.push_back({ |
646 | 78 | Builtins::BYTE(A, Builtins::SHR(B, X)), |
647 | 379 | [=]() -> Pattern { return Word(0); },solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#25}::operator()() constLine | Count | Source | 647 | 379 | [=]() -> Pattern { return Word(0); }, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#25}::operator()() const |
648 | 4.48k | [=] { return A.d() < B.d() / 8; }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#26}::operator()() constLine | Count | Source | 648 | 4.48k | [=] { return A.d() < B.d() / 8; } |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#26}::operator()() const |
649 | 78 | }); |
650 | | |
651 | 78 | rules.push_back({ |
652 | 78 | Builtins::BYTE(A, Builtins::SHR(B, X)), |
653 | 234 | [=]() -> Pattern { return Builtins::BYTE(A.d() - B.d() / 8, X); },solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#27}::operator()() constLine | Count | Source | 653 | 234 | [=]() -> Pattern { return Builtins::BYTE(A.d() - B.d() / 8, X); }, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#27}::operator()() const |
654 | 4.10k | [=] { |
655 | 4.10k | return B.d() % 8 == 0 && A.d() < Pattern::WordSize / 8 && B.d() <= Pattern::WordSize && A.d() >= B.d() / 8; |
656 | 4.10k | } solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#28}::operator()() constLine | Count | Source | 654 | 4.10k | [=] { | 655 | 4.10k | return B.d() % 8 == 0 && A.d() < Pattern::WordSize / 8 && B.d() <= Pattern::WordSize && A.d() >= B.d() / 8; | 656 | 4.10k | } |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#28}::operator()() const |
657 | 78 | }); |
658 | | |
659 | 78 | rules.push_back({ |
660 | 78 | Builtins::SHL(A, Builtins::SIGNEXTEND(B, X)), |
661 | 490 | [=]() -> Pattern { return Builtins::SIGNEXTEND((A.d() >> 3) + B.d(), Builtins::SHL(A, X)); },solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#29}::operator()() constLine | Count | Source | 661 | 237 | [=]() -> Pattern { return Builtins::SIGNEXTEND((A.d() >> 3) + B.d(), Builtins::SHL(A, X)); }, |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#29}::operator()() constLine | Count | Source | 661 | 253 | [=]() -> Pattern { return Builtins::SIGNEXTEND((A.d() >> 3) + B.d(), Builtins::SHL(A, X)); }, |
|
662 | 1.99k | [=] { return (A.d() & 7) == 0 && A.d() <= Pattern::WordSize && B.d() <= Pattern::WordSize / 8; }solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#30}::operator()() constLine | Count | Source | 662 | 1.58k | [=] { return (A.d() & 7) == 0 && A.d() <= Pattern::WordSize && B.d() <= Pattern::WordSize / 8; } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#30}::operator()() constLine | Count | Source | 662 | 402 | [=] { return (A.d() & 7) == 0 && A.d() <= Pattern::WordSize && B.d() <= Pattern::WordSize / 8; } |
|
663 | 78 | }); |
664 | | |
665 | 78 | rules.push_back({ |
666 | 78 | Builtins::SIGNEXTEND(A, Builtins::SHR(B, X)), |
667 | 78 | [=]() -> Pattern { return Builtins::SAR(B, X); },solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#31}::operator()() constLine | Count | Source | 667 | 35 | [=]() -> Pattern { return Builtins::SAR(B, X); }, |
Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#31}::operator()() const |
668 | 1.46k | [=] { |
669 | 1.46k | return |
670 | 1.46k | B.d() % 8 == 0 && |
671 | 444 | B.d() <= Pattern::WordSize && |
672 | 444 | A.d() <= Pattern::WordSize && |
673 | 444 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; |
674 | 1.46k | } solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#32}::operator()() constLine | Count | Source | 668 | 1.44k | [=] { | 669 | 1.44k | return | 670 | 1.44k | B.d() % 8 == 0 && | 671 | 433 | B.d() <= Pattern::WordSize && | 672 | 433 | A.d() <= Pattern::WordSize && | 673 | 433 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; | 674 | 1.44k | } |
solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#32}::operator()() constLine | Count | Source | 668 | 21 | [=] { | 669 | 21 | return | 670 | 21 | B.d() % 8 == 0 && | 671 | 11 | B.d() <= Pattern::WordSize && | 672 | 11 | A.d() <= Pattern::WordSize && | 673 | 11 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; | 674 | 21 | } |
|
675 | 78 | }); |
676 | | |
677 | 78 | return rules; |
678 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 446 | 75 | { | 447 | 75 | using Word = typename Pattern::Word; | 448 | 75 | using Builtins = typename Pattern::Builtins; | 449 | | | 450 | 75 | std::vector<SimplificationRule<Pattern>> rules; | 451 | | // Associative operations | 452 | 75 | for (auto&& instrAndFunc: std::vector<std::pair<Instruction, std::function<Word(Word, Word)>>>{ | 453 | 75 | {Instruction::ADD, std::plus<Word>()}, | 454 | 75 | {Instruction::MUL, std::multiplies<Word>()}, | 455 | 75 | {Instruction::AND, std::bit_and<Word>()}, | 456 | 75 | {Instruction::OR, std::bit_or<Word>()}, | 457 | 75 | {Instruction::XOR, std::bit_xor<Word>()} | 458 | 75 | }) | 459 | 375 | { | 460 | 375 | typename Builtins::PatternGeneratorInstance op{instrAndFunc.first}; | 461 | 375 | std::function<Word(Word, Word)> fun = instrAndFunc.second; | 462 | | // Moving constants to the outside, order matters here - we first add rules | 463 | | // for constants and then for non-constants. | 464 | | // xa can be (X, A) or (A, X) | 465 | 375 | for (auto const& opXA: {op(X, A), op(A, X)}) | 466 | 750 | { | 467 | 750 | rules += std::vector<SimplificationRule<Pattern>>{{ | 468 | | // (X+A)+B -> X+(A+B) | 469 | 750 | op(opXA, B), | 470 | 750 | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } | 471 | 750 | }, { | 472 | | // (X+A)+Y -> (X+Y)+A | 473 | 750 | op(opXA, Y), | 474 | 750 | [=]() -> Pattern { return op(op(X, Y), A); } | 475 | 750 | }, { | 476 | | // B+(X+A) -> X+(A+B) | 477 | 750 | op(B, opXA), | 478 | 750 | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } | 479 | 750 | }, { | 480 | | // Y+(X+A) -> (Y+X)+A | 481 | 750 | op(Y, opXA), | 482 | 750 | [=]() -> Pattern { return op(op(Y, X), A); } | 483 | 750 | }}; | 484 | 750 | } | 485 | 375 | } | 486 | | | 487 | | // Combine two SHL by constant | 488 | 75 | rules.push_back({ | 489 | | // SHL(B, SHL(A, X)) -> SHL(min(A+B, 256), X) | 490 | 75 | Builtins::SHL(B, Builtins::SHL(A, X)), | 491 | 75 | [=]() -> Pattern { | 492 | 75 | bigint sum = bigint(A.d()) + B.d(); | 493 | 75 | if (sum >= Pattern::WordSize) | 494 | 75 | return Builtins::AND(X, Word(0)); | 495 | 75 | else | 496 | 75 | return Builtins::SHL(Word(sum), X); | 497 | 75 | } | 498 | 75 | }); | 499 | | | 500 | | // Combine two SHR by constant | 501 | 75 | rules.push_back({ | 502 | | // SHR(B, SHR(A, X)) -> SHR(min(A+B, 256), X) | 503 | 75 | Builtins::SHR(B, Builtins::SHR(A, X)), | 504 | 75 | [=]() -> Pattern { | 505 | 75 | bigint sum = bigint(A.d()) + B.d(); | 506 | 75 | if (sum >= Pattern::WordSize) | 507 | 75 | return Builtins::AND(X, Word(0)); | 508 | 75 | else | 509 | 75 | return Builtins::SHR(Word(sum), X); | 510 | 75 | } | 511 | 75 | }); | 512 | | | 513 | | // Combine SHL-SHR by constant | 514 | 75 | rules.push_back({ | 515 | | // SHR(B, SHL(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) | 516 | 75 | Builtins::SHR(B, Builtins::SHL(A, X)), | 517 | 75 | [=]() -> Pattern { | 518 | 75 | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); | 519 | | | 520 | 75 | if (A.d() > B.d()) | 521 | 75 | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); | 522 | 75 | else if (B.d() > A.d()) | 523 | 75 | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); | 524 | 75 | else | 525 | 75 | return Builtins::AND(X, mask); | 526 | 75 | }, | 527 | 75 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } | 528 | 75 | }); | 529 | | | 530 | | // Combine SHR-SHL by constant | 531 | 75 | rules.push_back({ | 532 | | // SHL(B, SHR(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) | 533 | 75 | Builtins::SHL(B, Builtins::SHR(A, X)), | 534 | 75 | [=]() -> Pattern { | 535 | 75 | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); | 536 | | | 537 | 75 | if (A.d() > B.d()) | 538 | 75 | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); | 539 | 75 | else if (B.d() > A.d()) | 540 | 75 | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); | 541 | 75 | else | 542 | 75 | return Builtins::AND(X, mask); | 543 | 75 | }, | 544 | 75 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } | 545 | 75 | }); | 546 | | | 547 | | // Move AND with constant across SHL and SHR by constant | 548 | 75 | for (auto instr: {Instruction::SHL, Instruction::SHR}) | 549 | 150 | { | 550 | 150 | typename Builtins::PatternGeneratorInstance shiftOp{instr}; | 551 | 150 | auto replacement = [=]() -> Pattern { | 552 | 150 | Word mask = | 553 | 150 | instr == Instruction::SHL ? | 554 | 150 | shlWorkaround(A.d(), unsigned(B.d())) : | 555 | 150 | A.d() >> unsigned(B.d()); | 556 | 150 | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); | 557 | 150 | }; | 558 | 150 | rules.push_back({ | 559 | | // SH[L/R](B, AND(X, A)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) | 560 | 150 | shiftOp(B, Builtins::AND(X, A)), | 561 | 150 | replacement, | 562 | 150 | [=] { return B.d() < Pattern::WordSize; } | 563 | 150 | }); | 564 | 150 | rules.push_back({ | 565 | | // SH[L/R](B, AND(A, X)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) | 566 | 150 | shiftOp(B, Builtins::AND(A, X)), | 567 | 150 | replacement, | 568 | 150 | [=] { return B.d() < Pattern::WordSize; } | 569 | 150 | }); | 570 | 150 | } | 571 | | | 572 | | // Combine alternating AND/OR/AND with constant, | 573 | | // AND(OR(AND(X, A), Y), B) -> OR(AND(X, A & B), AND(Y, B)) | 574 | | // Many versions due to commutativity. | 575 | 75 | for (auto const& inner: {Builtins::AND(X, A), Builtins::AND(A, X)}) | 576 | 150 | for (auto const& second: {Builtins::OR(inner, Y), Builtins::OR(Y, inner)}) | 577 | 300 | { | 578 | | // We might swap X and Y but this is not an issue anymore. | 579 | 300 | rules.push_back({ | 580 | 300 | Builtins::AND(second, B), | 581 | 300 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } | 582 | 300 | }); | 583 | 300 | rules.push_back({ | 584 | 300 | Builtins::AND(B, second), | 585 | 300 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } | 586 | 300 | }); | 587 | 300 | } | 588 | | | 589 | 75 | rules.push_back({ | 590 | | // MUL(X, SHL(Y, 1)) -> SHL(Y, X) | 591 | 75 | Builtins::MUL(X, Builtins::SHL(Y, Word(1))), | 592 | 75 | [=]() -> Pattern { | 593 | 75 | return Builtins::SHL(Y, X); | 594 | 75 | } | 595 | 75 | }); | 596 | 75 | rules.push_back({ | 597 | | // MUL(SHL(X, 1), Y) -> SHL(X, Y) | 598 | 75 | Builtins::MUL(Builtins::SHL(X, Word(1)), Y), | 599 | 75 | [=]() -> Pattern { | 600 | 75 | return Builtins::SHL(X, Y); | 601 | 75 | } | 602 | 75 | }); | 603 | | | 604 | 75 | rules.push_back({ | 605 | | // DIV(X, SHL(Y, 1)) -> SHR(Y, X) | 606 | 75 | Builtins::DIV(X, Builtins::SHL(Y, Word(1))), | 607 | 75 | [=]() -> Pattern { | 608 | 75 | return Builtins::SHR(Y, X); | 609 | 75 | } | 610 | 75 | }); | 611 | | | 612 | 75 | std::function<bool()> feasibilityFunction = [=]() { | 613 | 75 | if (B.d() > Pattern::WordSize) | 614 | 75 | return false; | 615 | 75 | unsigned bAsUint = static_cast<unsigned>(B.d()); | 616 | 75 | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); | 617 | 75 | }; | 618 | | | 619 | 75 | rules.push_back({ | 620 | | // AND(A, SHR(B, X)) -> A & ((2^256-1) >> B) == ((2^256-1) >> B) | 621 | 75 | Builtins::AND(A, Builtins::SHR(B, X)), | 622 | 75 | [=]() -> Pattern { return Builtins::SHR(B, X); }, | 623 | 75 | feasibilityFunction | 624 | 75 | }); | 625 | | | 626 | 75 | rules.push_back({ | 627 | | // AND(SHR(B, X), A) -> ((2^256-1) >> B) & A == ((2^256-1) >> B) | 628 | 75 | Builtins::AND(Builtins::SHR(B, X), A), | 629 | 75 | [=]() -> Pattern { return Builtins::SHR(B, X); }, | 630 | 75 | feasibilityFunction | 631 | 75 | }); | 632 | | | 633 | 75 | rules.push_back({ | 634 | | // AND(SHL(Z, X), SHL(Z, Y)) -> SHL(Z, AND(X, Y)) | 635 | 75 | Builtins::AND(Builtins::SHL(Z, X), Builtins::SHL(Z, Y)), | 636 | 75 | [=]() -> Pattern { return Builtins::SHL(Z, Builtins::AND(X, Y)); } | 637 | 75 | }); | 638 | | | 639 | 75 | rules.push_back({ | 640 | 75 | Builtins::BYTE(A, Builtins::SHL(B, X)), | 641 | 75 | [=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); }, | 642 | 75 | [=] { return B.d() % 8 == 0 && A.d() <= 32 && B.d() <= 256; } | 643 | 75 | }); | 644 | | | 645 | 75 | rules.push_back({ | 646 | 75 | Builtins::BYTE(A, Builtins::SHR(B, X)), | 647 | 75 | [=]() -> Pattern { return Word(0); }, | 648 | 75 | [=] { return A.d() < B.d() / 8; } | 649 | 75 | }); | 650 | | | 651 | 75 | rules.push_back({ | 652 | 75 | Builtins::BYTE(A, Builtins::SHR(B, X)), | 653 | 75 | [=]() -> Pattern { return Builtins::BYTE(A.d() - B.d() / 8, X); }, | 654 | 75 | [=] { | 655 | 75 | return B.d() % 8 == 0 && A.d() < Pattern::WordSize / 8 && B.d() <= Pattern::WordSize && A.d() >= B.d() / 8; | 656 | 75 | } | 657 | 75 | }); | 658 | | | 659 | 75 | rules.push_back({ | 660 | 75 | Builtins::SHL(A, Builtins::SIGNEXTEND(B, X)), | 661 | 75 | [=]() -> Pattern { return Builtins::SIGNEXTEND((A.d() >> 3) + B.d(), Builtins::SHL(A, X)); }, | 662 | 75 | [=] { return (A.d() & 7) == 0 && A.d() <= Pattern::WordSize && B.d() <= Pattern::WordSize / 8; } | 663 | 75 | }); | 664 | | | 665 | 75 | rules.push_back({ | 666 | 75 | Builtins::SIGNEXTEND(A, Builtins::SHR(B, X)), | 667 | 75 | [=]() -> Pattern { return Builtins::SAR(B, X); }, | 668 | 75 | [=] { | 669 | 75 | return | 670 | 75 | B.d() % 8 == 0 && | 671 | 75 | B.d() <= Pattern::WordSize && | 672 | 75 | A.d() <= Pattern::WordSize && | 673 | 75 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; | 674 | 75 | } | 675 | 75 | }); | 676 | | | 677 | 75 | return rules; | 678 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 446 | 3 | { | 447 | 3 | using Word = typename Pattern::Word; | 448 | 3 | using Builtins = typename Pattern::Builtins; | 449 | | | 450 | 3 | std::vector<SimplificationRule<Pattern>> rules; | 451 | | // Associative operations | 452 | 3 | for (auto&& instrAndFunc: std::vector<std::pair<Instruction, std::function<Word(Word, Word)>>>{ | 453 | 3 | {Instruction::ADD, std::plus<Word>()}, | 454 | 3 | {Instruction::MUL, std::multiplies<Word>()}, | 455 | 3 | {Instruction::AND, std::bit_and<Word>()}, | 456 | 3 | {Instruction::OR, std::bit_or<Word>()}, | 457 | 3 | {Instruction::XOR, std::bit_xor<Word>()} | 458 | 3 | }) | 459 | 15 | { | 460 | 15 | typename Builtins::PatternGeneratorInstance op{instrAndFunc.first}; | 461 | 15 | std::function<Word(Word, Word)> fun = instrAndFunc.second; | 462 | | // Moving constants to the outside, order matters here - we first add rules | 463 | | // for constants and then for non-constants. | 464 | | // xa can be (X, A) or (A, X) | 465 | 15 | for (auto const& opXA: {op(X, A), op(A, X)}) | 466 | 30 | { | 467 | 30 | rules += std::vector<SimplificationRule<Pattern>>{{ | 468 | | // (X+A)+B -> X+(A+B) | 469 | 30 | op(opXA, B), | 470 | 30 | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } | 471 | 30 | }, { | 472 | | // (X+A)+Y -> (X+Y)+A | 473 | 30 | op(opXA, Y), | 474 | 30 | [=]() -> Pattern { return op(op(X, Y), A); } | 475 | 30 | }, { | 476 | | // B+(X+A) -> X+(A+B) | 477 | 30 | op(B, opXA), | 478 | 30 | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } | 479 | 30 | }, { | 480 | | // Y+(X+A) -> (Y+X)+A | 481 | 30 | op(Y, opXA), | 482 | 30 | [=]() -> Pattern { return op(op(Y, X), A); } | 483 | 30 | }}; | 484 | 30 | } | 485 | 15 | } | 486 | | | 487 | | // Combine two SHL by constant | 488 | 3 | rules.push_back({ | 489 | | // SHL(B, SHL(A, X)) -> SHL(min(A+B, 256), X) | 490 | 3 | Builtins::SHL(B, Builtins::SHL(A, X)), | 491 | 3 | [=]() -> Pattern { | 492 | 3 | bigint sum = bigint(A.d()) + B.d(); | 493 | 3 | if (sum >= Pattern::WordSize) | 494 | 3 | return Builtins::AND(X, Word(0)); | 495 | 3 | else | 496 | 3 | return Builtins::SHL(Word(sum), X); | 497 | 3 | } | 498 | 3 | }); | 499 | | | 500 | | // Combine two SHR by constant | 501 | 3 | rules.push_back({ | 502 | | // SHR(B, SHR(A, X)) -> SHR(min(A+B, 256), X) | 503 | 3 | Builtins::SHR(B, Builtins::SHR(A, X)), | 504 | 3 | [=]() -> Pattern { | 505 | 3 | bigint sum = bigint(A.d()) + B.d(); | 506 | 3 | if (sum >= Pattern::WordSize) | 507 | 3 | return Builtins::AND(X, Word(0)); | 508 | 3 | else | 509 | 3 | return Builtins::SHR(Word(sum), X); | 510 | 3 | } | 511 | 3 | }); | 512 | | | 513 | | // Combine SHL-SHR by constant | 514 | 3 | rules.push_back({ | 515 | | // SHR(B, SHL(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) | 516 | 3 | Builtins::SHR(B, Builtins::SHL(A, X)), | 517 | 3 | [=]() -> Pattern { | 518 | 3 | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); | 519 | | | 520 | 3 | if (A.d() > B.d()) | 521 | 3 | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); | 522 | 3 | else if (B.d() > A.d()) | 523 | 3 | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); | 524 | 3 | else | 525 | 3 | return Builtins::AND(X, mask); | 526 | 3 | }, | 527 | 3 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } | 528 | 3 | }); | 529 | | | 530 | | // Combine SHR-SHL by constant | 531 | 3 | rules.push_back({ | 532 | | // SHL(B, SHR(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) | 533 | 3 | Builtins::SHL(B, Builtins::SHR(A, X)), | 534 | 3 | [=]() -> Pattern { | 535 | 3 | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); | 536 | | | 537 | 3 | if (A.d() > B.d()) | 538 | 3 | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); | 539 | 3 | else if (B.d() > A.d()) | 540 | 3 | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); | 541 | 3 | else | 542 | 3 | return Builtins::AND(X, mask); | 543 | 3 | }, | 544 | 3 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } | 545 | 3 | }); | 546 | | | 547 | | // Move AND with constant across SHL and SHR by constant | 548 | 3 | for (auto instr: {Instruction::SHL, Instruction::SHR}) | 549 | 6 | { | 550 | 6 | typename Builtins::PatternGeneratorInstance shiftOp{instr}; | 551 | 6 | auto replacement = [=]() -> Pattern { | 552 | 6 | Word mask = | 553 | 6 | instr == Instruction::SHL ? | 554 | 6 | shlWorkaround(A.d(), unsigned(B.d())) : | 555 | 6 | A.d() >> unsigned(B.d()); | 556 | 6 | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); | 557 | 6 | }; | 558 | 6 | rules.push_back({ | 559 | | // SH[L/R](B, AND(X, A)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) | 560 | 6 | shiftOp(B, Builtins::AND(X, A)), | 561 | 6 | replacement, | 562 | 6 | [=] { return B.d() < Pattern::WordSize; } | 563 | 6 | }); | 564 | 6 | rules.push_back({ | 565 | | // SH[L/R](B, AND(A, X)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) | 566 | 6 | shiftOp(B, Builtins::AND(A, X)), | 567 | 6 | replacement, | 568 | 6 | [=] { return B.d() < Pattern::WordSize; } | 569 | 6 | }); | 570 | 6 | } | 571 | | | 572 | | // Combine alternating AND/OR/AND with constant, | 573 | | // AND(OR(AND(X, A), Y), B) -> OR(AND(X, A & B), AND(Y, B)) | 574 | | // Many versions due to commutativity. | 575 | 3 | for (auto const& inner: {Builtins::AND(X, A), Builtins::AND(A, X)}) | 576 | 6 | for (auto const& second: {Builtins::OR(inner, Y), Builtins::OR(Y, inner)}) | 577 | 12 | { | 578 | | // We might swap X and Y but this is not an issue anymore. | 579 | 12 | rules.push_back({ | 580 | 12 | Builtins::AND(second, B), | 581 | 12 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } | 582 | 12 | }); | 583 | 12 | rules.push_back({ | 584 | 12 | Builtins::AND(B, second), | 585 | 12 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } | 586 | 12 | }); | 587 | 12 | } | 588 | | | 589 | 3 | rules.push_back({ | 590 | | // MUL(X, SHL(Y, 1)) -> SHL(Y, X) | 591 | 3 | Builtins::MUL(X, Builtins::SHL(Y, Word(1))), | 592 | 3 | [=]() -> Pattern { | 593 | 3 | return Builtins::SHL(Y, X); | 594 | 3 | } | 595 | 3 | }); | 596 | 3 | rules.push_back({ | 597 | | // MUL(SHL(X, 1), Y) -> SHL(X, Y) | 598 | 3 | Builtins::MUL(Builtins::SHL(X, Word(1)), Y), | 599 | 3 | [=]() -> Pattern { | 600 | 3 | return Builtins::SHL(X, Y); | 601 | 3 | } | 602 | 3 | }); | 603 | | | 604 | 3 | rules.push_back({ | 605 | | // DIV(X, SHL(Y, 1)) -> SHR(Y, X) | 606 | 3 | Builtins::DIV(X, Builtins::SHL(Y, Word(1))), | 607 | 3 | [=]() -> Pattern { | 608 | 3 | return Builtins::SHR(Y, X); | 609 | 3 | } | 610 | 3 | }); | 611 | | | 612 | 3 | std::function<bool()> feasibilityFunction = [=]() { | 613 | 3 | if (B.d() > Pattern::WordSize) | 614 | 3 | return false; | 615 | 3 | unsigned bAsUint = static_cast<unsigned>(B.d()); | 616 | 3 | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); | 617 | 3 | }; | 618 | | | 619 | 3 | rules.push_back({ | 620 | | // AND(A, SHR(B, X)) -> A & ((2^256-1) >> B) == ((2^256-1) >> B) | 621 | 3 | Builtins::AND(A, Builtins::SHR(B, X)), | 622 | 3 | [=]() -> Pattern { return Builtins::SHR(B, X); }, | 623 | 3 | feasibilityFunction | 624 | 3 | }); | 625 | | | 626 | 3 | rules.push_back({ | 627 | | // AND(SHR(B, X), A) -> ((2^256-1) >> B) & A == ((2^256-1) >> B) | 628 | 3 | Builtins::AND(Builtins::SHR(B, X), A), | 629 | 3 | [=]() -> Pattern { return Builtins::SHR(B, X); }, | 630 | 3 | feasibilityFunction | 631 | 3 | }); | 632 | | | 633 | 3 | rules.push_back({ | 634 | | // AND(SHL(Z, X), SHL(Z, Y)) -> SHL(Z, AND(X, Y)) | 635 | 3 | Builtins::AND(Builtins::SHL(Z, X), Builtins::SHL(Z, Y)), | 636 | 3 | [=]() -> Pattern { return Builtins::SHL(Z, Builtins::AND(X, Y)); } | 637 | 3 | }); | 638 | | | 639 | 3 | rules.push_back({ | 640 | 3 | Builtins::BYTE(A, Builtins::SHL(B, X)), | 641 | 3 | [=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); }, | 642 | 3 | [=] { return B.d() % 8 == 0 && A.d() <= 32 && B.d() <= 256; } | 643 | 3 | }); | 644 | | | 645 | 3 | rules.push_back({ | 646 | 3 | Builtins::BYTE(A, Builtins::SHR(B, X)), | 647 | 3 | [=]() -> Pattern { return Word(0); }, | 648 | 3 | [=] { return A.d() < B.d() / 8; } | 649 | 3 | }); | 650 | | | 651 | 3 | rules.push_back({ | 652 | 3 | Builtins::BYTE(A, Builtins::SHR(B, X)), | 653 | 3 | [=]() -> Pattern { return Builtins::BYTE(A.d() - B.d() / 8, X); }, | 654 | 3 | [=] { | 655 | 3 | return B.d() % 8 == 0 && A.d() < Pattern::WordSize / 8 && B.d() <= Pattern::WordSize && A.d() >= B.d() / 8; | 656 | 3 | } | 657 | 3 | }); | 658 | | | 659 | 3 | rules.push_back({ | 660 | 3 | Builtins::SHL(A, Builtins::SIGNEXTEND(B, X)), | 661 | 3 | [=]() -> Pattern { return Builtins::SIGNEXTEND((A.d() >> 3) + B.d(), Builtins::SHL(A, X)); }, | 662 | 3 | [=] { return (A.d() & 7) == 0 && A.d() <= Pattern::WordSize && B.d() <= Pattern::WordSize / 8; } | 663 | 3 | }); | 664 | | | 665 | 3 | rules.push_back({ | 666 | 3 | Builtins::SIGNEXTEND(A, Builtins::SHR(B, X)), | 667 | 3 | [=]() -> Pattern { return Builtins::SAR(B, X); }, | 668 | 3 | [=] { | 669 | 3 | return | 670 | 3 | B.d() % 8 == 0 && | 671 | 3 | B.d() <= Pattern::WordSize && | 672 | 3 | A.d() <= Pattern::WordSize && | 673 | 3 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; | 674 | 3 | } | 675 | 3 | }); | 676 | | | 677 | 3 | return rules; | 678 | 3 | } |
|
679 | | |
680 | | template <class Pattern> |
681 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart8( |
682 | | Pattern A, |
683 | | Pattern, |
684 | | Pattern, |
685 | | Pattern X, |
686 | | Pattern Y |
687 | | ) |
688 | 78 | { |
689 | 78 | using Builtins = typename Pattern::Builtins; |
690 | 78 | std::vector<SimplificationRule<Pattern>> rules; |
691 | | |
692 | | // move constants across subtractions |
693 | 78 | rules += std::vector<SimplificationRule<Pattern>>{ |
694 | 78 | { |
695 | | // X - A -> X + (-A) |
696 | 78 | Builtins::SUB(X, A), |
697 | 134k | [=]() -> Pattern { return Builtins::ADD(X, 0 - A.d()); }solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 697 | 7.90k | [=]() -> Pattern { return Builtins::ADD(X, 0 - A.d()); } |
solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 697 | 126k | [=]() -> Pattern { return Builtins::ADD(X, 0 - A.d()); } |
|
698 | 78 | }, { |
699 | | // (X + A) - Y -> (X - Y) + A |
700 | 78 | Builtins::SUB(Builtins::ADD(X, A), Y), |
701 | 26.8k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); }solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 701 | 5.71k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } |
solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 701 | 21.1k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } |
|
702 | 78 | }, { |
703 | | // (A + X) - Y -> (X - Y) + A |
704 | 78 | Builtins::SUB(Builtins::ADD(A, X), Y), |
705 | 7.09k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); }solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 705 | 285 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } |
solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 705 | 6.80k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } |
|
706 | 78 | }, { |
707 | | // X - (Y + A) -> (X - Y) + (-A) |
708 | 78 | Builtins::SUB(X, Builtins::ADD(Y, A)), |
709 | 33.3k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); }solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 709 | 10.0k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } |
solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 709 | 23.2k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } |
|
710 | 78 | }, { |
711 | | // X - (A + Y) -> (X - Y) + (-A) |
712 | 78 | Builtins::SUB(X, Builtins::ADD(A, Y)), |
713 | 14.2k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); }solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 713 | 960 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } |
solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 713 | 13.2k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } |
|
714 | 78 | }, { |
715 | | // (X - A) - Y -> (X - Y) - A |
716 | 78 | Builtins::SUB(Builtins::SUB(X, A), Y), |
717 | 78 | [=]() -> Pattern { return Builtins::SUB(Builtins::SUB(X, Y), A); }Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() constUnexecuted instantiation: solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() const |
718 | 78 | }, { |
719 | | // (A - X) - Y -> A - (X + Y) |
720 | 78 | Builtins::SUB(Builtins::SUB(A, X), Y), |
721 | 2.09k | [=]() -> Pattern { return Builtins::SUB(A, Builtins::ADD(X, Y)); }solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 721 | 1.24k | [=]() -> Pattern { return Builtins::SUB(A, Builtins::ADD(X, Y)); } |
solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 721 | 849 | [=]() -> Pattern { return Builtins::SUB(A, Builtins::ADD(X, Y)); } |
|
722 | 78 | }, { |
723 | | // X - (Y - A) -> (X - Y) + A |
724 | 78 | Builtins::SUB(X, Builtins::SUB(Y, A)), |
725 | 78 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A.d()); }Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() constUnexecuted instantiation: solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#8}::operator()() const |
726 | 78 | }, { |
727 | | // X - (A - Y) -> (X + Y) + (-A) |
728 | 78 | Builtins::SUB(X, Builtins::SUB(A, Y)), |
729 | 5.33k | [=]() -> Pattern { return Builtins::ADD(Builtins::ADD(X, Y), 0 - A.d()); }solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 729 | 3.04k | [=]() -> Pattern { return Builtins::ADD(Builtins::ADD(X, Y), 0 - A.d()); } |
solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 729 | 2.29k | [=]() -> Pattern { return Builtins::ADD(Builtins::ADD(X, Y), 0 - A.d()); } |
|
730 | 78 | } |
731 | 78 | }; |
732 | 78 | return rules; |
733 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 688 | 75 | { | 689 | 75 | using Builtins = typename Pattern::Builtins; | 690 | 75 | std::vector<SimplificationRule<Pattern>> rules; | 691 | | | 692 | | // move constants across subtractions | 693 | 75 | rules += std::vector<SimplificationRule<Pattern>>{ | 694 | 75 | { | 695 | | // X - A -> X + (-A) | 696 | 75 | Builtins::SUB(X, A), | 697 | 75 | [=]() -> Pattern { return Builtins::ADD(X, 0 - A.d()); } | 698 | 75 | }, { | 699 | | // (X + A) - Y -> (X - Y) + A | 700 | 75 | Builtins::SUB(Builtins::ADD(X, A), Y), | 701 | 75 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } | 702 | 75 | }, { | 703 | | // (A + X) - Y -> (X - Y) + A | 704 | 75 | Builtins::SUB(Builtins::ADD(A, X), Y), | 705 | 75 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } | 706 | 75 | }, { | 707 | | // X - (Y + A) -> (X - Y) + (-A) | 708 | 75 | Builtins::SUB(X, Builtins::ADD(Y, A)), | 709 | 75 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } | 710 | 75 | }, { | 711 | | // X - (A + Y) -> (X - Y) + (-A) | 712 | 75 | Builtins::SUB(X, Builtins::ADD(A, Y)), | 713 | 75 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } | 714 | 75 | }, { | 715 | | // (X - A) - Y -> (X - Y) - A | 716 | 75 | Builtins::SUB(Builtins::SUB(X, A), Y), | 717 | 75 | [=]() -> Pattern { return Builtins::SUB(Builtins::SUB(X, Y), A); } | 718 | 75 | }, { | 719 | | // (A - X) - Y -> A - (X + Y) | 720 | 75 | Builtins::SUB(Builtins::SUB(A, X), Y), | 721 | 75 | [=]() -> Pattern { return Builtins::SUB(A, Builtins::ADD(X, Y)); } | 722 | 75 | }, { | 723 | | // X - (Y - A) -> (X - Y) + A | 724 | 75 | Builtins::SUB(X, Builtins::SUB(Y, A)), | 725 | 75 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A.d()); } | 726 | 75 | }, { | 727 | | // X - (A - Y) -> (X + Y) + (-A) | 728 | 75 | Builtins::SUB(X, Builtins::SUB(A, Y)), | 729 | 75 | [=]() -> Pattern { return Builtins::ADD(Builtins::ADD(X, Y), 0 - A.d()); } | 730 | 75 | } | 731 | 75 | }; | 732 | 75 | return rules; | 733 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleListPart8<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 688 | 3 | { | 689 | 3 | using Builtins = typename Pattern::Builtins; | 690 | 3 | std::vector<SimplificationRule<Pattern>> rules; | 691 | | | 692 | | // move constants across subtractions | 693 | 3 | rules += std::vector<SimplificationRule<Pattern>>{ | 694 | 3 | { | 695 | | // X - A -> X + (-A) | 696 | 3 | Builtins::SUB(X, A), | 697 | 3 | [=]() -> Pattern { return Builtins::ADD(X, 0 - A.d()); } | 698 | 3 | }, { | 699 | | // (X + A) - Y -> (X - Y) + A | 700 | 3 | Builtins::SUB(Builtins::ADD(X, A), Y), | 701 | 3 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } | 702 | 3 | }, { | 703 | | // (A + X) - Y -> (X - Y) + A | 704 | 3 | Builtins::SUB(Builtins::ADD(A, X), Y), | 705 | 3 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } | 706 | 3 | }, { | 707 | | // X - (Y + A) -> (X - Y) + (-A) | 708 | 3 | Builtins::SUB(X, Builtins::ADD(Y, A)), | 709 | 3 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } | 710 | 3 | }, { | 711 | | // X - (A + Y) -> (X - Y) + (-A) | 712 | 3 | Builtins::SUB(X, Builtins::ADD(A, Y)), | 713 | 3 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } | 714 | 3 | }, { | 715 | | // (X - A) - Y -> (X - Y) - A | 716 | 3 | Builtins::SUB(Builtins::SUB(X, A), Y), | 717 | 3 | [=]() -> Pattern { return Builtins::SUB(Builtins::SUB(X, Y), A); } | 718 | 3 | }, { | 719 | | // (A - X) - Y -> A - (X + Y) | 720 | 3 | Builtins::SUB(Builtins::SUB(A, X), Y), | 721 | 3 | [=]() -> Pattern { return Builtins::SUB(A, Builtins::ADD(X, Y)); } | 722 | 3 | }, { | 723 | | // X - (Y - A) -> (X - Y) + A | 724 | 3 | Builtins::SUB(X, Builtins::SUB(Y, A)), | 725 | 3 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A.d()); } | 726 | 3 | }, { | 727 | | // X - (A - Y) -> (X + Y) + (-A) | 728 | 3 | Builtins::SUB(X, Builtins::SUB(A, Y)), | 729 | 3 | [=]() -> Pattern { return Builtins::ADD(Builtins::ADD(X, Y), 0 - A.d()); } | 730 | 3 | } | 731 | 3 | }; | 732 | 3 | return rules; | 733 | 3 | } |
|
734 | | |
735 | | template<class Pattern> |
736 | | std::vector<SimplificationRule<Pattern>> evmRuleList( |
737 | | langutil::EVMVersion _evmVersion, |
738 | | Pattern A, |
739 | | Pattern, |
740 | | Pattern, |
741 | | Pattern, |
742 | | Pattern X, |
743 | | Pattern, |
744 | | Pattern |
745 | | ) |
746 | 75 | { |
747 | 75 | using Builtins = typename Pattern::Builtins; |
748 | 75 | using Word = typename Pattern::Word; |
749 | 75 | std::vector<SimplificationRule<Pattern>> rules; |
750 | | |
751 | 75 | if (_evmVersion.hasSelfBalance()) |
752 | 45 | rules.push_back({ |
753 | 45 | Builtins::BALANCE(Instruction::ADDRESS), |
754 | 118 | []() -> Pattern { return Instruction::SELFBALANCE; }solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#1}::operator()() constLine | Count | Source | 754 | 118 | []() -> Pattern { return Instruction::SELFBALANCE; } |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#1}::operator()() const |
755 | 45 | }); |
756 | | |
757 | 75 | rules.emplace_back( |
758 | 75 | Builtins::EXP(0, X), |
759 | 3.49k | [=]() -> Pattern { return Builtins::ISZERO(X); }solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#2}::operator()() constLine | Count | Source | 759 | 3.49k | [=]() -> Pattern { return Builtins::ISZERO(X); } |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#2}::operator()() const |
760 | 75 | ); |
761 | 75 | rules.emplace_back( |
762 | 75 | Builtins::EXP(1, X), |
763 | 1.83k | [=]() -> Pattern { return Word(1); }solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#3}::operator()() constLine | Count | Source | 763 | 1.83k | [=]() -> Pattern { return Word(1); } |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#3}::operator()() const |
764 | 75 | ); |
765 | 75 | if (_evmVersion.hasBitwiseShifting()) |
766 | 55 | { |
767 | 55 | rules.emplace_back( |
768 | 55 | Builtins::EXP(2, X), |
769 | 1.57k | [=]() -> Pattern { return Builtins::SHL(X, 1); }solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() constLine | Count | Source | 769 | 1.57k | [=]() -> Pattern { return Builtins::SHL(X, 1); } |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#4}::operator()() const |
770 | 55 | ); |
771 | 55 | rules.emplace_back( |
772 | 55 | Builtins::MUL(A, X), |
773 | 6.44k | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); },solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() constLine | Count | Source | 773 | 6.44k | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); }, |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() const |
774 | 52.9k | [=] { return binaryLogarithm(A.d()).has_value(); }solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() constLine | Count | Source | 774 | 52.9k | [=] { return binaryLogarithm(A.d()).has_value(); } |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() const |
775 | 55 | ); |
776 | 55 | rules.emplace_back( |
777 | 55 | Builtins::MUL(X, A), |
778 | 7.69k | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); },solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() constLine | Count | Source | 778 | 7.69k | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); }, |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() const |
779 | 64.5k | [=] { return binaryLogarithm(A.d()).has_value(); }solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() constLine | Count | Source | 779 | 64.5k | [=] { return binaryLogarithm(A.d()).has_value(); } |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#8}::operator()() const |
780 | 55 | ); |
781 | 55 | rules.emplace_back( |
782 | 55 | Builtins::DIV(X, A), |
783 | 5.38k | [=]() -> Pattern { return Builtins::SHR(u256(*binaryLogarithm(A.d())), X); },solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() constLine | Count | Source | 783 | 5.38k | [=]() -> Pattern { return Builtins::SHR(u256(*binaryLogarithm(A.d())), X); }, |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() const |
784 | 55.3k | [=] { return binaryLogarithm(A.d()).has_value(); }solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#10}::operator()() constLine | Count | Source | 784 | 55.3k | [=] { return binaryLogarithm(A.d()).has_value(); } |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#10}::operator()() const |
785 | 55 | ); |
786 | 55 | } |
787 | 75 | rules.emplace_back( |
788 | 75 | Builtins::EXP(Word(-1), X), |
789 | 75 | [=]() -> Pattern |
790 | 1.54k | { |
791 | 1.54k | return Builtins::SUB( |
792 | 1.54k | Builtins::ISZERO(Builtins::AND(X, Word(1))), |
793 | 1.54k | Builtins::AND(X, Word(1)) |
794 | 1.54k | ); |
795 | 1.54k | } solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#11}::operator()() constLine | Count | Source | 790 | 1.54k | { | 791 | 1.54k | return Builtins::SUB( | 792 | 1.54k | Builtins::ISZERO(Builtins::AND(X, Word(1))), | 793 | 1.54k | Builtins::AND(X, Word(1)) | 794 | 1.54k | ); | 795 | 1.54k | } |
Unexecuted instantiation: solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#11}::operator()() const |
796 | 75 | ); |
797 | | |
798 | 75 | return rules; |
799 | 75 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::evmRuleList<solidity::yul::Pattern>(solidity::langutil::EVMVersion, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 746 | 75 | { | 747 | 75 | using Builtins = typename Pattern::Builtins; | 748 | 75 | using Word = typename Pattern::Word; | 749 | 75 | std::vector<SimplificationRule<Pattern>> rules; | 750 | | | 751 | 75 | if (_evmVersion.hasSelfBalance()) | 752 | 45 | rules.push_back({ | 753 | 45 | Builtins::BALANCE(Instruction::ADDRESS), | 754 | 45 | []() -> Pattern { return Instruction::SELFBALANCE; } | 755 | 45 | }); | 756 | | | 757 | 75 | rules.emplace_back( | 758 | 75 | Builtins::EXP(0, X), | 759 | 75 | [=]() -> Pattern { return Builtins::ISZERO(X); } | 760 | 75 | ); | 761 | 75 | rules.emplace_back( | 762 | 75 | Builtins::EXP(1, X), | 763 | 75 | [=]() -> Pattern { return Word(1); } | 764 | 75 | ); | 765 | 75 | if (_evmVersion.hasBitwiseShifting()) | 766 | 55 | { | 767 | 55 | rules.emplace_back( | 768 | 55 | Builtins::EXP(2, X), | 769 | 55 | [=]() -> Pattern { return Builtins::SHL(X, 1); } | 770 | 55 | ); | 771 | 55 | rules.emplace_back( | 772 | 55 | Builtins::MUL(A, X), | 773 | 55 | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); }, | 774 | 55 | [=] { return binaryLogarithm(A.d()).has_value(); } | 775 | 55 | ); | 776 | 55 | rules.emplace_back( | 777 | 55 | Builtins::MUL(X, A), | 778 | 55 | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); }, | 779 | 55 | [=] { return binaryLogarithm(A.d()).has_value(); } | 780 | 55 | ); | 781 | 55 | rules.emplace_back( | 782 | 55 | Builtins::DIV(X, A), | 783 | 55 | [=]() -> Pattern { return Builtins::SHR(u256(*binaryLogarithm(A.d())), X); }, | 784 | 55 | [=] { return binaryLogarithm(A.d()).has_value(); } | 785 | 55 | ); | 786 | 55 | } | 787 | 75 | rules.emplace_back( | 788 | 75 | Builtins::EXP(Word(-1), X), | 789 | 75 | [=]() -> Pattern | 790 | 75 | { | 791 | 75 | return Builtins::SUB( | 792 | 75 | Builtins::ISZERO(Builtins::AND(X, Word(1))), | 793 | 75 | Builtins::AND(X, Word(1)) | 794 | 75 | ); | 795 | 75 | } | 796 | 75 | ); | 797 | | | 798 | 75 | return rules; | 799 | 75 | } |
Unexecuted instantiation: std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::evmRuleList<solidity::evmasm::Pattern>(solidity::langutil::EVMVersion, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) |
800 | | |
801 | | /// @returns a list of simplification rules given certain match placeholders. |
802 | | /// A, B and C should represent constants, W, X, Y, and Z arbitrary expressions. |
803 | | /// The simplifications should never change the order of evaluation of |
804 | | /// arbitrary operations. |
805 | | template <class Pattern> |
806 | | std::vector<SimplificationRule<Pattern>> simplificationRuleList( |
807 | | std::optional<langutil::EVMVersion> _evmVersion, |
808 | | Pattern A, |
809 | | Pattern B, |
810 | | Pattern C, |
811 | | Pattern W, |
812 | | Pattern X, |
813 | | Pattern Y, |
814 | | Pattern Z |
815 | | ) |
816 | 78 | { |
817 | 78 | using Word = typename Pattern::Word; |
818 | | // Some sanity checks |
819 | 78 | assertThrow(Pattern::WordSize % 8 == 0, OptimizerException, ""); |
820 | 78 | assertThrow(Pattern::WordSize >= 8, OptimizerException, ""); |
821 | 78 | assertThrow(Pattern::WordSize <= 256, OptimizerException, ""); |
822 | 78 | assertThrow(Word(-1) == ~Word(0), OptimizerException, ""); |
823 | 78 | assertThrow(Word(-1) + 1 == Word(0), OptimizerException, ""); |
824 | | |
825 | 78 | std::vector<SimplificationRule<Pattern>> rules; |
826 | 78 | rules += simplificationRuleListPart1(A, B, C, W, X); |
827 | 78 | rules += simplificationRuleListPart2(A, B, C, W, X); |
828 | 78 | rules += simplificationRuleListPart3(A, B, C, W, X); |
829 | 78 | rules += simplificationRuleListPart4(A, B, C, W, X); |
830 | 78 | rules += simplificationRuleListPart4_5(A, B, C, W, X); |
831 | 78 | rules += simplificationRuleListPart5(_evmVersion.has_value(), A, B, C, W, X); |
832 | 78 | rules += simplificationRuleListPart6(A, B, C, W, X); |
833 | 78 | rules += simplificationRuleListPart7(A, B, C, W, X, Y); |
834 | 78 | rules += simplificationRuleListPart8(A, B, C, W, X); |
835 | | |
836 | 78 | if (_evmVersion.has_value()) |
837 | 75 | rules += evmRuleList(*_evmVersion, A, B, C, W, X, Y, Z); |
838 | | |
839 | 78 | return rules; |
840 | 78 | } std::__1::vector<solidity::evmasm::SimplificationRule<solidity::yul::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::yul::Pattern> > > solidity::evmasm::simplificationRuleList<solidity::yul::Pattern>(std::__1::optional<solidity::langutil::EVMVersion>, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern) Line | Count | Source | 816 | 75 | { | 817 | 75 | using Word = typename Pattern::Word; | 818 | | // Some sanity checks | 819 | 75 | assertThrow(Pattern::WordSize % 8 == 0, OptimizerException, ""); | 820 | 75 | assertThrow(Pattern::WordSize >= 8, OptimizerException, ""); | 821 | 75 | assertThrow(Pattern::WordSize <= 256, OptimizerException, ""); | 822 | 75 | assertThrow(Word(-1) == ~Word(0), OptimizerException, ""); | 823 | 75 | assertThrow(Word(-1) + 1 == Word(0), OptimizerException, ""); | 824 | | | 825 | 75 | std::vector<SimplificationRule<Pattern>> rules; | 826 | 75 | rules += simplificationRuleListPart1(A, B, C, W, X); | 827 | 75 | rules += simplificationRuleListPart2(A, B, C, W, X); | 828 | 75 | rules += simplificationRuleListPart3(A, B, C, W, X); | 829 | 75 | rules += simplificationRuleListPart4(A, B, C, W, X); | 830 | 75 | rules += simplificationRuleListPart4_5(A, B, C, W, X); | 831 | 75 | rules += simplificationRuleListPart5(_evmVersion.has_value(), A, B, C, W, X); | 832 | 75 | rules += simplificationRuleListPart6(A, B, C, W, X); | 833 | 75 | rules += simplificationRuleListPart7(A, B, C, W, X, Y); | 834 | 75 | rules += simplificationRuleListPart8(A, B, C, W, X); | 835 | | | 836 | 75 | if (_evmVersion.has_value()) | 837 | 75 | rules += evmRuleList(*_evmVersion, A, B, C, W, X, Y, Z); | 838 | | | 839 | 75 | return rules; | 840 | 75 | } |
std::__1::vector<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern>, std::__1::allocator<solidity::evmasm::SimplificationRule<solidity::evmasm::Pattern> > > solidity::evmasm::simplificationRuleList<solidity::evmasm::Pattern>(std::__1::optional<solidity::langutil::EVMVersion>, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern) Line | Count | Source | 816 | 3 | { | 817 | 3 | using Word = typename Pattern::Word; | 818 | | // Some sanity checks | 819 | 3 | assertThrow(Pattern::WordSize % 8 == 0, OptimizerException, ""); | 820 | 3 | assertThrow(Pattern::WordSize >= 8, OptimizerException, ""); | 821 | 3 | assertThrow(Pattern::WordSize <= 256, OptimizerException, ""); | 822 | 3 | assertThrow(Word(-1) == ~Word(0), OptimizerException, ""); | 823 | 3 | assertThrow(Word(-1) + 1 == Word(0), OptimizerException, ""); | 824 | | | 825 | 3 | std::vector<SimplificationRule<Pattern>> rules; | 826 | 3 | rules += simplificationRuleListPart1(A, B, C, W, X); | 827 | 3 | rules += simplificationRuleListPart2(A, B, C, W, X); | 828 | 3 | rules += simplificationRuleListPart3(A, B, C, W, X); | 829 | 3 | rules += simplificationRuleListPart4(A, B, C, W, X); | 830 | 3 | rules += simplificationRuleListPart4_5(A, B, C, W, X); | 831 | 3 | rules += simplificationRuleListPart5(_evmVersion.has_value(), A, B, C, W, X); | 832 | 3 | rules += simplificationRuleListPart6(A, B, C, W, X); | 833 | 3 | rules += simplificationRuleListPart7(A, B, C, W, X, Y); | 834 | 3 | rules += simplificationRuleListPart8(A, B, C, W, X); | 835 | | | 836 | 3 | if (_evmVersion.has_value()) | 837 | 0 | rules += evmRuleList(*_evmVersion, A, B, C, W, X, Y, Z); | 838 | | | 839 | 3 | return rules; | 840 | 3 | } |
|
841 | | |
842 | | } |