/src/solidity/libevmasm/RuleList.h
Line | Count | Source (jump to first uncovered line) |
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 | 109k | { |
45 | 109k | return (S)(bigint(_a) / bigint(_b)); |
46 | 109k | } boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256u, 256u, (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<256u, 256u, (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<256u, 256u, (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<256u, 256u, (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 | 54.8k | { | 45 | 54.8k | return (S)(bigint(_a) / bigint(_b)); | 46 | 54.8k | } |
boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256u, 256u, (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<256u, 256u, (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<256u, 256u, (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<256u, 256u, (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 | 54.7k | { | 45 | 54.7k | return (S)(bigint(_a) / bigint(_b)); | 46 | 54.7k | } |
|
47 | | |
48 | | template <class S> S modWorkaround(S const& _a, S const& _b) |
49 | 35.6k | { |
50 | 35.6k | return (S)(bigint(_a) % bigint(_b)); |
51 | 35.6k | } boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256u, 256u, (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<256u, 256u, (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<256u, 256u, (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<256u, 256u, (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 | 8.61k | { | 50 | 8.61k | return (S)(bigint(_a) % bigint(_b)); | 51 | 8.61k | } |
boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<256u, 256u, (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<256u, 256u, (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<256u, 256u, (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<256u, 256u, (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 | 26.9k | { | 50 | 26.9k | return (S)(bigint(_a) % bigint(_b)); | 51 | 26.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 | 117k | { |
57 | 117k | return u256((bigint(_x) << _amount) & u256(-1)); |
58 | 117k | } |
59 | | |
60 | | /// @returns k if _x == 2**k, nullopt otherwise |
61 | | inline std::optional<size_t> binaryLogarithm(u256 const& _x) |
62 | 131k | { |
63 | 131k | if (_x == 0) |
64 | 0 | return std::nullopt; |
65 | 131k | size_t msb = boost::multiprecision::msb(_x); |
66 | 131k | return (u256(1) << msb) == _x ? std::make_optional(msb) : std::nullopt; |
67 | 131k | } |
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 | 47 | { |
81 | 47 | using Word = typename Pattern::Word; |
82 | 47 | using Builtins = typename Pattern::Builtins; |
83 | 47 | return std::vector<SimplificationRule<Pattern>>{ |
84 | | // arithmetic on constants |
85 | 297k | {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()() const Line | Count | Source | 85 | 149k | {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()() const Line | Count | Source | 85 | 148k | {Builtins::ADD(A, B), [=]{ return A.d() + B.d(); }}, |
|
86 | 39.7k | {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()() const Line | Count | Source | 86 | 6.95k | {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()() const Line | Count | Source | 86 | 32.8k | {Builtins::MUL(A, B), [=]{ return A.d() * B.d(); }}, |
|
87 | 6.43M | {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()() const Line | Count | Source | 87 | 1.73M | {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()() const Line | Count | Source | 87 | 4.69M | {Builtins::SUB(A, B), [=]{ return A.d() - B.d(); }}, |
|
88 | 62.7k | {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()() const Line | Count | Source | 88 | 22.3k | {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()() const Line | Count | Source | 88 | 40.4k | {Builtins::DIV(A, B), [=]{ return B.d() == 0 ? 0 : divWorkaround(A.d(), B.d()); }}, |
|
89 | 65.0k | {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()() const Line | Count | Source | 89 | 26.7k | {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()() const Line | Count | Source | 89 | 38.3k | {Builtins::SDIV(A, B), [=]{ return B.d() == 0 ? 0 : s2u(divWorkaround(u2s(A.d()), u2s(B.d()))); }}, |
|
90 | 9.45k | {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()() const Line | Count | Source | 90 | 2.12k | {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()() const Line | Count | Source | 90 | 7.33k | {Builtins::MOD(A, B), [=]{ return B.d() == 0 ? 0 : modWorkaround(A.d(), B.d()); }}, |
|
91 | 30.0k | {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()() const Line | Count | Source | 91 | 10.3k | {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()() const Line | Count | Source | 91 | 19.7k | {Builtins::SMOD(A, B), [=]{ return B.d() == 0 ? 0 : s2u(modWorkaround(u2s(A.d()), u2s(B.d()))); }}, |
|
92 | 70.6k | {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()() const Line | Count | Source | 92 | 53.3k | {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()() const Line | Count | Source | 92 | 17.3k | {Builtins::EXP(A, B), [=]{ return Word(boost::multiprecision::powm(bigint(A.d()), bigint(B.d()), bigint(1) << Pattern::WordSize)); }}, |
|
93 | 128k | {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()() const Line | Count | Source | 93 | 54.2k | {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()() const Line | Count | Source | 93 | 74.0k | {Builtins::NOT(A), [=]{ return ~A.d(); }}, |
|
94 | 12.4k | {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()() const Line | Count | Source | 94 | 5.80k | {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()() const Line | Count | Source | 94 | 6.66k | {Builtins::LT(A, B), [=]() -> Word { return A.d() < B.d() ? 1 : 0; }}, |
|
95 | 11.6k | {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()() const Line | Count | Source | 95 | 3.10k | {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()() const Line | Count | Source | 95 | 8.51k | {Builtins::GT(A, B), [=]() -> Word { return A.d() > B.d() ? 1 : 0; }}, |
|
96 | 9.89k | {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()() const Line | Count | Source | 96 | 2.19k | {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()() const Line | Count | Source | 96 | 7.70k | {Builtins::SLT(A, B), [=]() -> Word { return u2s(A.d()) < u2s(B.d()) ? 1 : 0; }}, |
|
97 | 3.30k | {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()() const Line | Count | Source | 97 | 664 | {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()() const Line | Count | Source | 97 | 2.63k | {Builtins::SGT(A, B), [=]() -> Word { return u2s(A.d()) > u2s(B.d()) ? 1 : 0; }}, |
|
98 | 14.3k | {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()() const Line | Count | Source | 98 | 10.2k | {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()() const Line | Count | Source | 98 | 4.15k | {Builtins::EQ(A, B), [=]() -> Word { return A.d() == B.d() ? 1 : 0; }}, |
|
99 | 564k | {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()() const Line | Count | Source | 99 | 547k | {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()() const Line | Count | Source | 99 | 16.8k | {Builtins::ISZERO(A), [=]() -> Word { return A.d() == 0 ? 1 : 0; }}, |
|
100 | 14.3k | {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()() const Line | Count | Source | 100 | 1.92k | {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()() const Line | Count | Source | 100 | 12.4k | {Builtins::AND(A, B), [=]{ return A.d() & B.d(); }}, |
|
101 | 6.65k | {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()() const Line | Count | Source | 101 | 1.94k | {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()() const Line | Count | Source | 101 | 4.71k | {Builtins::OR(A, B), [=]{ return A.d() | B.d(); }}, |
|
102 | 14.1k | {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()() const Line | Count | Source | 102 | 7.78k | {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()() const Line | Count | Source | 102 | 6.39k | {Builtins::XOR(A, B), [=]{ return A.d() ^ B.d(); }}, |
|
103 | 3.33k | {Builtins::BYTE(A, B), [=]{ |
104 | 3.33k | return |
105 | 3.33k | A.d() >= Pattern::WordSize / 8 ? |
106 | 2.47k | 0 : |
107 | 3.33k | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; |
108 | 3.33k | }}, solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#19}::operator()() const Line | Count | Source | 103 | 1.33k | {Builtins::BYTE(A, B), [=]{ | 104 | 1.33k | return | 105 | 1.33k | A.d() >= Pattern::WordSize / 8 ? | 106 | 1.12k | 0 : | 107 | 1.33k | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; | 108 | 1.33k | }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#19}::operator()() const Line | Count | Source | 103 | 2.00k | {Builtins::BYTE(A, B), [=]{ | 104 | 2.00k | return | 105 | 2.00k | A.d() >= Pattern::WordSize / 8 ? | 106 | 1.35k | 0 : | 107 | 2.00k | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; | 108 | 2.00k | }}, |
|
109 | 42.5k | {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()() const Line | Count | Source | 109 | 6.03k | {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()() const Line | Count | Source | 109 | 36.5k | {Builtins::ADDMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) + bigint(B.d())) % C.d()); }}, |
|
110 | 37.6k | {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()() const Line | Count | Source | 110 | 5.64k | {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()() const Line | Count | Source | 110 | 31.9k | {Builtins::MULMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) * bigint(B.d())) % C.d()); }}, |
|
111 | 7.72k | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { |
112 | 7.72k | if (A.d() >= Pattern::WordSize / 8 - 1) |
113 | 3.51k | return B.d(); |
114 | 4.21k | unsigned testBit = unsigned(A.d()) * 8 + 7; |
115 | 4.21k | Word mask = (Word(1) << testBit) - 1; |
116 | 4.21k | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; |
117 | 7.72k | }}, solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#22}::operator()() const Line | Count | Source | 111 | 1.70k | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { | 112 | 1.70k | if (A.d() >= Pattern::WordSize / 8 - 1) | 113 | 704 | return B.d(); | 114 | 1.00k | unsigned testBit = unsigned(A.d()) * 8 + 7; | 115 | 1.00k | Word mask = (Word(1) << testBit) - 1; | 116 | 1.00k | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; | 117 | 1.70k | }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#22}::operator()() const Line | Count | Source | 111 | 6.01k | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { | 112 | 6.01k | if (A.d() >= Pattern::WordSize / 8 - 1) | 113 | 2.80k | return B.d(); | 114 | 3.20k | unsigned testBit = unsigned(A.d()) * 8 + 7; | 115 | 3.20k | Word mask = (Word(1) << testBit) - 1; | 116 | 3.20k | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; | 117 | 6.01k | }}, |
|
118 | 63.0k | {Builtins::SHL(A, B), [=]{ |
119 | 63.0k | if (A.d() >= Pattern::WordSize) |
120 | 3.05k | return Word(0); |
121 | 60.0k | return shlWorkaround(B.d(), unsigned(A.d())); |
122 | 63.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()() const Line | Count | Source | 118 | 41.8k | {Builtins::SHL(A, B), [=]{ | 119 | 41.8k | if (A.d() >= Pattern::WordSize) | 120 | 1.25k | return Word(0); | 121 | 40.6k | return shlWorkaround(B.d(), unsigned(A.d())); | 122 | 41.8k | }}, |
solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#23}::operator()() const Line | Count | Source | 118 | 21.2k | {Builtins::SHL(A, B), [=]{ | 119 | 21.2k | if (A.d() >= Pattern::WordSize) | 120 | 1.79k | return Word(0); | 121 | 19.4k | return shlWorkaround(B.d(), unsigned(A.d())); | 122 | 21.2k | }}, |
|
123 | 8.26k | {Builtins::SHR(A, B), [=]{ |
124 | 8.26k | if (A.d() >= Pattern::WordSize) |
125 | 2.60k | return Word(0); |
126 | 5.66k | return B.d() >> unsigned(A.d()); |
127 | 8.26k | }} solidity::evmasm::simplificationRuleListPart1<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#24}::operator()() const Line | Count | Source | 123 | 2.12k | {Builtins::SHR(A, B), [=]{ | 124 | 2.12k | if (A.d() >= Pattern::WordSize) | 125 | 721 | return Word(0); | 126 | 1.40k | return B.d() >> unsigned(A.d()); | 127 | 2.12k | }} |
solidity::evmasm::simplificationRuleListPart1<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#24}::operator()() const Line | Count | Source | 123 | 6.13k | {Builtins::SHR(A, B), [=]{ | 124 | 6.13k | if (A.d() >= Pattern::WordSize) | 125 | 1.88k | return Word(0); | 126 | 4.25k | return B.d() >> unsigned(A.d()); | 127 | 6.13k | }} |
|
128 | 47 | }; |
129 | 47 | } 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 | 4 | { | 81 | 4 | using Word = typename Pattern::Word; | 82 | 4 | using Builtins = typename Pattern::Builtins; | 83 | 4 | return std::vector<SimplificationRule<Pattern>>{ | 84 | | // arithmetic on constants | 85 | 4 | {Builtins::ADD(A, B), [=]{ return A.d() + B.d(); }}, | 86 | 4 | {Builtins::MUL(A, B), [=]{ return A.d() * B.d(); }}, | 87 | 4 | {Builtins::SUB(A, B), [=]{ return A.d() - B.d(); }}, | 88 | 4 | {Builtins::DIV(A, B), [=]{ return B.d() == 0 ? 0 : divWorkaround(A.d(), B.d()); }}, | 89 | 4 | {Builtins::SDIV(A, B), [=]{ return B.d() == 0 ? 0 : s2u(divWorkaround(u2s(A.d()), u2s(B.d()))); }}, | 90 | 4 | {Builtins::MOD(A, B), [=]{ return B.d() == 0 ? 0 : modWorkaround(A.d(), B.d()); }}, | 91 | 4 | {Builtins::SMOD(A, B), [=]{ return B.d() == 0 ? 0 : s2u(modWorkaround(u2s(A.d()), u2s(B.d()))); }}, | 92 | 4 | {Builtins::EXP(A, B), [=]{ return Word(boost::multiprecision::powm(bigint(A.d()), bigint(B.d()), bigint(1) << Pattern::WordSize)); }}, | 93 | 4 | {Builtins::NOT(A), [=]{ return ~A.d(); }}, | 94 | 4 | {Builtins::LT(A, B), [=]() -> Word { return A.d() < B.d() ? 1 : 0; }}, | 95 | 4 | {Builtins::GT(A, B), [=]() -> Word { return A.d() > B.d() ? 1 : 0; }}, | 96 | 4 | {Builtins::SLT(A, B), [=]() -> Word { return u2s(A.d()) < u2s(B.d()) ? 1 : 0; }}, | 97 | 4 | {Builtins::SGT(A, B), [=]() -> Word { return u2s(A.d()) > u2s(B.d()) ? 1 : 0; }}, | 98 | 4 | {Builtins::EQ(A, B), [=]() -> Word { return A.d() == B.d() ? 1 : 0; }}, | 99 | 4 | {Builtins::ISZERO(A), [=]() -> Word { return A.d() == 0 ? 1 : 0; }}, | 100 | 4 | {Builtins::AND(A, B), [=]{ return A.d() & B.d(); }}, | 101 | 4 | {Builtins::OR(A, B), [=]{ return A.d() | B.d(); }}, | 102 | 4 | {Builtins::XOR(A, B), [=]{ return A.d() ^ B.d(); }}, | 103 | 4 | {Builtins::BYTE(A, B), [=]{ | 104 | 4 | return | 105 | 4 | A.d() >= Pattern::WordSize / 8 ? | 106 | 4 | 0 : | 107 | 4 | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; | 108 | 4 | }}, | 109 | 4 | {Builtins::ADDMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) + bigint(B.d())) % C.d()); }}, | 110 | 4 | {Builtins::MULMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) * bigint(B.d())) % C.d()); }}, | 111 | 4 | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { | 112 | 4 | if (A.d() >= Pattern::WordSize / 8 - 1) | 113 | 4 | return B.d(); | 114 | 4 | unsigned testBit = unsigned(A.d()) * 8 + 7; | 115 | 4 | Word mask = (Word(1) << testBit) - 1; | 116 | 4 | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; | 117 | 4 | }}, | 118 | 4 | {Builtins::SHL(A, B), [=]{ | 119 | 4 | if (A.d() >= Pattern::WordSize) | 120 | 4 | return Word(0); | 121 | 4 | return shlWorkaround(B.d(), unsigned(A.d())); | 122 | 4 | }}, | 123 | 4 | {Builtins::SHR(A, B), [=]{ | 124 | 4 | if (A.d() >= Pattern::WordSize) | 125 | 4 | return Word(0); | 126 | 4 | return B.d() >> unsigned(A.d()); | 127 | 4 | }} | 128 | 4 | }; | 129 | 4 | } |
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 | 43 | { | 81 | 43 | using Word = typename Pattern::Word; | 82 | 43 | using Builtins = typename Pattern::Builtins; | 83 | 43 | return std::vector<SimplificationRule<Pattern>>{ | 84 | | // arithmetic on constants | 85 | 43 | {Builtins::ADD(A, B), [=]{ return A.d() + B.d(); }}, | 86 | 43 | {Builtins::MUL(A, B), [=]{ return A.d() * B.d(); }}, | 87 | 43 | {Builtins::SUB(A, B), [=]{ return A.d() - B.d(); }}, | 88 | 43 | {Builtins::DIV(A, B), [=]{ return B.d() == 0 ? 0 : divWorkaround(A.d(), B.d()); }}, | 89 | 43 | {Builtins::SDIV(A, B), [=]{ return B.d() == 0 ? 0 : s2u(divWorkaround(u2s(A.d()), u2s(B.d()))); }}, | 90 | 43 | {Builtins::MOD(A, B), [=]{ return B.d() == 0 ? 0 : modWorkaround(A.d(), B.d()); }}, | 91 | 43 | {Builtins::SMOD(A, B), [=]{ return B.d() == 0 ? 0 : s2u(modWorkaround(u2s(A.d()), u2s(B.d()))); }}, | 92 | 43 | {Builtins::EXP(A, B), [=]{ return Word(boost::multiprecision::powm(bigint(A.d()), bigint(B.d()), bigint(1) << Pattern::WordSize)); }}, | 93 | 43 | {Builtins::NOT(A), [=]{ return ~A.d(); }}, | 94 | 43 | {Builtins::LT(A, B), [=]() -> Word { return A.d() < B.d() ? 1 : 0; }}, | 95 | 43 | {Builtins::GT(A, B), [=]() -> Word { return A.d() > B.d() ? 1 : 0; }}, | 96 | 43 | {Builtins::SLT(A, B), [=]() -> Word { return u2s(A.d()) < u2s(B.d()) ? 1 : 0; }}, | 97 | 43 | {Builtins::SGT(A, B), [=]() -> Word { return u2s(A.d()) > u2s(B.d()) ? 1 : 0; }}, | 98 | 43 | {Builtins::EQ(A, B), [=]() -> Word { return A.d() == B.d() ? 1 : 0; }}, | 99 | 43 | {Builtins::ISZERO(A), [=]() -> Word { return A.d() == 0 ? 1 : 0; }}, | 100 | 43 | {Builtins::AND(A, B), [=]{ return A.d() & B.d(); }}, | 101 | 43 | {Builtins::OR(A, B), [=]{ return A.d() | B.d(); }}, | 102 | 43 | {Builtins::XOR(A, B), [=]{ return A.d() ^ B.d(); }}, | 103 | 43 | {Builtins::BYTE(A, B), [=]{ | 104 | 43 | return | 105 | 43 | A.d() >= Pattern::WordSize / 8 ? | 106 | 43 | 0 : | 107 | 43 | (B.d() >> unsigned(8 * (Pattern::WordSize / 8 - 1 - A.d()))) & 0xff; | 108 | 43 | }}, | 109 | 43 | {Builtins::ADDMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) + bigint(B.d())) % C.d()); }}, | 110 | 43 | {Builtins::MULMOD(A, B, C), [=]{ return C.d() == 0 ? 0 : Word((bigint(A.d()) * bigint(B.d())) % C.d()); }}, | 111 | 43 | {Builtins::SIGNEXTEND(A, B), [=]() -> Word { | 112 | 43 | if (A.d() >= Pattern::WordSize / 8 - 1) | 113 | 43 | return B.d(); | 114 | 43 | unsigned testBit = unsigned(A.d()) * 8 + 7; | 115 | 43 | Word mask = (Word(1) << testBit) - 1; | 116 | 43 | return boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask; | 117 | 43 | }}, | 118 | 43 | {Builtins::SHL(A, B), [=]{ | 119 | 43 | if (A.d() >= Pattern::WordSize) | 120 | 43 | return Word(0); | 121 | 43 | return shlWorkaround(B.d(), unsigned(A.d())); | 122 | 43 | }}, | 123 | 43 | {Builtins::SHR(A, B), [=]{ | 124 | 43 | if (A.d() >= Pattern::WordSize) | 125 | 43 | return Word(0); | 126 | 43 | return B.d() >> unsigned(A.d()); | 127 | 43 | }} | 128 | 43 | }; | 129 | 43 | } |
|
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 | 47 | { |
141 | 47 | using Word = typename Pattern::Word; |
142 | 47 | using Builtins = typename Pattern::Builtins; |
143 | 47 | return std::vector<SimplificationRule<Pattern>> { |
144 | | // invariants involving known constants |
145 | 15.0k | {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()() const Line | Count | Source | 145 | 2.67k | {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()() const Line | Count | Source | 145 | 12.4k | {Builtins::ADD(X, 0), [=]{ return X; }}, |
|
146 | 281k | {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()() const Line | Count | Source | 146 | 280k | {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()() const Line | Count | Source | 146 | 1.03k | {Builtins::ADD(0, X), [=]{ return X; }}, |
|
147 | 136k | {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()() const Line | Count | Source | 147 | 59.4k | {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()() const Line | Count | Source | 147 | 76.9k | {Builtins::SUB(X, 0), [=]{ return X; }}, |
|
148 | 3.69k | {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()() const Line | Count | Source | 148 | 2.10k | {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()() const Line | Count | Source | 148 | 1.58k | {Builtins::SUB(~Word(0), X), [=]() -> Pattern { return Builtins::NOT(X); }}, |
|
149 | 929 | {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()() const Line | Count | Source | 149 | 151 | {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()() const Line | Count | Source | 149 | 778 | {Builtins::MUL(X, 0), [=]{ return Word(0); }}, |
|
150 | 9.00k | {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()() const Line | Count | Source | 150 | 6.58k | {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()() const Line | Count | Source | 150 | 2.42k | {Builtins::MUL(0, X), [=]{ return Word(0); }}, |
|
151 | 629 | {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()() const Line | Count | Source | 151 | 191 | {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()() const Line | Count | Source | 151 | 438 | {Builtins::MUL(X, 1), [=]{ return X; }}, |
|
152 | 6.51k | {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()() const Line | Count | Source | 152 | 5.28k | {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()() const Line | Count | Source | 152 | 1.23k | {Builtins::MUL(1, X), [=]{ return X; }}, |
|
153 | 202 | {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()() const Line | Count | Source | 153 | 85 | {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()() const Line | Count | Source | 153 | 117 | {Builtins::MUL(X, Word(-1)), [=]() -> Pattern { return Builtins::SUB(0, X); }}, |
|
154 | 545 | {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()() const Line | Count | Source | 154 | 97 | {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()() const Line | Count | Source | 154 | 448 | {Builtins::MUL(Word(-1), X), [=]() -> Pattern { return Builtins::SUB(0, X); }}, |
|
155 | 1.34k | {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()() const Line | Count | Source | 155 | 366 | {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()() const Line | Count | Source | 155 | 976 | {Builtins::DIV(X, 0), [=]{ return Word(0); }}, |
|
156 | 1.72k | {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()() const Line | Count | Source | 156 | 1.21k | {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()() const Line | Count | Source | 156 | 504 | {Builtins::DIV(0, X), [=]{ return Word(0); }}, |
|
157 | 1.01k | {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()() const Line | Count | Source | 157 | 417 | {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()() const Line | Count | Source | 157 | 600 | {Builtins::DIV(X, 1), [=]{ return X; }}, |
|
158 | 4.02k | {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()() const Line | Count | Source | 158 | 500 | {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()() const Line | Count | Source | 158 | 3.52k | {Builtins::SDIV(X, 0), [=]{ return Word(0); }}, |
|
159 | 891 | {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()() const Line | Count | Source | 159 | 101 | {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()() const Line | Count | Source | 159 | 790 | {Builtins::SDIV(0, X), [=]{ return Word(0); }}, |
|
160 | 3.15k | {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()() const Line | Count | Source | 160 | 2.91k | {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()() const Line | Count | Source | 160 | 238 | {Builtins::SDIV(X, 1), [=]{ return X; }}, |
|
161 | 213 | {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()() const Line | Count | Source | 161 | 97 | {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()() const Line | Count | Source | 161 | 116 | {Builtins::AND(X, ~Word(0)), [=]{ return X; }}, |
|
162 | 313 | {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()() const Line | Count | Source | 162 | 205 | {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()() const Line | Count | Source | 162 | 108 | {Builtins::AND(~Word(0), X), [=]{ return X; }}, |
|
163 | 2.82k | {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()() const Line | Count | Source | 163 | 1.02k | {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()() const Line | Count | Source | 163 | 1.80k | {Builtins::AND(X, 0), [=]{ return Word(0); }}, |
|
164 | 1.87k | {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()() const Line | Count | Source | 164 | 1.22k | {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()() const Line | Count | Source | 164 | 646 | {Builtins::AND(0, X), [=]{ return Word(0); }}, |
|
165 | 1.48k | {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()() const Line | Count | Source | 165 | 782 | {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()() const Line | Count | Source | 165 | 699 | {Builtins::OR(X, 0), [=]{ return X; }}, |
|
166 | 1.65k | {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()() const Line | Count | Source | 166 | 942 | {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()() const Line | Count | Source | 166 | 714 | {Builtins::OR(0, X), [=]{ return X; }}, |
|
167 | 451 | {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()() const Line | Count | Source | 167 | 73 | {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()() const Line | Count | Source | 167 | 378 | {Builtins::OR(X, ~Word(0)), [=]{ return ~Word(0); }}, |
|
168 | 315 | {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()() const Line | Count | Source | 168 | 83 | {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()() const Line | Count | Source | 168 | 232 | {Builtins::OR(~Word(0), X), [=]{ return ~Word(0); }}, |
|
169 | 1.23k | {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()() const Line | Count | Source | 169 | 899 | {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()() const Line | Count | Source | 169 | 340 | {Builtins::XOR(X, 0), [=]{ return X; }}, |
|
170 | 4.28k | {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()() const Line | Count | Source | 170 | 3.97k | {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()() const Line | Count | Source | 170 | 311 | {Builtins::XOR(0, X), [=]{ return X; }}, |
|
171 | 835 | {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()() const Line | Count | Source | 171 | 561 | {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()() const Line | Count | Source | 171 | 274 | {Builtins::MOD(X, 0), [=]{ return Word(0); }}, |
|
172 | 1.28k | {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()() const Line | Count | Source | 172 | 736 | {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()() const Line | Count | Source | 172 | 544 | {Builtins::MOD(0, X), [=]{ return Word(0); }}, |
|
173 | 53.0k | {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()() const Line | Count | Source | 173 | 2.75k | {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()() const Line | Count | Source | 173 | 50.2k | {Builtins::EQ(X, 0), [=]() -> Pattern { return Builtins::ISZERO(X); },}, |
|
174 | 81.9k | {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()() const Line | Count | Source | 174 | 64.6k | {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()() const Line | Count | Source | 174 | 17.2k | {Builtins::EQ(0, X), [=]() -> Pattern { return Builtins::ISZERO(X); },}, |
|
175 | 2.02k | {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()() const Line | Count | Source | 175 | 516 | {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()() const Line | Count | Source | 175 | 1.51k | {Builtins::SHL(0, X), [=]{ return X; }}, |
|
176 | 1.70k | {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()() const Line | Count | Source | 176 | 288 | {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()() const Line | Count | Source | 176 | 1.42k | {Builtins::SHR(0, X), [=]{ return X; }}, |
|
177 | 700 | {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()() const Line | Count | Source | 177 | 185 | {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()() const Line | Count | Source | 177 | 515 | {Builtins::SHL(X, 0), [=]{ return Word(0); }}, |
|
178 | 958 | {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()() const Line | Count | Source | 178 | 561 | {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()() const Line | Count | Source | 178 | 397 | {Builtins::SHR(X, 0), [=]{ return Word(0); }}, |
|
179 | 2.08k | {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()() const Line | Count | Source | 179 | 496 | {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()() const Line | Count | Source | 179 | 1.59k | {Builtins::GT(X, 0), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, |
|
180 | 13.0k | {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()() const Line | Count | Source | 180 | 10.2k | {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()() const Line | Count | Source | 180 | 2.81k | {Builtins::LT(0, X), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, |
|
181 | 2.97k | {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()() const Line | Count | Source | 181 | 10 | {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()() const Line | Count | Source | 181 | 2.96k | {Builtins::GT(X, ~Word(0)), [=]{ return Word(0); }}, |
|
182 | 144 | {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()() const Line | Count | Source | 182 | 39 | {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()() const Line | Count | Source | 182 | 105 | {Builtins::LT(~Word(0), X), [=]{ return Word(0); }}, |
|
183 | 931 | {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()() const Line | Count | Source | 183 | 618 | {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()() const Line | Count | Source | 183 | 313 | {Builtins::GT(0, X), [=]{ return Word(0); }}, |
|
184 | 665 | {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()() const Line | Count | Source | 184 | 89 | {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()() const Line | Count | Source | 184 | 576 | {Builtins::LT(X, 0), [=]{ return Word(0); }}, |
|
185 | 47 | {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()() const Line | Count | Source | 185 | 1 | {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()() const Line | Count | Source | 185 | 5 | {Builtins::AND(Builtins::BYTE(X, Y), Word(0xff)), [=]() -> Pattern { return Builtins::BYTE(X, Y); }}, |
|
186 | 195 | {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()() const Line | Count | Source | 186 | 110 | {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()() const Line | Count | Source | 186 | 85 | {Builtins::BYTE(Word(Pattern::WordSize / 8 - 1), X), [=]() -> Pattern { return Builtins::AND(X, Word(0xff)); }}, |
|
187 | 47 | }; |
188 | 47 | } 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 | 4 | { | 141 | 4 | using Word = typename Pattern::Word; | 142 | 4 | using Builtins = typename Pattern::Builtins; | 143 | 4 | return std::vector<SimplificationRule<Pattern>> { | 144 | | // invariants involving known constants | 145 | 4 | {Builtins::ADD(X, 0), [=]{ return X; }}, | 146 | 4 | {Builtins::ADD(0, X), [=]{ return X; }}, | 147 | 4 | {Builtins::SUB(X, 0), [=]{ return X; }}, | 148 | 4 | {Builtins::SUB(~Word(0), X), [=]() -> Pattern { return Builtins::NOT(X); }}, | 149 | 4 | {Builtins::MUL(X, 0), [=]{ return Word(0); }}, | 150 | 4 | {Builtins::MUL(0, X), [=]{ return Word(0); }}, | 151 | 4 | {Builtins::MUL(X, 1), [=]{ return X; }}, | 152 | 4 | {Builtins::MUL(1, X), [=]{ return X; }}, | 153 | 4 | {Builtins::MUL(X, Word(-1)), [=]() -> Pattern { return Builtins::SUB(0, X); }}, | 154 | 4 | {Builtins::MUL(Word(-1), X), [=]() -> Pattern { return Builtins::SUB(0, X); }}, | 155 | 4 | {Builtins::DIV(X, 0), [=]{ return Word(0); }}, | 156 | 4 | {Builtins::DIV(0, X), [=]{ return Word(0); }}, | 157 | 4 | {Builtins::DIV(X, 1), [=]{ return X; }}, | 158 | 4 | {Builtins::SDIV(X, 0), [=]{ return Word(0); }}, | 159 | 4 | {Builtins::SDIV(0, X), [=]{ return Word(0); }}, | 160 | 4 | {Builtins::SDIV(X, 1), [=]{ return X; }}, | 161 | 4 | {Builtins::AND(X, ~Word(0)), [=]{ return X; }}, | 162 | 4 | {Builtins::AND(~Word(0), X), [=]{ return X; }}, | 163 | 4 | {Builtins::AND(X, 0), [=]{ return Word(0); }}, | 164 | 4 | {Builtins::AND(0, X), [=]{ return Word(0); }}, | 165 | 4 | {Builtins::OR(X, 0), [=]{ return X; }}, | 166 | 4 | {Builtins::OR(0, X), [=]{ return X; }}, | 167 | 4 | {Builtins::OR(X, ~Word(0)), [=]{ return ~Word(0); }}, | 168 | 4 | {Builtins::OR(~Word(0), X), [=]{ return ~Word(0); }}, | 169 | 4 | {Builtins::XOR(X, 0), [=]{ return X; }}, | 170 | 4 | {Builtins::XOR(0, X), [=]{ return X; }}, | 171 | 4 | {Builtins::MOD(X, 0), [=]{ return Word(0); }}, | 172 | 4 | {Builtins::MOD(0, X), [=]{ return Word(0); }}, | 173 | 4 | {Builtins::EQ(X, 0), [=]() -> Pattern { return Builtins::ISZERO(X); },}, | 174 | 4 | {Builtins::EQ(0, X), [=]() -> Pattern { return Builtins::ISZERO(X); },}, | 175 | 4 | {Builtins::SHL(0, X), [=]{ return X; }}, | 176 | 4 | {Builtins::SHR(0, X), [=]{ return X; }}, | 177 | 4 | {Builtins::SHL(X, 0), [=]{ return Word(0); }}, | 178 | 4 | {Builtins::SHR(X, 0), [=]{ return Word(0); }}, | 179 | 4 | {Builtins::GT(X, 0), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, | 180 | 4 | {Builtins::LT(0, X), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, | 181 | 4 | {Builtins::GT(X, ~Word(0)), [=]{ return Word(0); }}, | 182 | 4 | {Builtins::LT(~Word(0), X), [=]{ return Word(0); }}, | 183 | 4 | {Builtins::GT(0, X), [=]{ return Word(0); }}, | 184 | 4 | {Builtins::LT(X, 0), [=]{ return Word(0); }}, | 185 | 4 | {Builtins::AND(Builtins::BYTE(X, Y), Word(0xff)), [=]() -> Pattern { return Builtins::BYTE(X, Y); }}, | 186 | 4 | {Builtins::BYTE(Word(Pattern::WordSize / 8 - 1), X), [=]() -> Pattern { return Builtins::AND(X, Word(0xff)); }}, | 187 | 4 | }; | 188 | 4 | } |
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 | 43 | { | 141 | 43 | using Word = typename Pattern::Word; | 142 | 43 | using Builtins = typename Pattern::Builtins; | 143 | 43 | return std::vector<SimplificationRule<Pattern>> { | 144 | | // invariants involving known constants | 145 | 43 | {Builtins::ADD(X, 0), [=]{ return X; }}, | 146 | 43 | {Builtins::ADD(0, X), [=]{ return X; }}, | 147 | 43 | {Builtins::SUB(X, 0), [=]{ return X; }}, | 148 | 43 | {Builtins::SUB(~Word(0), X), [=]() -> Pattern { return Builtins::NOT(X); }}, | 149 | 43 | {Builtins::MUL(X, 0), [=]{ return Word(0); }}, | 150 | 43 | {Builtins::MUL(0, X), [=]{ return Word(0); }}, | 151 | 43 | {Builtins::MUL(X, 1), [=]{ return X; }}, | 152 | 43 | {Builtins::MUL(1, X), [=]{ return X; }}, | 153 | 43 | {Builtins::MUL(X, Word(-1)), [=]() -> Pattern { return Builtins::SUB(0, X); }}, | 154 | 43 | {Builtins::MUL(Word(-1), X), [=]() -> Pattern { return Builtins::SUB(0, X); }}, | 155 | 43 | {Builtins::DIV(X, 0), [=]{ return Word(0); }}, | 156 | 43 | {Builtins::DIV(0, X), [=]{ return Word(0); }}, | 157 | 43 | {Builtins::DIV(X, 1), [=]{ return X; }}, | 158 | 43 | {Builtins::SDIV(X, 0), [=]{ return Word(0); }}, | 159 | 43 | {Builtins::SDIV(0, X), [=]{ return Word(0); }}, | 160 | 43 | {Builtins::SDIV(X, 1), [=]{ return X; }}, | 161 | 43 | {Builtins::AND(X, ~Word(0)), [=]{ return X; }}, | 162 | 43 | {Builtins::AND(~Word(0), X), [=]{ return X; }}, | 163 | 43 | {Builtins::AND(X, 0), [=]{ return Word(0); }}, | 164 | 43 | {Builtins::AND(0, X), [=]{ return Word(0); }}, | 165 | 43 | {Builtins::OR(X, 0), [=]{ return X; }}, | 166 | 43 | {Builtins::OR(0, X), [=]{ return X; }}, | 167 | 43 | {Builtins::OR(X, ~Word(0)), [=]{ return ~Word(0); }}, | 168 | 43 | {Builtins::OR(~Word(0), X), [=]{ return ~Word(0); }}, | 169 | 43 | {Builtins::XOR(X, 0), [=]{ return X; }}, | 170 | 43 | {Builtins::XOR(0, X), [=]{ return X; }}, | 171 | 43 | {Builtins::MOD(X, 0), [=]{ return Word(0); }}, | 172 | 43 | {Builtins::MOD(0, X), [=]{ return Word(0); }}, | 173 | 43 | {Builtins::EQ(X, 0), [=]() -> Pattern { return Builtins::ISZERO(X); },}, | 174 | 43 | {Builtins::EQ(0, X), [=]() -> Pattern { return Builtins::ISZERO(X); },}, | 175 | 43 | {Builtins::SHL(0, X), [=]{ return X; }}, | 176 | 43 | {Builtins::SHR(0, X), [=]{ return X; }}, | 177 | 43 | {Builtins::SHL(X, 0), [=]{ return Word(0); }}, | 178 | 43 | {Builtins::SHR(X, 0), [=]{ return Word(0); }}, | 179 | 43 | {Builtins::GT(X, 0), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, | 180 | 43 | {Builtins::LT(0, X), [=]() -> Pattern { return Builtins::ISZERO(Builtins::ISZERO(X)); }}, | 181 | 43 | {Builtins::GT(X, ~Word(0)), [=]{ return Word(0); }}, | 182 | 43 | {Builtins::LT(~Word(0), X), [=]{ return Word(0); }}, | 183 | 43 | {Builtins::GT(0, X), [=]{ return Word(0); }}, | 184 | 43 | {Builtins::LT(X, 0), [=]{ return Word(0); }}, | 185 | 43 | {Builtins::AND(Builtins::BYTE(X, Y), Word(0xff)), [=]() -> Pattern { return Builtins::BYTE(X, Y); }}, | 186 | 43 | {Builtins::BYTE(Word(Pattern::WordSize / 8 - 1), X), [=]() -> Pattern { return Builtins::AND(X, Word(0xff)); }}, | 187 | 43 | }; | 188 | 43 | } |
|
189 | | |
190 | | template <class Pattern> |
191 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart3( |
192 | | Pattern, |
193 | | Pattern, |
194 | | Pattern, |
195 | | Pattern X, |
196 | | Pattern |
197 | | ) |
198 | 47 | { |
199 | 47 | using Word = typename Pattern::Word; |
200 | 47 | using Builtins = typename Pattern::Builtins; |
201 | 47 | return std::vector<SimplificationRule<Pattern>> { |
202 | | // operations involving an expression and itself |
203 | 569 | {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()() const Line | Count | Source | 203 | 280 | {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()() const Line | Count | Source | 203 | 289 | {Builtins::AND(X, X), [=]{ return X; }}, |
|
204 | 704 | {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()() const Line | Count | Source | 204 | 195 | {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()() const Line | Count | Source | 204 | 509 | {Builtins::OR(X, X), [=]{ return X; }}, |
|
205 | 366 | {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()() const Line | Count | Source | 205 | 115 | {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()() const Line | Count | Source | 205 | 251 | {Builtins::XOR(X, X), [=]{ return Word(0); }}, |
|
206 | 98.5k | {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()() const Line | Count | Source | 206 | 10.5k | {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()() const Line | Count | Source | 206 | 88.0k | {Builtins::SUB(X, X), [=]{ return Word(0); }}, |
|
207 | 10.1k | {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()() const Line | Count | Source | 207 | 15 | {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()() const Line | Count | Source | 207 | 10.0k | {Builtins::EQ(X, X), [=]{ return Word(1); }}, |
|
208 | 138 | {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()() const Line | Count | Source | 208 | 61 | {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()() const Line | Count | Source | 208 | 77 | {Builtins::LT(X, X), [=]{ return Word(0); }}, |
|
209 | 122 | {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()() const Line | Count | Source | 209 | 42 | {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()() const Line | Count | Source | 209 | 80 | {Builtins::SLT(X, X), [=]{ return Word(0); }}, |
|
210 | 698 | {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()() const Line | Count | Source | 210 | 278 | {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()() const Line | Count | Source | 210 | 420 | {Builtins::GT(X, X), [=]{ return Word(0); }}, |
|
211 | 181 | {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()() const Line | Count | Source | 211 | 39 | {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()() const Line | Count | Source | 211 | 142 | {Builtins::SGT(X, X), [=]{ return Word(0); }}, |
|
212 | 246 | {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()() const Line | Count | Source | 212 | 39 | {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()() const Line | Count | Source | 212 | 207 | {Builtins::MOD(X, X), [=]{ return Word(0); }} |
|
213 | 47 | }; |
214 | 47 | } 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 | 4 | { | 199 | 4 | using Word = typename Pattern::Word; | 200 | 4 | using Builtins = typename Pattern::Builtins; | 201 | 4 | return std::vector<SimplificationRule<Pattern>> { | 202 | | // operations involving an expression and itself | 203 | 4 | {Builtins::AND(X, X), [=]{ return X; }}, | 204 | 4 | {Builtins::OR(X, X), [=]{ return X; }}, | 205 | 4 | {Builtins::XOR(X, X), [=]{ return Word(0); }}, | 206 | 4 | {Builtins::SUB(X, X), [=]{ return Word(0); }}, | 207 | 4 | {Builtins::EQ(X, X), [=]{ return Word(1); }}, | 208 | 4 | {Builtins::LT(X, X), [=]{ return Word(0); }}, | 209 | 4 | {Builtins::SLT(X, X), [=]{ return Word(0); }}, | 210 | 4 | {Builtins::GT(X, X), [=]{ return Word(0); }}, | 211 | 4 | {Builtins::SGT(X, X), [=]{ return Word(0); }}, | 212 | 4 | {Builtins::MOD(X, X), [=]{ return Word(0); }} | 213 | 4 | }; | 214 | 4 | } |
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 | 43 | { | 199 | 43 | using Word = typename Pattern::Word; | 200 | 43 | using Builtins = typename Pattern::Builtins; | 201 | 43 | return std::vector<SimplificationRule<Pattern>> { | 202 | | // operations involving an expression and itself | 203 | 43 | {Builtins::AND(X, X), [=]{ return X; }}, | 204 | 43 | {Builtins::OR(X, X), [=]{ return X; }}, | 205 | 43 | {Builtins::XOR(X, X), [=]{ return Word(0); }}, | 206 | 43 | {Builtins::SUB(X, X), [=]{ return Word(0); }}, | 207 | 43 | {Builtins::EQ(X, X), [=]{ return Word(1); }}, | 208 | 43 | {Builtins::LT(X, X), [=]{ return Word(0); }}, | 209 | 43 | {Builtins::SLT(X, X), [=]{ return Word(0); }}, | 210 | 43 | {Builtins::GT(X, X), [=]{ return Word(0); }}, | 211 | 43 | {Builtins::SGT(X, X), [=]{ return Word(0); }}, | 212 | 43 | {Builtins::MOD(X, X), [=]{ return Word(0); }} | 213 | 43 | }; | 214 | 43 | } |
|
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 | 47 | { |
225 | 47 | using Word = typename Pattern::Word; |
226 | 47 | using Builtins = typename Pattern::Builtins; |
227 | 47 | return std::vector<SimplificationRule<Pattern>> { |
228 | | // logical instruction combinations |
229 | 1.03k | {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()() const Line | Count | Source | 229 | 72 | {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()() const Line | Count | Source | 229 | 966 | {Builtins::NOT(Builtins::NOT(X)), [=]{ return X; }}, |
|
230 | 2.00k | {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()() const Line | Count | Source | 230 | 1.70k | {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()() const Line | Count | Source | 230 | 293 | {Builtins::XOR(X, Builtins::XOR(X, Y)), [=]{ return Y; }}, |
|
231 | 1.93k | {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()() const Line | Count | Source | 231 | 1.82k | {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()() const Line | Count | Source | 231 | 104 | {Builtins::XOR(X, Builtins::XOR(Y, X)), [=]{ return Y; }}, |
|
232 | 195 | {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 solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#4}::operator()() const Line | Count | Source | 232 | 195 | {Builtins::XOR(Builtins::XOR(X, Y), X), [=]{ return Y; }}, |
|
233 | 171 | {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 solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() const Line | Count | Source | 233 | 171 | {Builtins::XOR(Builtins::XOR(Y, X), X), [=]{ return Y; }}, |
|
234 | 357 | {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()() const Line | Count | Source | 234 | 153 | {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()() const Line | Count | Source | 234 | 204 | {Builtins::OR(X, Builtins::AND(X, Y)), [=]{ return X; }}, |
|
235 | 241 | {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()() const Line | Count | Source | 235 | 127 | {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()() const Line | Count | Source | 235 | 114 | {Builtins::OR(X, Builtins::AND(Y, X)), [=]{ return X; }}, |
|
236 | 151 | {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 solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() const Line | Count | Source | 236 | 151 | {Builtins::OR(Builtins::AND(X, Y), X), [=]{ return X; }}, |
|
237 | 190 | {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 solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() const Line | Count | Source | 237 | 190 | {Builtins::OR(Builtins::AND(Y, X), X), [=]{ return X; }}, |
|
238 | 418 | {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()() const Line | Count | Source | 238 | 350 | {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()() const Line | Count | Source | 238 | 68 | {Builtins::AND(X, Builtins::OR(X, Y)), [=]{ return X; }}, |
|
239 | 183 | {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()() const Line | Count | Source | 239 | 83 | {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()() const Line | Count | Source | 239 | 100 | {Builtins::AND(X, Builtins::OR(Y, X)), [=]{ return X; }}, |
|
240 | 213 | {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 solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#12}::operator()() const Line | Count | Source | 240 | 213 | {Builtins::AND(Builtins::OR(X, Y), X), [=]{ return X; }}, |
|
241 | 165 | {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 solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#13}::operator()() const Line | Count | Source | 241 | 165 | {Builtins::AND(Builtins::OR(Y, X), X), [=]{ return X; }}, |
|
242 | 106 | {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()() const Line | Count | Source | 242 | 2 | {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()() const Line | Count | Source | 242 | 104 | {Builtins::AND(X, Builtins::NOT(X)), [=]{ return Word(0); }}, |
|
243 | 173 | {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 solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#15}::operator()() const Line | Count | Source | 243 | 173 | {Builtins::AND(Builtins::NOT(X), X), [=]{ return Word(0); }}, |
|
244 | 227 | {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()() const Line | Count | Source | 244 | 35 | {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()() const Line | Count | Source | 244 | 192 | {Builtins::OR(X, Builtins::NOT(X)), [=]{ return ~Word(0); }}, |
|
245 | 75 | {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 solidity::evmasm::simplificationRuleListPart4<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#17}::operator()() const Line | Count | Source | 245 | 75 | {Builtins::OR(Builtins::NOT(X), X), [=]{ return ~Word(0); }}, |
|
246 | 47 | }; |
247 | 47 | } 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 | 4 | { | 225 | 4 | using Word = typename Pattern::Word; | 226 | 4 | using Builtins = typename Pattern::Builtins; | 227 | 4 | return std::vector<SimplificationRule<Pattern>> { | 228 | | // logical instruction combinations | 229 | 4 | {Builtins::NOT(Builtins::NOT(X)), [=]{ return X; }}, | 230 | 4 | {Builtins::XOR(X, Builtins::XOR(X, Y)), [=]{ return Y; }}, | 231 | 4 | {Builtins::XOR(X, Builtins::XOR(Y, X)), [=]{ return Y; }}, | 232 | 4 | {Builtins::XOR(Builtins::XOR(X, Y), X), [=]{ return Y; }}, | 233 | 4 | {Builtins::XOR(Builtins::XOR(Y, X), X), [=]{ return Y; }}, | 234 | 4 | {Builtins::OR(X, Builtins::AND(X, Y)), [=]{ return X; }}, | 235 | 4 | {Builtins::OR(X, Builtins::AND(Y, X)), [=]{ return X; }}, | 236 | 4 | {Builtins::OR(Builtins::AND(X, Y), X), [=]{ return X; }}, | 237 | 4 | {Builtins::OR(Builtins::AND(Y, X), X), [=]{ return X; }}, | 238 | 4 | {Builtins::AND(X, Builtins::OR(X, Y)), [=]{ return X; }}, | 239 | 4 | {Builtins::AND(X, Builtins::OR(Y, X)), [=]{ return X; }}, | 240 | 4 | {Builtins::AND(Builtins::OR(X, Y), X), [=]{ return X; }}, | 241 | 4 | {Builtins::AND(Builtins::OR(Y, X), X), [=]{ return X; }}, | 242 | 4 | {Builtins::AND(X, Builtins::NOT(X)), [=]{ return Word(0); }}, | 243 | 4 | {Builtins::AND(Builtins::NOT(X), X), [=]{ return Word(0); }}, | 244 | 4 | {Builtins::OR(X, Builtins::NOT(X)), [=]{ return ~Word(0); }}, | 245 | 4 | {Builtins::OR(Builtins::NOT(X), X), [=]{ return ~Word(0); }}, | 246 | 4 | }; | 247 | 4 | } |
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 | 43 | { | 225 | 43 | using Word = typename Pattern::Word; | 226 | 43 | using Builtins = typename Pattern::Builtins; | 227 | 43 | return std::vector<SimplificationRule<Pattern>> { | 228 | | // logical instruction combinations | 229 | 43 | {Builtins::NOT(Builtins::NOT(X)), [=]{ return X; }}, | 230 | 43 | {Builtins::XOR(X, Builtins::XOR(X, Y)), [=]{ return Y; }}, | 231 | 43 | {Builtins::XOR(X, Builtins::XOR(Y, X)), [=]{ return Y; }}, | 232 | 43 | {Builtins::XOR(Builtins::XOR(X, Y), X), [=]{ return Y; }}, | 233 | 43 | {Builtins::XOR(Builtins::XOR(Y, X), X), [=]{ return Y; }}, | 234 | 43 | {Builtins::OR(X, Builtins::AND(X, Y)), [=]{ return X; }}, | 235 | 43 | {Builtins::OR(X, Builtins::AND(Y, X)), [=]{ return X; }}, | 236 | 43 | {Builtins::OR(Builtins::AND(X, Y), X), [=]{ return X; }}, | 237 | 43 | {Builtins::OR(Builtins::AND(Y, X), X), [=]{ return X; }}, | 238 | 43 | {Builtins::AND(X, Builtins::OR(X, Y)), [=]{ return X; }}, | 239 | 43 | {Builtins::AND(X, Builtins::OR(Y, X)), [=]{ return X; }}, | 240 | 43 | {Builtins::AND(Builtins::OR(X, Y), X), [=]{ return X; }}, | 241 | 43 | {Builtins::AND(Builtins::OR(Y, X), X), [=]{ return X; }}, | 242 | 43 | {Builtins::AND(X, Builtins::NOT(X)), [=]{ return Word(0); }}, | 243 | 43 | {Builtins::AND(Builtins::NOT(X), X), [=]{ return Word(0); }}, | 244 | 43 | {Builtins::OR(X, Builtins::NOT(X)), [=]{ return ~Word(0); }}, | 245 | 43 | {Builtins::OR(Builtins::NOT(X), X), [=]{ return ~Word(0); }}, | 246 | 43 | }; | 247 | 43 | } |
|
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 | 47 | { |
258 | 47 | using Builtins = typename Pattern::Builtins; |
259 | 47 | return std::vector<SimplificationRule<Pattern>>{ |
260 | | // idempotent operations |
261 | 2.31k | {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 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()() const Line | Count | Source | 261 | 2.31k | {Builtins::AND(Builtins::AND(X, Y), Y), [=]{ return Builtins::AND(X, Y); }}, |
|
262 | 922 | {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()() const Line | Count | Source | 262 | 556 | {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()() const Line | Count | Source | 262 | 366 | {Builtins::AND(Y, Builtins::AND(X, Y)), [=]{ return Builtins::AND(X, Y); }}, |
|
263 | 204 | {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 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()() const Line | Count | Source | 263 | 204 | {Builtins::AND(Builtins::AND(Y, X), Y), [=]{ return Builtins::AND(Y, X); }}, |
|
264 | 755 | {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()() const Line | Count | Source | 264 | 225 | {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()() const Line | Count | Source | 264 | 530 | {Builtins::AND(Y, Builtins::AND(Y, X)), [=]{ return Builtins::AND(Y, X); }}, |
|
265 | 619 | {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 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()() const Line | Count | Source | 265 | 619 | {Builtins::OR(Builtins::OR(X, Y), Y), [=]{ return Builtins::OR(X, Y); }}, |
|
266 | 509 | {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()() const Line | Count | Source | 266 | 186 | {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()() const Line | Count | Source | 266 | 323 | {Builtins::OR(Y, Builtins::OR(X, Y)), [=]{ return Builtins::OR(X, Y); }}, |
|
267 | 548 | {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 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()() const Line | Count | Source | 267 | 548 | {Builtins::OR(Builtins::OR(Y, X), Y), [=]{ return Builtins::OR(Y, X); }}, |
|
268 | 1.12k | {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()() const Line | Count | Source | 268 | 459 | {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()() const Line | Count | Source | 268 | 662 | {Builtins::OR(Y, Builtins::OR(Y, X)), [=]{ return Builtins::OR(Y, X); }}, |
|
269 | 240 | {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()() const Line | Count | Source | 269 | 163 | {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()() const Line | Count | Source | 269 | 77 | {Builtins::SIGNEXTEND(X, Builtins::SIGNEXTEND(X, Y)), [=]() { return Builtins::SIGNEXTEND(X, Y); }}, |
|
270 | 1.22k | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { |
271 | 1.22k | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); |
272 | 1.22k | }}, 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()() const Line | Count | Source | 270 | 510 | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { | 271 | 510 | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); | 272 | 510 | }}, |
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()() const Line | Count | Source | 270 | 716 | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { | 271 | 716 | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); | 272 | 716 | }}, |
|
273 | 47 | }; |
274 | 47 | } 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 | 4 | { | 258 | 4 | using Builtins = typename Pattern::Builtins; | 259 | 4 | return std::vector<SimplificationRule<Pattern>>{ | 260 | | // idempotent operations | 261 | 4 | {Builtins::AND(Builtins::AND(X, Y), Y), [=]{ return Builtins::AND(X, Y); }}, | 262 | 4 | {Builtins::AND(Y, Builtins::AND(X, Y)), [=]{ return Builtins::AND(X, Y); }}, | 263 | 4 | {Builtins::AND(Builtins::AND(Y, X), Y), [=]{ return Builtins::AND(Y, X); }}, | 264 | 4 | {Builtins::AND(Y, Builtins::AND(Y, X)), [=]{ return Builtins::AND(Y, X); }}, | 265 | 4 | {Builtins::OR(Builtins::OR(X, Y), Y), [=]{ return Builtins::OR(X, Y); }}, | 266 | 4 | {Builtins::OR(Y, Builtins::OR(X, Y)), [=]{ return Builtins::OR(X, Y); }}, | 267 | 4 | {Builtins::OR(Builtins::OR(Y, X), Y), [=]{ return Builtins::OR(Y, X); }}, | 268 | 4 | {Builtins::OR(Y, Builtins::OR(Y, X)), [=]{ return Builtins::OR(Y, X); }}, | 269 | 4 | {Builtins::SIGNEXTEND(X, Builtins::SIGNEXTEND(X, Y)), [=]() { return Builtins::SIGNEXTEND(X, Y); }}, | 270 | 4 | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { | 271 | 4 | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); | 272 | 4 | }}, | 273 | 4 | }; | 274 | 4 | } |
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 | 43 | { | 258 | 43 | using Builtins = typename Pattern::Builtins; | 259 | 43 | return std::vector<SimplificationRule<Pattern>>{ | 260 | | // idempotent operations | 261 | 43 | {Builtins::AND(Builtins::AND(X, Y), Y), [=]{ return Builtins::AND(X, Y); }}, | 262 | 43 | {Builtins::AND(Y, Builtins::AND(X, Y)), [=]{ return Builtins::AND(X, Y); }}, | 263 | 43 | {Builtins::AND(Builtins::AND(Y, X), Y), [=]{ return Builtins::AND(Y, X); }}, | 264 | 43 | {Builtins::AND(Y, Builtins::AND(Y, X)), [=]{ return Builtins::AND(Y, X); }}, | 265 | 43 | {Builtins::OR(Builtins::OR(X, Y), Y), [=]{ return Builtins::OR(X, Y); }}, | 266 | 43 | {Builtins::OR(Y, Builtins::OR(X, Y)), [=]{ return Builtins::OR(X, Y); }}, | 267 | 43 | {Builtins::OR(Builtins::OR(Y, X), Y), [=]{ return Builtins::OR(Y, X); }}, | 268 | 43 | {Builtins::OR(Y, Builtins::OR(Y, X)), [=]{ return Builtins::OR(Y, X); }}, | 269 | 43 | {Builtins::SIGNEXTEND(X, Builtins::SIGNEXTEND(X, Y)), [=]() { return Builtins::SIGNEXTEND(X, Y); }}, | 270 | 43 | {Builtins::SIGNEXTEND(A, Builtins::SIGNEXTEND(B, X)), [=]() { | 271 | 43 | return Builtins::SIGNEXTEND(A.d() < B.d() ? A.d() : B.d(), X); | 272 | 43 | }}, | 273 | 43 | }; | 274 | 43 | } |
|
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 | 47 | { |
286 | 47 | using Word = typename Pattern::Word; |
287 | 47 | using Builtins = typename Pattern::Builtins; |
288 | | |
289 | 47 | std::vector<SimplificationRule<Pattern>> rules; |
290 | | |
291 | | // The libevmasm optimizer does not support rules resulting in opcodes with more than two arguments. |
292 | 47 | if (_forYulOptimizer) |
293 | 43 | { |
294 | | // Replace MOD(MUL(X, Y), A) with MULMOD(X, Y, A) iff A=2**N |
295 | 43 | rules.push_back({ |
296 | 43 | Builtins::MOD(Builtins::MUL(X, Y), A), |
297 | 177 | [=]() -> 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 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()() const Line | Count | Source | 297 | 177 | [=]() -> Pattern { return Builtins::MULMOD(X, Y, A); }, |
|
298 | 2.43k | [=] { |
299 | 2.43k | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); |
300 | 2.43k | } 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 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()() const Line | Count | Source | 298 | 2.43k | [=] { | 299 | 2.43k | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 300 | 2.43k | } |
|
301 | 43 | }); |
302 | | |
303 | | // Replace MOD(ADD(X, Y), A) with ADDMOD(X, Y, A) iff A=2**N |
304 | 43 | rules.push_back({ |
305 | 43 | Builtins::MOD(Builtins::ADD(X, Y), A), |
306 | 132 | [=]() -> 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 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()() const Line | Count | Source | 306 | 132 | [=]() -> Pattern { return Builtins::ADDMOD(X, Y, A); }, |
|
307 | 2.01k | [=] { |
308 | 2.01k | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); |
309 | 2.01k | } 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 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()() const Line | Count | Source | 307 | 2.01k | [=] { | 308 | 2.01k | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 309 | 2.01k | } |
|
310 | 43 | }); |
311 | 43 | } |
312 | | |
313 | | // Replace MOD X, <power-of-two> with AND X, <power-of-two> - 1 |
314 | 12.0k | for (size_t i = 0; i < Pattern::WordSize; ++i) |
315 | 12.0k | { |
316 | 12.0k | Word value = Word(1) << i; |
317 | 12.0k | rules.push_back({ |
318 | 12.0k | Builtins::MOD(X, value), |
319 | 12.0k | [=]() -> 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()() const Line | Count | Source | 319 | 1.80k | [=]() -> 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()() const Line | Count | Source | 319 | 759 | [=]() -> Pattern { return Builtins::AND(X, value - 1); } |
|
320 | 12.0k | }); |
321 | 12.0k | } |
322 | | |
323 | | // Replace SHL >=256, X with 0 |
324 | 47 | rules.push_back({ |
325 | 47 | Builtins::SHL(A, X), |
326 | 1.25k | [=]() -> 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()() const Line | Count | Source | 326 | 313 | [=]() -> 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()() const Line | Count | Source | 326 | 942 | [=]() -> Pattern { return Word(0); }, |
|
327 | 139k | [=]() { 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()() const Line | Count | Source | 327 | 16.4k | [=]() { 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()() const Line | Count | Source | 327 | 123k | [=]() { return A.d() >= Pattern::WordSize; } |
|
328 | 47 | }); |
329 | | |
330 | | // Replace SHR >=256, X with 0 |
331 | 47 | rules.push_back({ |
332 | 47 | Builtins::SHR(A, X), |
333 | 1.72k | [=]() -> 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()() const Line | Count | Source | 333 | 404 | [=]() -> 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()() const Line | Count | Source | 333 | 1.31k | [=]() -> Pattern { return Word(0); }, |
|
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()() const Line | Count | Source | 334 | 29.3k | [=]() { 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()() const Line | Count | Source | 334 | 108k | [=]() { return A.d() >= Pattern::WordSize; } |
|
335 | 47 | }); |
336 | | |
337 | | // Replace BYTE(A, X), A >= 32 with 0 |
338 | 47 | rules.push_back({ |
339 | 47 | Builtins::BYTE(A, X), |
340 | 1.06k | [=]() -> 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()() const Line | Count | Source | 340 | 326 | [=]() -> 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()() const Line | Count | Source | 340 | 741 | [=]() -> Pattern { return Word(0); }, |
|
341 | 13.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()() const Line | Count | Source | 341 | 3.12k | [=]() { 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()() const Line | Count | Source | 341 | 10.4k | [=]() { return A.d() >= Pattern::WordSize / 8; } |
|
342 | 47 | }); |
343 | | |
344 | | // Replace SIGNEXTEND(A, X), A >= 31 with ID |
345 | 47 | rules.push_back({ |
346 | 47 | Builtins::SIGNEXTEND(A, X), |
347 | 1.72k | [=]() -> 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()() const Line | Count | Source | 347 | 806 | [=]() -> 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()() const Line | Count | Source | 347 | 919 | [=]() -> Pattern { return X; }, |
|
348 | 15.3k | [=]() { 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()() const Line | Count | Source | 348 | 5.92k | [=]() { 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()() const Line | Count | Source | 348 | 9.43k | [=]() { return A.d() >= Pattern::WordSize / 8 - 1; } |
|
349 | 47 | }); |
350 | 47 | rules.push_back({ |
351 | 47 | Builtins::AND(A, Builtins::SIGNEXTEND(B, X)), |
352 | 815 | [=]() -> 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()() const Line | Count | Source | 352 | 725 | [=]() -> 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()() const Line | Count | Source | 352 | 90 | [=]() -> Pattern { return Builtins::AND(A, X); }, |
|
353 | 2.06k | [=]() { |
354 | 2.06k | return |
355 | 2.06k | B.d() < Pattern::WordSize / 8 - 1 && |
356 | 2.06k | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); |
357 | 2.06k | } 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()() const Line | Count | Source | 353 | 1.01k | [=]() { | 354 | 1.01k | return | 355 | 1.01k | B.d() < Pattern::WordSize / 8 - 1 && | 356 | 1.01k | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 357 | 1.01k | } |
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()() const Line | Count | Source | 353 | 1.04k | [=]() { | 354 | 1.04k | return | 355 | 1.04k | B.d() < Pattern::WordSize / 8 - 1 && | 356 | 1.04k | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 357 | 1.04k | } |
|
358 | 47 | }); |
359 | 47 | rules.push_back({ |
360 | 47 | Builtins::AND(Builtins::SIGNEXTEND(B, X), A), |
361 | 1.43k | [=]() -> 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()() const Line | Count | Source | 361 | 1.37k | [=]() -> 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()() const Line | Count | Source | 361 | 67 | [=]() -> Pattern { return Builtins::AND(A, X); }, |
|
362 | 2.71k | [=]() { |
363 | 2.71k | return |
364 | 2.71k | B.d() < Pattern::WordSize / 8 - 1 && |
365 | 2.71k | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); |
366 | 2.71k | } 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()() const Line | Count | Source | 362 | 1.88k | [=]() { | 363 | 1.88k | return | 364 | 1.88k | B.d() < Pattern::WordSize / 8 - 1 && | 365 | 1.88k | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 366 | 1.88k | } |
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()() const Line | Count | Source | 362 | 831 | [=]() { | 363 | 831 | return | 364 | 831 | B.d() < Pattern::WordSize / 8 - 1 && | 365 | 831 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 366 | 831 | } |
|
367 | 47 | }); |
368 | | |
369 | 47 | for (auto instr: { |
370 | 47 | Instruction::ADDRESS, |
371 | 47 | Instruction::CALLER, |
372 | 47 | Instruction::ORIGIN, |
373 | 47 | Instruction::COINBASE |
374 | 47 | }) |
375 | 188 | { |
376 | 188 | assertThrow(Pattern::WordSize > 160, OptimizerException, ""); |
377 | 188 | Word const mask = (Word(1) << 160) - 1; |
378 | 188 | rules.push_back({ |
379 | 188 | Builtins::AND(Pattern{instr}, mask), |
380 | 188 | [=]() -> 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()() const Line | Count | Source | 380 | 4 | [=]() -> 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()() const Line | Count | Source | 380 | 21 | [=]() -> Pattern { return {instr}; } |
|
381 | 188 | }); |
382 | 188 | rules.push_back({ |
383 | 188 | Builtins::AND(mask, Pattern{instr}), |
384 | 188 | [=]() -> Pattern { return {instr}; } 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()#19}::operator()() const 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()() const Line | Count | Source | 384 | 8 | [=]() -> Pattern { return {instr}; } |
|
385 | 188 | }); |
386 | 188 | } |
387 | | |
388 | 47 | return rules; |
389 | 47 | } 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 | 4 | { | 286 | 4 | using Word = typename Pattern::Word; | 287 | 4 | using Builtins = typename Pattern::Builtins; | 288 | | | 289 | 4 | std::vector<SimplificationRule<Pattern>> rules; | 290 | | | 291 | | // The libevmasm optimizer does not support rules resulting in opcodes with more than two arguments. | 292 | 4 | 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 | 1.02k | for (size_t i = 0; i < Pattern::WordSize; ++i) | 315 | 1.02k | { | 316 | 1.02k | Word value = Word(1) << i; | 317 | 1.02k | rules.push_back({ | 318 | 1.02k | Builtins::MOD(X, value), | 319 | 1.02k | [=]() -> Pattern { return Builtins::AND(X, value - 1); } | 320 | 1.02k | }); | 321 | 1.02k | } | 322 | | | 323 | | // Replace SHL >=256, X with 0 | 324 | 4 | rules.push_back({ | 325 | 4 | Builtins::SHL(A, X), | 326 | 4 | [=]() -> Pattern { return Word(0); }, | 327 | 4 | [=]() { return A.d() >= Pattern::WordSize; } | 328 | 4 | }); | 329 | | | 330 | | // Replace SHR >=256, X with 0 | 331 | 4 | rules.push_back({ | 332 | 4 | Builtins::SHR(A, X), | 333 | 4 | [=]() -> Pattern { return Word(0); }, | 334 | 4 | [=]() { return A.d() >= Pattern::WordSize; } | 335 | 4 | }); | 336 | | | 337 | | // Replace BYTE(A, X), A >= 32 with 0 | 338 | 4 | rules.push_back({ | 339 | 4 | Builtins::BYTE(A, X), | 340 | 4 | [=]() -> Pattern { return Word(0); }, | 341 | 4 | [=]() { return A.d() >= Pattern::WordSize / 8; } | 342 | 4 | }); | 343 | | | 344 | | // Replace SIGNEXTEND(A, X), A >= 31 with ID | 345 | 4 | rules.push_back({ | 346 | 4 | Builtins::SIGNEXTEND(A, X), | 347 | 4 | [=]() -> Pattern { return X; }, | 348 | 4 | [=]() { return A.d() >= Pattern::WordSize / 8 - 1; } | 349 | 4 | }); | 350 | 4 | rules.push_back({ | 351 | 4 | Builtins::AND(A, Builtins::SIGNEXTEND(B, X)), | 352 | 4 | [=]() -> Pattern { return Builtins::AND(A, X); }, | 353 | 4 | [=]() { | 354 | 4 | return | 355 | 4 | B.d() < Pattern::WordSize / 8 - 1 && | 356 | 4 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 357 | 4 | } | 358 | 4 | }); | 359 | 4 | rules.push_back({ | 360 | 4 | Builtins::AND(Builtins::SIGNEXTEND(B, X), A), | 361 | 4 | [=]() -> Pattern { return Builtins::AND(A, X); }, | 362 | 4 | [=]() { | 363 | 4 | return | 364 | 4 | B.d() < Pattern::WordSize / 8 - 1 && | 365 | 4 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 366 | 4 | } | 367 | 4 | }); | 368 | | | 369 | 4 | for (auto instr: { | 370 | 4 | Instruction::ADDRESS, | 371 | 4 | Instruction::CALLER, | 372 | 4 | Instruction::ORIGIN, | 373 | 4 | Instruction::COINBASE | 374 | 4 | }) | 375 | 16 | { | 376 | 16 | assertThrow(Pattern::WordSize > 160, OptimizerException, ""); | 377 | 16 | Word const mask = (Word(1) << 160) - 1; | 378 | 16 | rules.push_back({ | 379 | 16 | Builtins::AND(Pattern{instr}, mask), | 380 | 16 | [=]() -> Pattern { return {instr}; } | 381 | 16 | }); | 382 | 16 | rules.push_back({ | 383 | 16 | Builtins::AND(mask, Pattern{instr}), | 384 | 16 | [=]() -> Pattern { return {instr}; } | 385 | 16 | }); | 386 | 16 | } | 387 | | | 388 | 4 | return rules; | 389 | 4 | } |
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 | 43 | { | 286 | 43 | using Word = typename Pattern::Word; | 287 | 43 | using Builtins = typename Pattern::Builtins; | 288 | | | 289 | 43 | std::vector<SimplificationRule<Pattern>> rules; | 290 | | | 291 | | // The libevmasm optimizer does not support rules resulting in opcodes with more than two arguments. | 292 | 43 | if (_forYulOptimizer) | 293 | 43 | { | 294 | | // Replace MOD(MUL(X, Y), A) with MULMOD(X, Y, A) iff A=2**N | 295 | 43 | rules.push_back({ | 296 | 43 | Builtins::MOD(Builtins::MUL(X, Y), A), | 297 | 43 | [=]() -> Pattern { return Builtins::MULMOD(X, Y, A); }, | 298 | 43 | [=] { | 299 | 43 | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 300 | 43 | } | 301 | 43 | }); | 302 | | | 303 | | // Replace MOD(ADD(X, Y), A) with ADDMOD(X, Y, A) iff A=2**N | 304 | 43 | rules.push_back({ | 305 | 43 | Builtins::MOD(Builtins::ADD(X, Y), A), | 306 | 43 | [=]() -> Pattern { return Builtins::ADDMOD(X, Y, A); }, | 307 | 43 | [=] { | 308 | 43 | return A.d() > 0 && ((A.d() & (A.d() - 1)) == 0); | 309 | 43 | } | 310 | 43 | }); | 311 | 43 | } | 312 | | | 313 | | // Replace MOD X, <power-of-two> with AND X, <power-of-two> - 1 | 314 | 11.0k | for (size_t i = 0; i < Pattern::WordSize; ++i) | 315 | 11.0k | { | 316 | 11.0k | Word value = Word(1) << i; | 317 | 11.0k | rules.push_back({ | 318 | 11.0k | Builtins::MOD(X, value), | 319 | 11.0k | [=]() -> Pattern { return Builtins::AND(X, value - 1); } | 320 | 11.0k | }); | 321 | 11.0k | } | 322 | | | 323 | | // Replace SHL >=256, X with 0 | 324 | 43 | rules.push_back({ | 325 | 43 | Builtins::SHL(A, X), | 326 | 43 | [=]() -> Pattern { return Word(0); }, | 327 | 43 | [=]() { return A.d() >= Pattern::WordSize; } | 328 | 43 | }); | 329 | | | 330 | | // Replace SHR >=256, X with 0 | 331 | 43 | rules.push_back({ | 332 | 43 | Builtins::SHR(A, X), | 333 | 43 | [=]() -> Pattern { return Word(0); }, | 334 | 43 | [=]() { return A.d() >= Pattern::WordSize; } | 335 | 43 | }); | 336 | | | 337 | | // Replace BYTE(A, X), A >= 32 with 0 | 338 | 43 | rules.push_back({ | 339 | 43 | Builtins::BYTE(A, X), | 340 | 43 | [=]() -> Pattern { return Word(0); }, | 341 | 43 | [=]() { return A.d() >= Pattern::WordSize / 8; } | 342 | 43 | }); | 343 | | | 344 | | // Replace SIGNEXTEND(A, X), A >= 31 with ID | 345 | 43 | rules.push_back({ | 346 | 43 | Builtins::SIGNEXTEND(A, X), | 347 | 43 | [=]() -> Pattern { return X; }, | 348 | 43 | [=]() { return A.d() >= Pattern::WordSize / 8 - 1; } | 349 | 43 | }); | 350 | 43 | rules.push_back({ | 351 | 43 | Builtins::AND(A, Builtins::SIGNEXTEND(B, X)), | 352 | 43 | [=]() -> Pattern { return Builtins::AND(A, X); }, | 353 | 43 | [=]() { | 354 | 43 | return | 355 | 43 | B.d() < Pattern::WordSize / 8 - 1 && | 356 | 43 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 357 | 43 | } | 358 | 43 | }); | 359 | 43 | rules.push_back({ | 360 | 43 | Builtins::AND(Builtins::SIGNEXTEND(B, X), A), | 361 | 43 | [=]() -> Pattern { return Builtins::AND(A, X); }, | 362 | 43 | [=]() { | 363 | 43 | return | 364 | 43 | B.d() < Pattern::WordSize / 8 - 1 && | 365 | 43 | (A.d() & ((u256(1) << static_cast<size_t>((B.d() + 1) * 8)) - 1)) == A.d(); | 366 | 43 | } | 367 | 43 | }); | 368 | | | 369 | 43 | for (auto instr: { | 370 | 43 | Instruction::ADDRESS, | 371 | 43 | Instruction::CALLER, | 372 | 43 | Instruction::ORIGIN, | 373 | 43 | Instruction::COINBASE | 374 | 43 | }) | 375 | 172 | { | 376 | 172 | assertThrow(Pattern::WordSize > 160, OptimizerException, ""); | 377 | 172 | Word const mask = (Word(1) << 160) - 1; | 378 | 172 | rules.push_back({ | 379 | 172 | Builtins::AND(Pattern{instr}, mask), | 380 | 172 | [=]() -> Pattern { return {instr}; } | 381 | 172 | }); | 382 | 172 | rules.push_back({ | 383 | 172 | Builtins::AND(mask, Pattern{instr}), | 384 | 172 | [=]() -> Pattern { return {instr}; } | 385 | 172 | }); | 386 | 172 | } | 387 | | | 388 | 43 | return rules; | 389 | 43 | } |
|
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 | 47 | { |
400 | 47 | using Builtins = typename Pattern::Builtins; |
401 | | |
402 | 47 | std::vector<SimplificationRule<Pattern>> rules; |
403 | | // Double negation of opcodes with boolean result |
404 | 47 | for (auto instr: { |
405 | 47 | Instruction::EQ, |
406 | 47 | Instruction::LT, |
407 | 47 | Instruction::SLT, |
408 | 47 | Instruction::GT, |
409 | 47 | Instruction::SGT |
410 | 47 | }) |
411 | 235 | { |
412 | 235 | typename Builtins::PatternGeneratorInstance op{instr}; |
413 | 235 | rules.push_back({ |
414 | 235 | Builtins::ISZERO(Builtins::ISZERO(op(X, Y))), |
415 | 59.3k | [=]() -> 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()() const Line | Count | Source | 415 | 58.7k | [=]() -> 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()() const Line | Count | Source | 415 | 588 | [=]() -> Pattern { return op(X, Y); } |
|
416 | 235 | }); |
417 | 235 | } |
418 | | |
419 | 47 | rules.push_back({ |
420 | 47 | Builtins::ISZERO(Builtins::ISZERO(Builtins::ISZERO(X))), |
421 | 17.9k | [=]() -> 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()() const Line | Count | Source | 421 | 10.3k | [=]() -> 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()() const Line | Count | Source | 421 | 7.61k | [=]() -> Pattern { return Builtins::ISZERO(X); } |
|
422 | 47 | }); |
423 | | |
424 | 47 | rules.push_back({ |
425 | 47 | Builtins::ISZERO(Builtins::XOR(X, Y)), |
426 | 5.06k | [=]() -> 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()() const Line | Count | Source | 426 | 2.37k | [=]() -> 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()() const Line | Count | Source | 426 | 2.69k | [=]() -> Pattern { return Builtins::EQ(X, Y); } |
|
427 | 47 | }); |
428 | | |
429 | 47 | rules.push_back({ |
430 | 47 | Builtins::ISZERO(Builtins::SUB(X, Y)), |
431 | 3.45M | [=]() -> 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()() const Line | Count | Source | 431 | 3.45M | [=]() -> 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()() const Line | Count | Source | 431 | 3.19k | [=]() -> Pattern { return Builtins::EQ(X, Y); } |
|
432 | 47 | }); |
433 | | |
434 | 47 | return rules; |
435 | 47 | } 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 | 4 | { | 400 | 4 | using Builtins = typename Pattern::Builtins; | 401 | | | 402 | 4 | std::vector<SimplificationRule<Pattern>> rules; | 403 | | // Double negation of opcodes with boolean result | 404 | 4 | for (auto instr: { | 405 | 4 | Instruction::EQ, | 406 | 4 | Instruction::LT, | 407 | 4 | Instruction::SLT, | 408 | 4 | Instruction::GT, | 409 | 4 | Instruction::SGT | 410 | 4 | }) | 411 | 20 | { | 412 | 20 | typename Builtins::PatternGeneratorInstance op{instr}; | 413 | 20 | rules.push_back({ | 414 | 20 | Builtins::ISZERO(Builtins::ISZERO(op(X, Y))), | 415 | 20 | [=]() -> Pattern { return op(X, Y); } | 416 | 20 | }); | 417 | 20 | } | 418 | | | 419 | 4 | rules.push_back({ | 420 | 4 | Builtins::ISZERO(Builtins::ISZERO(Builtins::ISZERO(X))), | 421 | 4 | [=]() -> Pattern { return Builtins::ISZERO(X); } | 422 | 4 | }); | 423 | | | 424 | 4 | rules.push_back({ | 425 | 4 | Builtins::ISZERO(Builtins::XOR(X, Y)), | 426 | 4 | [=]() -> Pattern { return Builtins::EQ(X, Y); } | 427 | 4 | }); | 428 | | | 429 | 4 | rules.push_back({ | 430 | 4 | Builtins::ISZERO(Builtins::SUB(X, Y)), | 431 | 4 | [=]() -> Pattern { return Builtins::EQ(X, Y); } | 432 | 4 | }); | 433 | | | 434 | 4 | return rules; | 435 | 4 | } |
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 | 43 | { | 400 | 43 | using Builtins = typename Pattern::Builtins; | 401 | | | 402 | 43 | std::vector<SimplificationRule<Pattern>> rules; | 403 | | // Double negation of opcodes with boolean result | 404 | 43 | for (auto instr: { | 405 | 43 | Instruction::EQ, | 406 | 43 | Instruction::LT, | 407 | 43 | Instruction::SLT, | 408 | 43 | Instruction::GT, | 409 | 43 | Instruction::SGT | 410 | 43 | }) | 411 | 215 | { | 412 | 215 | typename Builtins::PatternGeneratorInstance op{instr}; | 413 | 215 | rules.push_back({ | 414 | 215 | Builtins::ISZERO(Builtins::ISZERO(op(X, Y))), | 415 | 215 | [=]() -> Pattern { return op(X, Y); } | 416 | 215 | }); | 417 | 215 | } | 418 | | | 419 | 43 | rules.push_back({ | 420 | 43 | Builtins::ISZERO(Builtins::ISZERO(Builtins::ISZERO(X))), | 421 | 43 | [=]() -> Pattern { return Builtins::ISZERO(X); } | 422 | 43 | }); | 423 | | | 424 | 43 | rules.push_back({ | 425 | 43 | Builtins::ISZERO(Builtins::XOR(X, Y)), | 426 | 43 | [=]() -> Pattern { return Builtins::EQ(X, Y); } | 427 | 43 | }); | 428 | | | 429 | 43 | rules.push_back({ | 430 | 43 | Builtins::ISZERO(Builtins::SUB(X, Y)), | 431 | 43 | [=]() -> Pattern { return Builtins::EQ(X, Y); } | 432 | 43 | }); | 433 | | | 434 | 43 | return rules; | 435 | 43 | } |
|
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 | | ) |
445 | 47 | { |
446 | 47 | using Word = typename Pattern::Word; |
447 | 47 | using Builtins = typename Pattern::Builtins; |
448 | | |
449 | 47 | std::vector<SimplificationRule<Pattern>> rules; |
450 | | // Associative operations |
451 | 47 | for (auto&& instrAndFunc: std::vector<std::pair<Instruction, std::function<Word(Word, Word)>>>{ |
452 | 47 | {Instruction::ADD, std::plus<Word>()}, |
453 | 47 | {Instruction::MUL, std::multiplies<Word>()}, |
454 | 47 | {Instruction::AND, std::bit_and<Word>()}, |
455 | 47 | {Instruction::OR, std::bit_or<Word>()}, |
456 | 47 | {Instruction::XOR, std::bit_xor<Word>()} |
457 | 47 | }) |
458 | 235 | { |
459 | 235 | typename Builtins::PatternGeneratorInstance op{instrAndFunc.first}; |
460 | 235 | std::function<Word(Word, Word)> fun = instrAndFunc.second; |
461 | | // Moving constants to the outside, order matters here - we first add rules |
462 | | // for constants and then for non-constants. |
463 | | // xa can be (X, A) or (A, X) |
464 | 235 | for (auto const& opXA: {op(X, A), op(A, X)}) |
465 | 470 | { |
466 | 470 | rules += std::vector<SimplificationRule<Pattern>>{{ |
467 | | // (X+A)+B -> X+(A+B) |
468 | 470 | op(opXA, B), |
469 | 85.6k | [=]() -> 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)::{lambda()#1}::operator()() const Line | Count | Source | 469 | 27.9k | [=]() -> 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)::{lambda()#1}::operator()() const Line | Count | Source | 469 | 57.7k | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } |
|
470 | 470 | }, { |
471 | | // (X+A)+Y -> (X+Y)+A |
472 | 470 | op(opXA, Y), |
473 | 83.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)::{lambda()#2}::operator()() const Line | Count | Source | 473 | 59.3k | [=]() -> 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)::{lambda()#2}::operator()() const Line | Count | Source | 473 | 23.7k | [=]() -> Pattern { return op(op(X, Y), A); } |
|
474 | 470 | }, { |
475 | | // B+(X+A) -> X+(A+B) |
476 | 470 | op(B, opXA), |
477 | 474k | [=]() -> 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)::{lambda()#3}::operator()() const Line | Count | Source | 477 | 472k | [=]() -> 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)::{lambda()#3}::operator()() const Line | Count | Source | 477 | 2.22k | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } |
|
478 | 470 | }, { |
479 | | // Y+(X+A) -> (Y+X)+A |
480 | 470 | op(Y, opXA), |
481 | 36.0k | [=]() -> 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)::{lambda()#4}::operator()() const Line | Count | Source | 481 | 28.9k | [=]() -> 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)::{lambda()#4}::operator()() const Line | Count | Source | 481 | 7.02k | [=]() -> Pattern { return op(op(Y, X), A); } |
|
482 | 470 | }}; |
483 | 470 | } |
484 | 235 | } |
485 | | |
486 | | // Combine two SHL by constant |
487 | 47 | rules.push_back({ |
488 | | // SHL(B, SHL(A, X)) -> SHL(min(A+B, 256), X) |
489 | 47 | Builtins::SHL(B, Builtins::SHL(A, X)), |
490 | 3.52k | [=]() -> Pattern { |
491 | 3.52k | bigint sum = bigint(A.d()) + B.d(); |
492 | 3.52k | if (sum >= Pattern::WordSize) |
493 | 243 | return Builtins::AND(X, Word(0)); |
494 | 3.28k | else |
495 | 3.28k | return Builtins::SHL(Word(sum), X); |
496 | 3.52k | } solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#5}::operator()() const Line | Count | Source | 490 | 440 | [=]() -> Pattern { | 491 | 440 | bigint sum = bigint(A.d()) + B.d(); | 492 | 440 | if (sum >= Pattern::WordSize) | 493 | 92 | return Builtins::AND(X, Word(0)); | 494 | 348 | else | 495 | 348 | return Builtins::SHL(Word(sum), X); | 496 | 440 | } |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#5}::operator()() const Line | Count | Source | 490 | 3.08k | [=]() -> Pattern { | 491 | 3.08k | bigint sum = bigint(A.d()) + B.d(); | 492 | 3.08k | if (sum >= Pattern::WordSize) | 493 | 151 | return Builtins::AND(X, Word(0)); | 494 | 2.93k | else | 495 | 2.93k | return Builtins::SHL(Word(sum), X); | 496 | 3.08k | } |
|
497 | 47 | }); |
498 | | |
499 | | // Combine two SHR by constant |
500 | 47 | rules.push_back({ |
501 | | // SHR(B, SHR(A, X)) -> SHR(min(A+B, 256), X) |
502 | 47 | Builtins::SHR(B, Builtins::SHR(A, X)), |
503 | 3.51k | [=]() -> Pattern { |
504 | 3.51k | bigint sum = bigint(A.d()) + B.d(); |
505 | 3.51k | if (sum >= Pattern::WordSize) |
506 | 161 | return Builtins::AND(X, Word(0)); |
507 | 3.35k | else |
508 | 3.35k | return Builtins::SHR(Word(sum), X); |
509 | 3.51k | } solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#6}::operator()() const Line | Count | Source | 503 | 640 | [=]() -> Pattern { | 504 | 640 | bigint sum = bigint(A.d()) + B.d(); | 505 | 640 | if (sum >= Pattern::WordSize) | 506 | 3 | return Builtins::AND(X, Word(0)); | 507 | 637 | else | 508 | 637 | return Builtins::SHR(Word(sum), X); | 509 | 640 | } |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() const Line | Count | Source | 503 | 2.87k | [=]() -> Pattern { | 504 | 2.87k | bigint sum = bigint(A.d()) + B.d(); | 505 | 2.87k | if (sum >= Pattern::WordSize) | 506 | 158 | return Builtins::AND(X, Word(0)); | 507 | 2.71k | else | 508 | 2.71k | return Builtins::SHR(Word(sum), X); | 509 | 2.87k | } |
|
510 | 47 | }); |
511 | | |
512 | | // Combine SHL-SHR by constant |
513 | 47 | rules.push_back({ |
514 | | // SHR(B, SHL(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) |
515 | 47 | Builtins::SHR(B, Builtins::SHL(A, X)), |
516 | 9.12k | [=]() -> Pattern { |
517 | 9.12k | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); |
518 | | |
519 | 9.12k | if (A.d() > B.d()) |
520 | 2.66k | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); |
521 | 6.45k | else if (B.d() > A.d()) |
522 | 5.52k | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); |
523 | 934 | else |
524 | 934 | return Builtins::AND(X, mask); |
525 | 9.12k | }, solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#7}::operator()() const Line | Count | Source | 516 | 1.58k | [=]() -> Pattern { | 517 | 1.58k | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); | 518 | | | 519 | 1.58k | if (A.d() > B.d()) | 520 | 391 | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); | 521 | 1.19k | else if (B.d() > A.d()) | 522 | 810 | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); | 523 | 387 | else | 524 | 387 | return Builtins::AND(X, mask); | 525 | 1.58k | }, |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#7}::operator()() const Line | Count | Source | 516 | 7.54k | [=]() -> Pattern { | 517 | 7.54k | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); | 518 | | | 519 | 7.54k | if (A.d() > B.d()) | 520 | 2.27k | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); | 521 | 5.26k | else if (B.d() > A.d()) | 522 | 4.71k | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); | 523 | 547 | else | 524 | 547 | return Builtins::AND(X, mask); | 525 | 7.54k | }, |
|
526 | 9.12k | [=] { 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)::{lambda()#8}::operator()() const Line | Count | Source | 526 | 1.58k | [=] { 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)::{lambda()#8}::operator()() const Line | Count | Source | 526 | 7.54k | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } |
|
527 | 47 | }); |
528 | | |
529 | | // Combine SHR-SHL by constant |
530 | 47 | rules.push_back({ |
531 | | // SHL(B, SHR(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) |
532 | 47 | Builtins::SHL(B, Builtins::SHR(A, X)), |
533 | 11.8k | [=]() -> Pattern { |
534 | 11.8k | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); |
535 | | |
536 | 11.8k | if (A.d() > B.d()) |
537 | 7.22k | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); |
538 | 4.65k | else if (B.d() > A.d()) |
539 | 4.13k | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); |
540 | 526 | else |
541 | 526 | return Builtins::AND(X, mask); |
542 | 11.8k | }, solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#9}::operator()() const Line | Count | Source | 533 | 3.35k | [=]() -> Pattern { | 534 | 3.35k | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); | 535 | | | 536 | 3.35k | if (A.d() > B.d()) | 537 | 1.81k | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); | 538 | 1.54k | else if (B.d() > A.d()) | 539 | 1.37k | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); | 540 | 166 | else | 541 | 166 | return Builtins::AND(X, mask); | 542 | 3.35k | }, |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#9}::operator()() const Line | Count | Source | 533 | 8.52k | [=]() -> Pattern { | 534 | 8.52k | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); | 535 | | | 536 | 8.52k | if (A.d() > B.d()) | 537 | 5.41k | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); | 538 | 3.11k | else if (B.d() > A.d()) | 539 | 2.75k | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); | 540 | 360 | else | 541 | 360 | return Builtins::AND(X, mask); | 542 | 8.52k | }, |
|
543 | 11.8k | [=] { 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)::{lambda()#10}::operator()() const Line | Count | Source | 543 | 3.35k | [=] { 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)::{lambda()#10}::operator()() const Line | Count | Source | 543 | 8.52k | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } |
|
544 | 47 | }); |
545 | | |
546 | | // Move AND with constant across SHL and SHR by constant |
547 | 47 | for (auto instr: {Instruction::SHL, Instruction::SHR}) |
548 | 94 | { |
549 | 94 | typename Builtins::PatternGeneratorInstance shiftOp{instr}; |
550 | 63.2k | auto replacement = [=]() -> Pattern { |
551 | 63.2k | Word mask = |
552 | 63.2k | instr == Instruction::SHL ? |
553 | 36.3k | shlWorkaround(A.d(), unsigned(B.d())) : |
554 | 63.2k | A.d() >> unsigned(B.d()); |
555 | 63.2k | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); |
556 | 63.2k | }; solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#11}::operator()() const Line | Count | Source | 550 | 4.32k | auto replacement = [=]() -> Pattern { | 551 | 4.32k | Word mask = | 552 | 4.32k | instr == Instruction::SHL ? | 553 | 1.48k | shlWorkaround(A.d(), unsigned(B.d())) : | 554 | 4.32k | A.d() >> unsigned(B.d()); | 555 | 4.32k | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); | 556 | 4.32k | }; |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#11}::operator()() const Line | Count | Source | 550 | 58.9k | auto replacement = [=]() -> Pattern { | 551 | 58.9k | Word mask = | 552 | 58.9k | instr == Instruction::SHL ? | 553 | 34.8k | shlWorkaround(A.d(), unsigned(B.d())) : | 554 | 58.9k | A.d() >> unsigned(B.d()); | 555 | 58.9k | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); | 556 | 58.9k | }; |
|
557 | 94 | rules.push_back({ |
558 | | // SH[L/R](B, AND(X, A)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) |
559 | 94 | shiftOp(B, Builtins::AND(X, A)), |
560 | 94 | replacement, |
561 | 61.3k | [=] { 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)::{lambda()#12}::operator()() const Line | Count | Source | 561 | 3.34k | [=] { 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)::{lambda()#12}::operator()() const Line | Count | Source | 561 | 58.0k | [=] { return B.d() < Pattern::WordSize; } |
|
562 | 94 | }); |
563 | 94 | rules.push_back({ |
564 | | // SH[L/R](B, AND(A, X)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) |
565 | 94 | shiftOp(B, Builtins::AND(A, X)), |
566 | 94 | replacement, |
567 | 1.92k | [=] { 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)::{lambda()#13}::operator()() const Line | Count | Source | 567 | 982 | [=] { 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)::{lambda()#13}::operator()() const Line | Count | Source | 567 | 938 | [=] { return B.d() < Pattern::WordSize; } |
|
568 | 94 | }); |
569 | 94 | } |
570 | | |
571 | | // Combine alternating AND/OR/AND with constant, |
572 | | // AND(OR(AND(X, A), Y), B) -> OR(AND(X, A & B), AND(Y, B)) |
573 | | // Many versions due to commutativity. |
574 | 47 | for (auto const& inner: {Builtins::AND(X, A), Builtins::AND(A, X)}) |
575 | 94 | for (auto const& second: {Builtins::OR(inner, Y), Builtins::OR(Y, inner)}) |
576 | 188 | { |
577 | | // We might swap X and Y but this is not an issue anymore. |
578 | 188 | rules.push_back({ |
579 | 188 | Builtins::AND(second, B), |
580 | 483 | [=]() -> 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)::{lambda()#14}::operator()() const Line | Count | Source | 580 | 364 | [=]() -> 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)::{lambda()#14}::operator()() const Line | Count | Source | 580 | 119 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } |
|
581 | 188 | }); |
582 | 188 | rules.push_back({ |
583 | 188 | Builtins::AND(B, second), |
584 | 974 | [=]() -> 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)::{lambda()#15}::operator()() const Line | Count | Source | 584 | 527 | [=]() -> 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)::{lambda()#15}::operator()() const Line | Count | Source | 584 | 447 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } |
|
585 | 188 | }); |
586 | 188 | } |
587 | | |
588 | 47 | rules.push_back({ |
589 | | // MUL(X, SHL(Y, 1)) -> SHL(Y, X) |
590 | 47 | Builtins::MUL(X, Builtins::SHL(Y, Word(1))), |
591 | 71 | [=]() -> Pattern { |
592 | 71 | return Builtins::SHL(Y, X); |
593 | 71 | } solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#16}::operator()() const Line | Count | Source | 591 | 69 | [=]() -> Pattern { | 592 | 69 | return Builtins::SHL(Y, X); | 593 | 69 | } |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#16}::operator()() const Line | Count | Source | 591 | 2 | [=]() -> Pattern { | 592 | 2 | return Builtins::SHL(Y, X); | 593 | 2 | } |
|
594 | 47 | }); |
595 | 47 | rules.push_back({ |
596 | | // MUL(SHL(X, 1), Y) -> SHL(X, Y) |
597 | 47 | Builtins::MUL(Builtins::SHL(X, Word(1)), Y), |
598 | 158 | [=]() -> Pattern { |
599 | 158 | return Builtins::SHL(X, Y); |
600 | 158 | } solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#17}::operator()() const Line | Count | Source | 598 | 70 | [=]() -> Pattern { | 599 | 70 | return Builtins::SHL(X, Y); | 600 | 70 | } |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#17}::operator()() const Line | Count | Source | 598 | 88 | [=]() -> Pattern { | 599 | 88 | return Builtins::SHL(X, Y); | 600 | 88 | } |
|
601 | 47 | }); |
602 | | |
603 | 47 | rules.push_back({ |
604 | | // DIV(X, SHL(Y, 1)) -> SHR(Y, X) |
605 | 47 | Builtins::DIV(X, Builtins::SHL(Y, Word(1))), |
606 | 47 | [=]() -> Pattern { |
607 | 32 | return Builtins::SHR(Y, X); |
608 | 32 | } Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#18}::operator()() const solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#18}::operator()() const Line | Count | Source | 606 | 32 | [=]() -> Pattern { | 607 | 32 | return Builtins::SHR(Y, X); | 608 | 32 | } |
|
609 | 47 | }); |
610 | | |
611 | 35.6k | std::function<bool()> feasibilityFunction = [=]() { |
612 | 35.6k | if (B.d() > Pattern::WordSize) |
613 | 0 | return false; |
614 | 35.6k | unsigned bAsUint = static_cast<unsigned>(B.d()); |
615 | 35.6k | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); |
616 | 35.6k | }; solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#19}::operator()() const Line | Count | Source | 611 | 5.69k | std::function<bool()> feasibilityFunction = [=]() { | 612 | 5.69k | if (B.d() > Pattern::WordSize) | 613 | 0 | return false; | 614 | 5.69k | unsigned bAsUint = static_cast<unsigned>(B.d()); | 615 | 5.69k | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); | 616 | 5.69k | }; |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#19}::operator()() const Line | Count | Source | 611 | 29.9k | std::function<bool()> feasibilityFunction = [=]() { | 612 | 29.9k | if (B.d() > Pattern::WordSize) | 613 | 0 | return false; | 614 | 29.9k | unsigned bAsUint = static_cast<unsigned>(B.d()); | 615 | 29.9k | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); | 616 | 29.9k | }; |
|
617 | | |
618 | 47 | rules.push_back({ |
619 | | // AND(A, SHR(B, X)) -> A & ((2^256-1) >> B) == ((2^256-1) >> B) |
620 | 47 | Builtins::AND(A, Builtins::SHR(B, X)), |
621 | 162 | [=]() -> 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)::{lambda()#20}::operator()() const Line | Count | Source | 621 | 132 | [=]() -> 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)::{lambda()#20}::operator()() const Line | Count | Source | 621 | 30 | [=]() -> Pattern { return Builtins::SHR(B, X); }, |
|
622 | 47 | feasibilityFunction |
623 | 47 | }); |
624 | | |
625 | 47 | rules.push_back({ |
626 | | // AND(SHR(B, X), A) -> ((2^256-1) >> B) & A == ((2^256-1) >> B) |
627 | 47 | Builtins::AND(Builtins::SHR(B, X), A), |
628 | 1.66k | [=]() -> 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)::{lambda()#21}::operator()() const Line | Count | Source | 628 | 625 | [=]() -> 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)::{lambda()#21}::operator()() const Line | Count | Source | 628 | 1.03k | [=]() -> Pattern { return Builtins::SHR(B, X); }, |
|
629 | 47 | feasibilityFunction |
630 | 47 | }); |
631 | | |
632 | 47 | rules.push_back({ |
633 | 47 | Builtins::BYTE(A, Builtins::SHL(B, X)), |
634 | 219 | [=]() -> 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)::{lambda()#22}::operator()() const Line | Count | Source | 634 | 92 | [=]() -> 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)::{lambda()#22}::operator()() const Line | Count | Source | 634 | 127 | [=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); }, |
|
635 | 1.63k | [=] { 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)::{lambda()#23}::operator()() const Line | Count | Source | 635 | 477 | [=] { 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)::{lambda()#23}::operator()() const Line | Count | Source | 635 | 1.15k | [=] { return B.d() % 8 == 0 && A.d() <= 32 && B.d() <= 256; } |
|
636 | 47 | }); |
637 | | |
638 | 47 | rules.push_back({ |
639 | 47 | Builtins::BYTE(A, Builtins::SHR(B, X)), |
640 | 232 | [=]() -> Pattern { return Word(0); }, solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#24}::operator()() const Line | Count | Source | 640 | 21 | [=]() -> 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)::{lambda()#24}::operator()() const Line | Count | Source | 640 | 211 | [=]() -> Pattern { return Word(0); }, |
|
641 | 4.73k | [=] { return A.d() < B.d() / 8; } solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#25}::operator()() const Line | Count | Source | 641 | 579 | [=] { 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)::{lambda()#25}::operator()() const Line | Count | Source | 641 | 4.16k | [=] { return A.d() < B.d() / 8; } |
|
642 | 47 | }); |
643 | | |
644 | 47 | rules.push_back({ |
645 | 47 | Builtins::BYTE(A, Builtins::SHR(B, X)), |
646 | 316 | [=]() -> 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)::{lambda()#26}::operator()() const Line | Count | Source | 646 | 256 | [=]() -> 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)::{lambda()#26}::operator()() const Line | Count | Source | 646 | 60 | [=]() -> Pattern { return Builtins::BYTE(A.d() - B.d() / 8, X); }, |
|
647 | 4.50k | [=] { |
648 | 4.50k | return B.d() % 8 == 0 && A.d() < Pattern::WordSize / 8 && B.d() <= Pattern::WordSize && A.d() >= B.d() / 8; |
649 | 4.50k | } solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#27}::operator()() const Line | Count | Source | 647 | 558 | [=] { | 648 | 558 | return B.d() % 8 == 0 && A.d() < Pattern::WordSize / 8 && B.d() <= Pattern::WordSize && A.d() >= B.d() / 8; | 649 | 558 | } |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#27}::operator()() const Line | Count | Source | 647 | 3.94k | [=] { | 648 | 3.94k | return B.d() % 8 == 0 && A.d() < Pattern::WordSize / 8 && B.d() <= Pattern::WordSize && A.d() >= B.d() / 8; | 649 | 3.94k | } |
|
650 | 47 | }); |
651 | | |
652 | 47 | rules.push_back({ |
653 | 47 | Builtins::SHL(A, Builtins::SIGNEXTEND(B, X)), |
654 | 372 | [=]() -> 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)::{lambda()#28}::operator()() const Line | Count | Source | 654 | 254 | [=]() -> 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)::{lambda()#28}::operator()() const Line | Count | Source | 654 | 118 | [=]() -> Pattern { return Builtins::SIGNEXTEND((A.d() >> 3) + B.d(), Builtins::SHL(A, X)); }, |
|
655 | 894 | [=] { 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)::{lambda()#29}::operator()() const Line | Count | Source | 655 | 452 | [=] { 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)::{lambda()#29}::operator()() const Line | Count | Source | 655 | 442 | [=] { return (A.d() & 7) == 0 && A.d() <= Pattern::WordSize && B.d() <= Pattern::WordSize / 8; } |
|
656 | 47 | }); |
657 | | |
658 | 47 | rules.push_back({ |
659 | 47 | Builtins::SIGNEXTEND(A, Builtins::SHR(B, X)), |
660 | 47 | [=]() -> 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)::{lambda()#30}::operator()() const Unexecuted instantiation: solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#30}::operator()() const |
661 | 559 | [=] { |
662 | 559 | return |
663 | 559 | B.d() % 8 == 0 && |
664 | 559 | B.d() <= Pattern::WordSize && |
665 | 559 | A.d() <= Pattern::WordSize && |
666 | 559 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; |
667 | 559 | } solidity::evmasm::simplificationRuleListPart7<solidity::evmasm::Pattern>(solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern, solidity::evmasm::Pattern)::{lambda()#31}::operator()() const Line | Count | Source | 661 | 184 | [=] { | 662 | 184 | return | 663 | 184 | B.d() % 8 == 0 && | 664 | 184 | B.d() <= Pattern::WordSize && | 665 | 184 | A.d() <= Pattern::WordSize && | 666 | 184 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; | 667 | 184 | } |
solidity::evmasm::simplificationRuleListPart7<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#31}::operator()() const Line | Count | Source | 661 | 375 | [=] { | 662 | 375 | return | 663 | 375 | B.d() % 8 == 0 && | 664 | 375 | B.d() <= Pattern::WordSize && | 665 | 375 | A.d() <= Pattern::WordSize && | 666 | 375 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; | 667 | 375 | } |
|
668 | 47 | }); |
669 | | |
670 | 47 | return rules; |
671 | 47 | } 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) Line | Count | Source | 445 | 4 | { | 446 | 4 | using Word = typename Pattern::Word; | 447 | 4 | using Builtins = typename Pattern::Builtins; | 448 | | | 449 | 4 | std::vector<SimplificationRule<Pattern>> rules; | 450 | | // Associative operations | 451 | 4 | for (auto&& instrAndFunc: std::vector<std::pair<Instruction, std::function<Word(Word, Word)>>>{ | 452 | 4 | {Instruction::ADD, std::plus<Word>()}, | 453 | 4 | {Instruction::MUL, std::multiplies<Word>()}, | 454 | 4 | {Instruction::AND, std::bit_and<Word>()}, | 455 | 4 | {Instruction::OR, std::bit_or<Word>()}, | 456 | 4 | {Instruction::XOR, std::bit_xor<Word>()} | 457 | 4 | }) | 458 | 20 | { | 459 | 20 | typename Builtins::PatternGeneratorInstance op{instrAndFunc.first}; | 460 | 20 | std::function<Word(Word, Word)> fun = instrAndFunc.second; | 461 | | // Moving constants to the outside, order matters here - we first add rules | 462 | | // for constants and then for non-constants. | 463 | | // xa can be (X, A) or (A, X) | 464 | 20 | for (auto const& opXA: {op(X, A), op(A, X)}) | 465 | 40 | { | 466 | 40 | rules += std::vector<SimplificationRule<Pattern>>{{ | 467 | | // (X+A)+B -> X+(A+B) | 468 | 40 | op(opXA, B), | 469 | 40 | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } | 470 | 40 | }, { | 471 | | // (X+A)+Y -> (X+Y)+A | 472 | 40 | op(opXA, Y), | 473 | 40 | [=]() -> Pattern { return op(op(X, Y), A); } | 474 | 40 | }, { | 475 | | // B+(X+A) -> X+(A+B) | 476 | 40 | op(B, opXA), | 477 | 40 | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } | 478 | 40 | }, { | 479 | | // Y+(X+A) -> (Y+X)+A | 480 | 40 | op(Y, opXA), | 481 | 40 | [=]() -> Pattern { return op(op(Y, X), A); } | 482 | 40 | }}; | 483 | 40 | } | 484 | 20 | } | 485 | | | 486 | | // Combine two SHL by constant | 487 | 4 | rules.push_back({ | 488 | | // SHL(B, SHL(A, X)) -> SHL(min(A+B, 256), X) | 489 | 4 | Builtins::SHL(B, Builtins::SHL(A, X)), | 490 | 4 | [=]() -> Pattern { | 491 | 4 | bigint sum = bigint(A.d()) + B.d(); | 492 | 4 | if (sum >= Pattern::WordSize) | 493 | 4 | return Builtins::AND(X, Word(0)); | 494 | 4 | else | 495 | 4 | return Builtins::SHL(Word(sum), X); | 496 | 4 | } | 497 | 4 | }); | 498 | | | 499 | | // Combine two SHR by constant | 500 | 4 | rules.push_back({ | 501 | | // SHR(B, SHR(A, X)) -> SHR(min(A+B, 256), X) | 502 | 4 | Builtins::SHR(B, Builtins::SHR(A, X)), | 503 | 4 | [=]() -> Pattern { | 504 | 4 | bigint sum = bigint(A.d()) + B.d(); | 505 | 4 | if (sum >= Pattern::WordSize) | 506 | 4 | return Builtins::AND(X, Word(0)); | 507 | 4 | else | 508 | 4 | return Builtins::SHR(Word(sum), X); | 509 | 4 | } | 510 | 4 | }); | 511 | | | 512 | | // Combine SHL-SHR by constant | 513 | 4 | rules.push_back({ | 514 | | // SHR(B, SHL(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) | 515 | 4 | Builtins::SHR(B, Builtins::SHL(A, X)), | 516 | 4 | [=]() -> Pattern { | 517 | 4 | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); | 518 | | | 519 | 4 | if (A.d() > B.d()) | 520 | 4 | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); | 521 | 4 | else if (B.d() > A.d()) | 522 | 4 | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); | 523 | 4 | else | 524 | 4 | return Builtins::AND(X, mask); | 525 | 4 | }, | 526 | 4 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } | 527 | 4 | }); | 528 | | | 529 | | // Combine SHR-SHL by constant | 530 | 4 | rules.push_back({ | 531 | | // SHL(B, SHR(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) | 532 | 4 | Builtins::SHL(B, Builtins::SHR(A, X)), | 533 | 4 | [=]() -> Pattern { | 534 | 4 | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); | 535 | | | 536 | 4 | if (A.d() > B.d()) | 537 | 4 | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); | 538 | 4 | else if (B.d() > A.d()) | 539 | 4 | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); | 540 | 4 | else | 541 | 4 | return Builtins::AND(X, mask); | 542 | 4 | }, | 543 | 4 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } | 544 | 4 | }); | 545 | | | 546 | | // Move AND with constant across SHL and SHR by constant | 547 | 4 | for (auto instr: {Instruction::SHL, Instruction::SHR}) | 548 | 8 | { | 549 | 8 | typename Builtins::PatternGeneratorInstance shiftOp{instr}; | 550 | 8 | auto replacement = [=]() -> Pattern { | 551 | 8 | Word mask = | 552 | 8 | instr == Instruction::SHL ? | 553 | 8 | shlWorkaround(A.d(), unsigned(B.d())) : | 554 | 8 | A.d() >> unsigned(B.d()); | 555 | 8 | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); | 556 | 8 | }; | 557 | 8 | rules.push_back({ | 558 | | // SH[L/R](B, AND(X, A)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) | 559 | 8 | shiftOp(B, Builtins::AND(X, A)), | 560 | 8 | replacement, | 561 | 8 | [=] { return B.d() < Pattern::WordSize; } | 562 | 8 | }); | 563 | 8 | rules.push_back({ | 564 | | // SH[L/R](B, AND(A, X)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) | 565 | 8 | shiftOp(B, Builtins::AND(A, X)), | 566 | 8 | replacement, | 567 | 8 | [=] { return B.d() < Pattern::WordSize; } | 568 | 8 | }); | 569 | 8 | } | 570 | | | 571 | | // Combine alternating AND/OR/AND with constant, | 572 | | // AND(OR(AND(X, A), Y), B) -> OR(AND(X, A & B), AND(Y, B)) | 573 | | // Many versions due to commutativity. | 574 | 4 | for (auto const& inner: {Builtins::AND(X, A), Builtins::AND(A, X)}) | 575 | 8 | for (auto const& second: {Builtins::OR(inner, Y), Builtins::OR(Y, inner)}) | 576 | 16 | { | 577 | | // We might swap X and Y but this is not an issue anymore. | 578 | 16 | rules.push_back({ | 579 | 16 | Builtins::AND(second, B), | 580 | 16 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } | 581 | 16 | }); | 582 | 16 | rules.push_back({ | 583 | 16 | Builtins::AND(B, second), | 584 | 16 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } | 585 | 16 | }); | 586 | 16 | } | 587 | | | 588 | 4 | rules.push_back({ | 589 | | // MUL(X, SHL(Y, 1)) -> SHL(Y, X) | 590 | 4 | Builtins::MUL(X, Builtins::SHL(Y, Word(1))), | 591 | 4 | [=]() -> Pattern { | 592 | 4 | return Builtins::SHL(Y, X); | 593 | 4 | } | 594 | 4 | }); | 595 | 4 | rules.push_back({ | 596 | | // MUL(SHL(X, 1), Y) -> SHL(X, Y) | 597 | 4 | Builtins::MUL(Builtins::SHL(X, Word(1)), Y), | 598 | 4 | [=]() -> Pattern { | 599 | 4 | return Builtins::SHL(X, Y); | 600 | 4 | } | 601 | 4 | }); | 602 | | | 603 | 4 | rules.push_back({ | 604 | | // DIV(X, SHL(Y, 1)) -> SHR(Y, X) | 605 | 4 | Builtins::DIV(X, Builtins::SHL(Y, Word(1))), | 606 | 4 | [=]() -> Pattern { | 607 | 4 | return Builtins::SHR(Y, X); | 608 | 4 | } | 609 | 4 | }); | 610 | | | 611 | 4 | std::function<bool()> feasibilityFunction = [=]() { | 612 | 4 | if (B.d() > Pattern::WordSize) | 613 | 4 | return false; | 614 | 4 | unsigned bAsUint = static_cast<unsigned>(B.d()); | 615 | 4 | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); | 616 | 4 | }; | 617 | | | 618 | 4 | rules.push_back({ | 619 | | // AND(A, SHR(B, X)) -> A & ((2^256-1) >> B) == ((2^256-1) >> B) | 620 | 4 | Builtins::AND(A, Builtins::SHR(B, X)), | 621 | 4 | [=]() -> Pattern { return Builtins::SHR(B, X); }, | 622 | 4 | feasibilityFunction | 623 | 4 | }); | 624 | | | 625 | 4 | rules.push_back({ | 626 | | // AND(SHR(B, X), A) -> ((2^256-1) >> B) & A == ((2^256-1) >> B) | 627 | 4 | Builtins::AND(Builtins::SHR(B, X), A), | 628 | 4 | [=]() -> Pattern { return Builtins::SHR(B, X); }, | 629 | 4 | feasibilityFunction | 630 | 4 | }); | 631 | | | 632 | 4 | rules.push_back({ | 633 | 4 | Builtins::BYTE(A, Builtins::SHL(B, X)), | 634 | 4 | [=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); }, | 635 | 4 | [=] { return B.d() % 8 == 0 && A.d() <= 32 && B.d() <= 256; } | 636 | 4 | }); | 637 | | | 638 | 4 | rules.push_back({ | 639 | 4 | Builtins::BYTE(A, Builtins::SHR(B, X)), | 640 | 4 | [=]() -> Pattern { return Word(0); }, | 641 | 4 | [=] { return A.d() < B.d() / 8; } | 642 | 4 | }); | 643 | | | 644 | 4 | rules.push_back({ | 645 | 4 | Builtins::BYTE(A, Builtins::SHR(B, X)), | 646 | 4 | [=]() -> Pattern { return Builtins::BYTE(A.d() - B.d() / 8, X); }, | 647 | 4 | [=] { | 648 | 4 | return B.d() % 8 == 0 && A.d() < Pattern::WordSize / 8 && B.d() <= Pattern::WordSize && A.d() >= B.d() / 8; | 649 | 4 | } | 650 | 4 | }); | 651 | | | 652 | 4 | rules.push_back({ | 653 | 4 | Builtins::SHL(A, Builtins::SIGNEXTEND(B, X)), | 654 | 4 | [=]() -> Pattern { return Builtins::SIGNEXTEND((A.d() >> 3) + B.d(), Builtins::SHL(A, X)); }, | 655 | 4 | [=] { return (A.d() & 7) == 0 && A.d() <= Pattern::WordSize && B.d() <= Pattern::WordSize / 8; } | 656 | 4 | }); | 657 | | | 658 | 4 | rules.push_back({ | 659 | 4 | Builtins::SIGNEXTEND(A, Builtins::SHR(B, X)), | 660 | 4 | [=]() -> Pattern { return Builtins::SAR(B, X); }, | 661 | 4 | [=] { | 662 | 4 | return | 663 | 4 | B.d() % 8 == 0 && | 664 | 4 | B.d() <= Pattern::WordSize && | 665 | 4 | A.d() <= Pattern::WordSize && | 666 | 4 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; | 667 | 4 | } | 668 | 4 | }); | 669 | | | 670 | 4 | return rules; | 671 | 4 | } |
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) Line | Count | Source | 445 | 43 | { | 446 | 43 | using Word = typename Pattern::Word; | 447 | 43 | using Builtins = typename Pattern::Builtins; | 448 | | | 449 | 43 | std::vector<SimplificationRule<Pattern>> rules; | 450 | | // Associative operations | 451 | 43 | for (auto&& instrAndFunc: std::vector<std::pair<Instruction, std::function<Word(Word, Word)>>>{ | 452 | 43 | {Instruction::ADD, std::plus<Word>()}, | 453 | 43 | {Instruction::MUL, std::multiplies<Word>()}, | 454 | 43 | {Instruction::AND, std::bit_and<Word>()}, | 455 | 43 | {Instruction::OR, std::bit_or<Word>()}, | 456 | 43 | {Instruction::XOR, std::bit_xor<Word>()} | 457 | 43 | }) | 458 | 215 | { | 459 | 215 | typename Builtins::PatternGeneratorInstance op{instrAndFunc.first}; | 460 | 215 | std::function<Word(Word, Word)> fun = instrAndFunc.second; | 461 | | // Moving constants to the outside, order matters here - we first add rules | 462 | | // for constants and then for non-constants. | 463 | | // xa can be (X, A) or (A, X) | 464 | 215 | for (auto const& opXA: {op(X, A), op(A, X)}) | 465 | 430 | { | 466 | 430 | rules += std::vector<SimplificationRule<Pattern>>{{ | 467 | | // (X+A)+B -> X+(A+B) | 468 | 430 | op(opXA, B), | 469 | 430 | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } | 470 | 430 | }, { | 471 | | // (X+A)+Y -> (X+Y)+A | 472 | 430 | op(opXA, Y), | 473 | 430 | [=]() -> Pattern { return op(op(X, Y), A); } | 474 | 430 | }, { | 475 | | // B+(X+A) -> X+(A+B) | 476 | 430 | op(B, opXA), | 477 | 430 | [=]() -> Pattern { return op(X, fun(A.d(), B.d())); } | 478 | 430 | }, { | 479 | | // Y+(X+A) -> (Y+X)+A | 480 | 430 | op(Y, opXA), | 481 | 430 | [=]() -> Pattern { return op(op(Y, X), A); } | 482 | 430 | }}; | 483 | 430 | } | 484 | 215 | } | 485 | | | 486 | | // Combine two SHL by constant | 487 | 43 | rules.push_back({ | 488 | | // SHL(B, SHL(A, X)) -> SHL(min(A+B, 256), X) | 489 | 43 | Builtins::SHL(B, Builtins::SHL(A, X)), | 490 | 43 | [=]() -> Pattern { | 491 | 43 | bigint sum = bigint(A.d()) + B.d(); | 492 | 43 | if (sum >= Pattern::WordSize) | 493 | 43 | return Builtins::AND(X, Word(0)); | 494 | 43 | else | 495 | 43 | return Builtins::SHL(Word(sum), X); | 496 | 43 | } | 497 | 43 | }); | 498 | | | 499 | | // Combine two SHR by constant | 500 | 43 | rules.push_back({ | 501 | | // SHR(B, SHR(A, X)) -> SHR(min(A+B, 256), X) | 502 | 43 | Builtins::SHR(B, Builtins::SHR(A, X)), | 503 | 43 | [=]() -> Pattern { | 504 | 43 | bigint sum = bigint(A.d()) + B.d(); | 505 | 43 | if (sum >= Pattern::WordSize) | 506 | 43 | return Builtins::AND(X, Word(0)); | 507 | 43 | else | 508 | 43 | return Builtins::SHR(Word(sum), X); | 509 | 43 | } | 510 | 43 | }); | 511 | | | 512 | | // Combine SHL-SHR by constant | 513 | 43 | rules.push_back({ | 514 | | // SHR(B, SHL(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) | 515 | 43 | Builtins::SHR(B, Builtins::SHL(A, X)), | 516 | 43 | [=]() -> Pattern { | 517 | 43 | Word mask = shlWorkaround(~Word(0), unsigned(A.d())) >> unsigned(B.d()); | 518 | | | 519 | 43 | if (A.d() > B.d()) | 520 | 43 | return Builtins::AND(Builtins::SHL(A.d() - B.d(), X), mask); | 521 | 43 | else if (B.d() > A.d()) | 522 | 43 | return Builtins::AND(Builtins::SHR(B.d() - A.d(), X), mask); | 523 | 43 | else | 524 | 43 | return Builtins::AND(X, mask); | 525 | 43 | }, | 526 | 43 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } | 527 | 43 | }); | 528 | | | 529 | | // Combine SHR-SHL by constant | 530 | 43 | rules.push_back({ | 531 | | // SHL(B, SHR(A, X)) -> AND(SH[L/R]([B - A / A - B], X), Mask) | 532 | 43 | Builtins::SHL(B, Builtins::SHR(A, X)), | 533 | 43 | [=]() -> Pattern { | 534 | 43 | Word mask = shlWorkaround((~Word(0)) >> unsigned(A.d()), unsigned(B.d())); | 535 | | | 536 | 43 | if (A.d() > B.d()) | 537 | 43 | return Builtins::AND(Builtins::SHR(A.d() - B.d(), X), mask); | 538 | 43 | else if (B.d() > A.d()) | 539 | 43 | return Builtins::AND(Builtins::SHL(B.d() - A.d(), X), mask); | 540 | 43 | else | 541 | 43 | return Builtins::AND(X, mask); | 542 | 43 | }, | 543 | 43 | [=] { return A.d() < Pattern::WordSize && B.d() < Pattern::WordSize; } | 544 | 43 | }); | 545 | | | 546 | | // Move AND with constant across SHL and SHR by constant | 547 | 43 | for (auto instr: {Instruction::SHL, Instruction::SHR}) | 548 | 86 | { | 549 | 86 | typename Builtins::PatternGeneratorInstance shiftOp{instr}; | 550 | 86 | auto replacement = [=]() -> Pattern { | 551 | 86 | Word mask = | 552 | 86 | instr == Instruction::SHL ? | 553 | 86 | shlWorkaround(A.d(), unsigned(B.d())) : | 554 | 86 | A.d() >> unsigned(B.d()); | 555 | 86 | return Builtins::AND(shiftOp(B.d(), X), std::move(mask)); | 556 | 86 | }; | 557 | 86 | rules.push_back({ | 558 | | // SH[L/R](B, AND(X, A)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) | 559 | 86 | shiftOp(B, Builtins::AND(X, A)), | 560 | 86 | replacement, | 561 | 86 | [=] { return B.d() < Pattern::WordSize; } | 562 | 86 | }); | 563 | 86 | rules.push_back({ | 564 | | // SH[L/R](B, AND(A, X)) -> AND(SH[L/R](B, X), [ A << B / A >> B ]) | 565 | 86 | shiftOp(B, Builtins::AND(A, X)), | 566 | 86 | replacement, | 567 | 86 | [=] { return B.d() < Pattern::WordSize; } | 568 | 86 | }); | 569 | 86 | } | 570 | | | 571 | | // Combine alternating AND/OR/AND with constant, | 572 | | // AND(OR(AND(X, A), Y), B) -> OR(AND(X, A & B), AND(Y, B)) | 573 | | // Many versions due to commutativity. | 574 | 43 | for (auto const& inner: {Builtins::AND(X, A), Builtins::AND(A, X)}) | 575 | 86 | for (auto const& second: {Builtins::OR(inner, Y), Builtins::OR(Y, inner)}) | 576 | 172 | { | 577 | | // We might swap X and Y but this is not an issue anymore. | 578 | 172 | rules.push_back({ | 579 | 172 | Builtins::AND(second, B), | 580 | 172 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } | 581 | 172 | }); | 582 | 172 | rules.push_back({ | 583 | 172 | Builtins::AND(B, second), | 584 | 172 | [=]() -> Pattern { return Builtins::OR(Builtins::AND(X, A.d() & B.d()), Builtins::AND(Y, B)); } | 585 | 172 | }); | 586 | 172 | } | 587 | | | 588 | 43 | rules.push_back({ | 589 | | // MUL(X, SHL(Y, 1)) -> SHL(Y, X) | 590 | 43 | Builtins::MUL(X, Builtins::SHL(Y, Word(1))), | 591 | 43 | [=]() -> Pattern { | 592 | 43 | return Builtins::SHL(Y, X); | 593 | 43 | } | 594 | 43 | }); | 595 | 43 | rules.push_back({ | 596 | | // MUL(SHL(X, 1), Y) -> SHL(X, Y) | 597 | 43 | Builtins::MUL(Builtins::SHL(X, Word(1)), Y), | 598 | 43 | [=]() -> Pattern { | 599 | 43 | return Builtins::SHL(X, Y); | 600 | 43 | } | 601 | 43 | }); | 602 | | | 603 | 43 | rules.push_back({ | 604 | | // DIV(X, SHL(Y, 1)) -> SHR(Y, X) | 605 | 43 | Builtins::DIV(X, Builtins::SHL(Y, Word(1))), | 606 | 43 | [=]() -> Pattern { | 607 | 43 | return Builtins::SHR(Y, X); | 608 | 43 | } | 609 | 43 | }); | 610 | | | 611 | 43 | std::function<bool()> feasibilityFunction = [=]() { | 612 | 43 | if (B.d() > Pattern::WordSize) | 613 | 43 | return false; | 614 | 43 | unsigned bAsUint = static_cast<unsigned>(B.d()); | 615 | 43 | return (A.d() & ((~Word(0)) >> bAsUint)) == ((~Word(0)) >> bAsUint); | 616 | 43 | }; | 617 | | | 618 | 43 | rules.push_back({ | 619 | | // AND(A, SHR(B, X)) -> A & ((2^256-1) >> B) == ((2^256-1) >> B) | 620 | 43 | Builtins::AND(A, Builtins::SHR(B, X)), | 621 | 43 | [=]() -> Pattern { return Builtins::SHR(B, X); }, | 622 | 43 | feasibilityFunction | 623 | 43 | }); | 624 | | | 625 | 43 | rules.push_back({ | 626 | | // AND(SHR(B, X), A) -> ((2^256-1) >> B) & A == ((2^256-1) >> B) | 627 | 43 | Builtins::AND(Builtins::SHR(B, X), A), | 628 | 43 | [=]() -> Pattern { return Builtins::SHR(B, X); }, | 629 | 43 | feasibilityFunction | 630 | 43 | }); | 631 | | | 632 | 43 | rules.push_back({ | 633 | 43 | Builtins::BYTE(A, Builtins::SHL(B, X)), | 634 | 43 | [=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); }, | 635 | 43 | [=] { return B.d() % 8 == 0 && A.d() <= 32 && B.d() <= 256; } | 636 | 43 | }); | 637 | | | 638 | 43 | rules.push_back({ | 639 | 43 | Builtins::BYTE(A, Builtins::SHR(B, X)), | 640 | 43 | [=]() -> Pattern { return Word(0); }, | 641 | 43 | [=] { return A.d() < B.d() / 8; } | 642 | 43 | }); | 643 | | | 644 | 43 | rules.push_back({ | 645 | 43 | Builtins::BYTE(A, Builtins::SHR(B, X)), | 646 | 43 | [=]() -> Pattern { return Builtins::BYTE(A.d() - B.d() / 8, X); }, | 647 | 43 | [=] { | 648 | 43 | return B.d() % 8 == 0 && A.d() < Pattern::WordSize / 8 && B.d() <= Pattern::WordSize && A.d() >= B.d() / 8; | 649 | 43 | } | 650 | 43 | }); | 651 | | | 652 | 43 | rules.push_back({ | 653 | 43 | Builtins::SHL(A, Builtins::SIGNEXTEND(B, X)), | 654 | 43 | [=]() -> Pattern { return Builtins::SIGNEXTEND((A.d() >> 3) + B.d(), Builtins::SHL(A, X)); }, | 655 | 43 | [=] { return (A.d() & 7) == 0 && A.d() <= Pattern::WordSize && B.d() <= Pattern::WordSize / 8; } | 656 | 43 | }); | 657 | | | 658 | 43 | rules.push_back({ | 659 | 43 | Builtins::SIGNEXTEND(A, Builtins::SHR(B, X)), | 660 | 43 | [=]() -> Pattern { return Builtins::SAR(B, X); }, | 661 | 43 | [=] { | 662 | 43 | return | 663 | 43 | B.d() % 8 == 0 && | 664 | 43 | B.d() <= Pattern::WordSize && | 665 | 43 | A.d() <= Pattern::WordSize && | 666 | 43 | (Pattern::WordSize - B.d()) / 8 == A.d() + 1; | 667 | 43 | } | 668 | 43 | }); | 669 | | | 670 | 43 | return rules; | 671 | 43 | } |
|
672 | | |
673 | | template <class Pattern> |
674 | | std::vector<SimplificationRule<Pattern>> simplificationRuleListPart8( |
675 | | Pattern A, |
676 | | Pattern, |
677 | | Pattern, |
678 | | Pattern X, |
679 | | Pattern Y |
680 | | ) |
681 | 47 | { |
682 | 47 | using Builtins = typename Pattern::Builtins; |
683 | 47 | std::vector<SimplificationRule<Pattern>> rules; |
684 | | |
685 | | // move constants across subtractions |
686 | 47 | rules += std::vector<SimplificationRule<Pattern>>{ |
687 | 47 | { |
688 | | // X - A -> X + (-A) |
689 | 47 | Builtins::SUB(X, A), |
690 | 552k | [=]() -> 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()() const Line | Count | Source | 690 | 249k | [=]() -> 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()() const Line | Count | Source | 690 | 302k | [=]() -> Pattern { return Builtins::ADD(X, 0 - A.d()); } |
|
691 | 47 | }, { |
692 | | // (X + A) - Y -> (X - Y) + A |
693 | 47 | Builtins::SUB(Builtins::ADD(X, A), Y), |
694 | 187k | [=]() -> 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()() const Line | Count | Source | 694 | 59.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()() const Line | Count | Source | 694 | 127k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } |
|
695 | 47 | }, { |
696 | | // (A + X) - Y -> (X - Y) + A |
697 | 47 | Builtins::SUB(Builtins::ADD(A, X), Y), |
698 | 680k | [=]() -> 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()() const Line | Count | Source | 698 | 673k | [=]() -> 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()() const Line | Count | Source | 698 | 7.23k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } |
|
699 | 47 | }, { |
700 | | // X - (Y + A) -> (X - Y) + (-A) |
701 | 47 | Builtins::SUB(X, Builtins::ADD(Y, A)), |
702 | 87.8k | [=]() -> 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()() const Line | Count | Source | 702 | 15.5k | [=]() -> 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()() const Line | Count | Source | 702 | 72.3k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } |
|
703 | 47 | }, { |
704 | | // X - (A + Y) -> (X - Y) + (-A) |
705 | 47 | Builtins::SUB(X, Builtins::ADD(A, Y)), |
706 | 781k | [=]() -> 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()() const Line | Count | Source | 706 | 774k | [=]() -> 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()() const Line | Count | Source | 706 | 7.21k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } |
|
707 | 47 | }, { |
708 | | // (X - A) - Y -> (X - Y) - A |
709 | 47 | Builtins::SUB(Builtins::SUB(X, A), Y), |
710 | 869 | [=]() -> Pattern { return Builtins::SUB(Builtins::SUB(X, Y), A); } Unexecuted 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 solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#6}::operator()() const Line | Count | Source | 710 | 869 | [=]() -> Pattern { return Builtins::SUB(Builtins::SUB(X, Y), A); } |
|
711 | 47 | }, { |
712 | | // (A - X) - Y -> A - (X + Y) |
713 | 47 | Builtins::SUB(Builtins::SUB(A, X), Y), |
714 | 6.10k | [=]() -> 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()() const Line | Count | Source | 714 | 677 | [=]() -> 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()() const Line | Count | Source | 714 | 5.42k | [=]() -> Pattern { return Builtins::SUB(A, Builtins::ADD(X, Y)); } |
|
715 | 47 | }, { |
716 | | // X - (Y - A) -> (X - Y) + A |
717 | 47 | Builtins::SUB(X, Builtins::SUB(Y, A)), |
718 | 2.58k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A.d()); } Unexecuted 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 solidity::evmasm::simplificationRuleListPart8<solidity::yul::Pattern>(solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern, solidity::yul::Pattern)::{lambda()#8}::operator()() const Line | Count | Source | 718 | 2.58k | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A.d()); } |
|
719 | 47 | }, { |
720 | | // X - (A - Y) -> (X + Y) + (-A) |
721 | 47 | Builtins::SUB(X, Builtins::SUB(A, Y)), |
722 | 6.03k | [=]() -> 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()() const Line | Count | Source | 722 | 1.05k | [=]() -> 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()() const Line | Count | Source | 722 | 4.98k | [=]() -> Pattern { return Builtins::ADD(Builtins::ADD(X, Y), 0 - A.d()); } |
|
723 | 47 | } |
724 | 47 | }; |
725 | 47 | return rules; |
726 | 47 | } 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 | 681 | 4 | { | 682 | 4 | using Builtins = typename Pattern::Builtins; | 683 | 4 | std::vector<SimplificationRule<Pattern>> rules; | 684 | | | 685 | | // move constants across subtractions | 686 | 4 | rules += std::vector<SimplificationRule<Pattern>>{ | 687 | 4 | { | 688 | | // X - A -> X + (-A) | 689 | 4 | Builtins::SUB(X, A), | 690 | 4 | [=]() -> Pattern { return Builtins::ADD(X, 0 - A.d()); } | 691 | 4 | }, { | 692 | | // (X + A) - Y -> (X - Y) + A | 693 | 4 | Builtins::SUB(Builtins::ADD(X, A), Y), | 694 | 4 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } | 695 | 4 | }, { | 696 | | // (A + X) - Y -> (X - Y) + A | 697 | 4 | Builtins::SUB(Builtins::ADD(A, X), Y), | 698 | 4 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } | 699 | 4 | }, { | 700 | | // X - (Y + A) -> (X - Y) + (-A) | 701 | 4 | Builtins::SUB(X, Builtins::ADD(Y, A)), | 702 | 4 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } | 703 | 4 | }, { | 704 | | // X - (A + Y) -> (X - Y) + (-A) | 705 | 4 | Builtins::SUB(X, Builtins::ADD(A, Y)), | 706 | 4 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } | 707 | 4 | }, { | 708 | | // (X - A) - Y -> (X - Y) - A | 709 | 4 | Builtins::SUB(Builtins::SUB(X, A), Y), | 710 | 4 | [=]() -> Pattern { return Builtins::SUB(Builtins::SUB(X, Y), A); } | 711 | 4 | }, { | 712 | | // (A - X) - Y -> A - (X + Y) | 713 | 4 | Builtins::SUB(Builtins::SUB(A, X), Y), | 714 | 4 | [=]() -> Pattern { return Builtins::SUB(A, Builtins::ADD(X, Y)); } | 715 | 4 | }, { | 716 | | // X - (Y - A) -> (X - Y) + A | 717 | 4 | Builtins::SUB(X, Builtins::SUB(Y, A)), | 718 | 4 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A.d()); } | 719 | 4 | }, { | 720 | | // X - (A - Y) -> (X + Y) + (-A) | 721 | 4 | Builtins::SUB(X, Builtins::SUB(A, Y)), | 722 | 4 | [=]() -> Pattern { return Builtins::ADD(Builtins::ADD(X, Y), 0 - A.d()); } | 723 | 4 | } | 724 | 4 | }; | 725 | 4 | return rules; | 726 | 4 | } |
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 | 681 | 43 | { | 682 | 43 | using Builtins = typename Pattern::Builtins; | 683 | 43 | std::vector<SimplificationRule<Pattern>> rules; | 684 | | | 685 | | // move constants across subtractions | 686 | 43 | rules += std::vector<SimplificationRule<Pattern>>{ | 687 | 43 | { | 688 | | // X - A -> X + (-A) | 689 | 43 | Builtins::SUB(X, A), | 690 | 43 | [=]() -> Pattern { return Builtins::ADD(X, 0 - A.d()); } | 691 | 43 | }, { | 692 | | // (X + A) - Y -> (X - Y) + A | 693 | 43 | Builtins::SUB(Builtins::ADD(X, A), Y), | 694 | 43 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } | 695 | 43 | }, { | 696 | | // (A + X) - Y -> (X - Y) + A | 697 | 43 | Builtins::SUB(Builtins::ADD(A, X), Y), | 698 | 43 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A); } | 699 | 43 | }, { | 700 | | // X - (Y + A) -> (X - Y) + (-A) | 701 | 43 | Builtins::SUB(X, Builtins::ADD(Y, A)), | 702 | 43 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } | 703 | 43 | }, { | 704 | | // X - (A + Y) -> (X - Y) + (-A) | 705 | 43 | Builtins::SUB(X, Builtins::ADD(A, Y)), | 706 | 43 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), 0 - A.d()); } | 707 | 43 | }, { | 708 | | // (X - A) - Y -> (X - Y) - A | 709 | 43 | Builtins::SUB(Builtins::SUB(X, A), Y), | 710 | 43 | [=]() -> Pattern { return Builtins::SUB(Builtins::SUB(X, Y), A); } | 711 | 43 | }, { | 712 | | // (A - X) - Y -> A - (X + Y) | 713 | 43 | Builtins::SUB(Builtins::SUB(A, X), Y), | 714 | 43 | [=]() -> Pattern { return Builtins::SUB(A, Builtins::ADD(X, Y)); } | 715 | 43 | }, { | 716 | | // X - (Y - A) -> (X - Y) + A | 717 | 43 | Builtins::SUB(X, Builtins::SUB(Y, A)), | 718 | 43 | [=]() -> Pattern { return Builtins::ADD(Builtins::SUB(X, Y), A.d()); } | 719 | 43 | }, { | 720 | | // X - (A - Y) -> (X + Y) + (-A) | 721 | 43 | Builtins::SUB(X, Builtins::SUB(A, Y)), | 722 | 43 | [=]() -> Pattern { return Builtins::ADD(Builtins::ADD(X, Y), 0 - A.d()); } | 723 | 43 | } | 724 | 43 | }; | 725 | 43 | return rules; | 726 | 43 | } |
|
727 | | |
728 | | template<class Pattern> |
729 | | std::vector<SimplificationRule<Pattern>> evmRuleList( |
730 | | langutil::EVMVersion _evmVersion, |
731 | | Pattern A, |
732 | | Pattern, |
733 | | Pattern, |
734 | | Pattern, |
735 | | Pattern X, |
736 | | Pattern, |
737 | | Pattern |
738 | | ) |
739 | 43 | { |
740 | 43 | using Builtins = typename Pattern::Builtins; |
741 | 43 | using Word = typename Pattern::Word; |
742 | 43 | std::vector<SimplificationRule<Pattern>> rules; |
743 | | |
744 | 43 | if (_evmVersion.hasSelfBalance()) |
745 | 13 | rules.push_back({ |
746 | 13 | Builtins::BALANCE(Instruction::ADDRESS), |
747 | 53 | []() -> 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 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()() const Line | Count | Source | 747 | 53 | []() -> Pattern { return Instruction::SELFBALANCE; } |
|
748 | 13 | }); |
749 | | |
750 | 43 | rules.emplace_back( |
751 | 43 | Builtins::EXP(0, X), |
752 | 1.43k | [=]() -> 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 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()() const Line | Count | Source | 752 | 1.43k | [=]() -> Pattern { return Builtins::ISZERO(X); } |
|
753 | 43 | ); |
754 | 43 | rules.emplace_back( |
755 | 43 | Builtins::EXP(1, X), |
756 | 1.13k | [=]() -> 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 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()() const Line | Count | Source | 756 | 1.13k | [=]() -> Pattern { return Word(1); } |
|
757 | 43 | ); |
758 | 43 | if (_evmVersion.hasBitwiseShifting()) |
759 | 23 | { |
760 | 23 | rules.emplace_back( |
761 | 23 | Builtins::EXP(2, X), |
762 | 1.21k | [=]() -> 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 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()() const Line | Count | Source | 762 | 1.21k | [=]() -> Pattern { return Builtins::SHL(X, 1); } |
|
763 | 23 | ); |
764 | 23 | rules.emplace_back( |
765 | 23 | Builtins::MUL(A, X), |
766 | 3.47k | [=]() -> 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 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()() const Line | Count | Source | 766 | 3.47k | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); }, |
|
767 | 42.6k | [=] { 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 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()() const Line | Count | Source | 767 | 42.6k | [=] { return binaryLogarithm(A.d()).has_value(); } |
|
768 | 23 | ); |
769 | 23 | rules.emplace_back( |
770 | 23 | Builtins::MUL(X, A), |
771 | 4.27k | [=]() -> 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 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()() const Line | Count | Source | 771 | 4.27k | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); }, |
|
772 | 38.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()#8}::operator()() const 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()() const Line | Count | Source | 772 | 38.3k | [=] { return binaryLogarithm(A.d()).has_value(); } |
|
773 | 23 | ); |
774 | 23 | rules.emplace_back( |
775 | 23 | Builtins::DIV(X, A), |
776 | 2.61k | [=]() -> 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 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()() const Line | Count | Source | 776 | 2.61k | [=]() -> Pattern { return Builtins::SHR(u256(*binaryLogarithm(A.d())), X); }, |
|
777 | 40.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 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()() const Line | Count | Source | 777 | 40.3k | [=] { return binaryLogarithm(A.d()).has_value(); } |
|
778 | 23 | ); |
779 | 23 | } |
780 | 43 | rules.emplace_back( |
781 | 43 | Builtins::EXP(Word(-1), X), |
782 | 43 | [=]() -> Pattern |
783 | 123 | { |
784 | 123 | return Builtins::SUB( |
785 | 123 | Builtins::ISZERO(Builtins::AND(X, Word(1))), |
786 | 123 | Builtins::AND(X, Word(1)) |
787 | 123 | ); |
788 | 123 | } 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 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()() const Line | Count | Source | 783 | 123 | { | 784 | 123 | return Builtins::SUB( | 785 | 123 | Builtins::ISZERO(Builtins::AND(X, Word(1))), | 786 | 123 | Builtins::AND(X, Word(1)) | 787 | 123 | ); | 788 | 123 | } |
|
789 | 43 | ); |
790 | | |
791 | 43 | return rules; |
792 | 43 | } 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) 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 | 739 | 43 | { | 740 | 43 | using Builtins = typename Pattern::Builtins; | 741 | 43 | using Word = typename Pattern::Word; | 742 | 43 | std::vector<SimplificationRule<Pattern>> rules; | 743 | | | 744 | 43 | if (_evmVersion.hasSelfBalance()) | 745 | 13 | rules.push_back({ | 746 | 13 | Builtins::BALANCE(Instruction::ADDRESS), | 747 | 13 | []() -> Pattern { return Instruction::SELFBALANCE; } | 748 | 13 | }); | 749 | | | 750 | 43 | rules.emplace_back( | 751 | 43 | Builtins::EXP(0, X), | 752 | 43 | [=]() -> Pattern { return Builtins::ISZERO(X); } | 753 | 43 | ); | 754 | 43 | rules.emplace_back( | 755 | 43 | Builtins::EXP(1, X), | 756 | 43 | [=]() -> Pattern { return Word(1); } | 757 | 43 | ); | 758 | 43 | if (_evmVersion.hasBitwiseShifting()) | 759 | 23 | { | 760 | 23 | rules.emplace_back( | 761 | 23 | Builtins::EXP(2, X), | 762 | 23 | [=]() -> Pattern { return Builtins::SHL(X, 1); } | 763 | 23 | ); | 764 | 23 | rules.emplace_back( | 765 | 23 | Builtins::MUL(A, X), | 766 | 23 | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); }, | 767 | 23 | [=] { return binaryLogarithm(A.d()).has_value(); } | 768 | 23 | ); | 769 | 23 | rules.emplace_back( | 770 | 23 | Builtins::MUL(X, A), | 771 | 23 | [=]() -> Pattern { return Builtins::SHL(u256(*binaryLogarithm(A.d())), X); }, | 772 | 23 | [=] { return binaryLogarithm(A.d()).has_value(); } | 773 | 23 | ); | 774 | 23 | rules.emplace_back( | 775 | 23 | Builtins::DIV(X, A), | 776 | 23 | [=]() -> Pattern { return Builtins::SHR(u256(*binaryLogarithm(A.d())), X); }, | 777 | 23 | [=] { return binaryLogarithm(A.d()).has_value(); } | 778 | 23 | ); | 779 | 23 | } | 780 | 43 | rules.emplace_back( | 781 | 43 | Builtins::EXP(Word(-1), X), | 782 | 43 | [=]() -> Pattern | 783 | 43 | { | 784 | 43 | return Builtins::SUB( | 785 | 43 | Builtins::ISZERO(Builtins::AND(X, Word(1))), | 786 | 43 | Builtins::AND(X, Word(1)) | 787 | 43 | ); | 788 | 43 | } | 789 | 43 | ); | 790 | | | 791 | 43 | return rules; | 792 | 43 | } |
|
793 | | |
794 | | /// @returns a list of simplification rules given certain match placeholders. |
795 | | /// A, B and C should represent constants, W, X, Y, and Z arbitrary expressions. |
796 | | /// The simplifications should never change the order of evaluation of |
797 | | /// arbitrary operations. |
798 | | template <class Pattern> |
799 | | std::vector<SimplificationRule<Pattern>> simplificationRuleList( |
800 | | std::optional<langutil::EVMVersion> _evmVersion, |
801 | | Pattern A, |
802 | | Pattern B, |
803 | | Pattern C, |
804 | | Pattern W, |
805 | | Pattern X, |
806 | | Pattern Y, |
807 | | Pattern Z |
808 | | ) |
809 | 47 | { |
810 | 47 | using Word = typename Pattern::Word; |
811 | | // Some sanity checks |
812 | 47 | assertThrow(Pattern::WordSize % 8 == 0, OptimizerException, ""); |
813 | 47 | assertThrow(Pattern::WordSize >= 8, OptimizerException, ""); |
814 | 47 | assertThrow(Pattern::WordSize <= 256, OptimizerException, ""); |
815 | 47 | assertThrow(Word(-1) == ~Word(0), OptimizerException, ""); |
816 | 47 | assertThrow(Word(-1) + 1 == Word(0), OptimizerException, ""); |
817 | | |
818 | 47 | std::vector<SimplificationRule<Pattern>> rules; |
819 | 47 | rules += simplificationRuleListPart1(A, B, C, W, X); |
820 | 47 | rules += simplificationRuleListPart2(A, B, C, W, X); |
821 | 47 | rules += simplificationRuleListPart3(A, B, C, W, X); |
822 | 47 | rules += simplificationRuleListPart4(A, B, C, W, X); |
823 | 47 | rules += simplificationRuleListPart4_5(A, B, C, W, X); |
824 | 47 | rules += simplificationRuleListPart5(_evmVersion.has_value(), A, B, C, W, X); |
825 | 47 | rules += simplificationRuleListPart6(A, B, C, W, X); |
826 | 47 | rules += simplificationRuleListPart7(A, B, C, W, X); |
827 | 47 | rules += simplificationRuleListPart8(A, B, C, W, X); |
828 | | |
829 | 47 | if (_evmVersion.has_value()) |
830 | 43 | rules += evmRuleList(*_evmVersion, A, B, C, W, X, Y, Z); |
831 | | |
832 | 47 | return rules; |
833 | 47 | } 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 | 809 | 4 | { | 810 | 4 | using Word = typename Pattern::Word; | 811 | | // Some sanity checks | 812 | 4 | assertThrow(Pattern::WordSize % 8 == 0, OptimizerException, ""); | 813 | 4 | assertThrow(Pattern::WordSize >= 8, OptimizerException, ""); | 814 | 4 | assertThrow(Pattern::WordSize <= 256, OptimizerException, ""); | 815 | 4 | assertThrow(Word(-1) == ~Word(0), OptimizerException, ""); | 816 | 4 | assertThrow(Word(-1) + 1 == Word(0), OptimizerException, ""); | 817 | | | 818 | 4 | std::vector<SimplificationRule<Pattern>> rules; | 819 | 4 | rules += simplificationRuleListPart1(A, B, C, W, X); | 820 | 4 | rules += simplificationRuleListPart2(A, B, C, W, X); | 821 | 4 | rules += simplificationRuleListPart3(A, B, C, W, X); | 822 | 4 | rules += simplificationRuleListPart4(A, B, C, W, X); | 823 | 4 | rules += simplificationRuleListPart4_5(A, B, C, W, X); | 824 | 4 | rules += simplificationRuleListPart5(_evmVersion.has_value(), A, B, C, W, X); | 825 | 4 | rules += simplificationRuleListPart6(A, B, C, W, X); | 826 | 4 | rules += simplificationRuleListPart7(A, B, C, W, X); | 827 | 4 | rules += simplificationRuleListPart8(A, B, C, W, X); | 828 | | | 829 | 4 | if (_evmVersion.has_value()) | 830 | 0 | rules += evmRuleList(*_evmVersion, A, B, C, W, X, Y, Z); | 831 | | | 832 | 4 | return rules; | 833 | 4 | } |
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 | 809 | 43 | { | 810 | 43 | using Word = typename Pattern::Word; | 811 | | // Some sanity checks | 812 | 43 | assertThrow(Pattern::WordSize % 8 == 0, OptimizerException, ""); | 813 | 43 | assertThrow(Pattern::WordSize >= 8, OptimizerException, ""); | 814 | 43 | assertThrow(Pattern::WordSize <= 256, OptimizerException, ""); | 815 | 43 | assertThrow(Word(-1) == ~Word(0), OptimizerException, ""); | 816 | 43 | assertThrow(Word(-1) + 1 == Word(0), OptimizerException, ""); | 817 | | | 818 | 43 | std::vector<SimplificationRule<Pattern>> rules; | 819 | 43 | rules += simplificationRuleListPart1(A, B, C, W, X); | 820 | 43 | rules += simplificationRuleListPart2(A, B, C, W, X); | 821 | 43 | rules += simplificationRuleListPart3(A, B, C, W, X); | 822 | 43 | rules += simplificationRuleListPart4(A, B, C, W, X); | 823 | 43 | rules += simplificationRuleListPart4_5(A, B, C, W, X); | 824 | 43 | rules += simplificationRuleListPart5(_evmVersion.has_value(), A, B, C, W, X); | 825 | 43 | rules += simplificationRuleListPart6(A, B, C, W, X); | 826 | 43 | rules += simplificationRuleListPart7(A, B, C, W, X); | 827 | 43 | rules += simplificationRuleListPart8(A, B, C, W, X); | 828 | | | 829 | 43 | if (_evmVersion.has_value()) | 830 | 43 | rules += evmRuleList(*_evmVersion, A, B, C, W, X, Y, Z); | 831 | | | 832 | 43 | return rules; | 833 | 43 | } |
|
834 | | |
835 | | } |