Coverage Report

Created: 2026-06-30 07:08

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