Skip to content

Commit a5a65ee

Browse files
authored
Merge pull request #12761 from ethereum/simplifyPeepholeOptimizerTemplate
Simplify peephole optimizer template.
2 parents c6fcb6c + 859869c commit a5a65ee

File tree

1 file changed

+24
-47
lines changed

1 file changed

+24
-47
lines changed

libevmasm/PeepholeOptimiser.cpp

Lines changed: 24 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -41,51 +41,28 @@ struct OptimiserState
4141
std::back_insert_iterator<AssemblyItems> out;
4242
};
4343

44-
template <class Method, size_t Arguments>
45-
struct ApplyRule
44+
template<typename FunctionType>
45+
struct FunctionParameterCount;
46+
template<typename R, typename... Args>
47+
struct FunctionParameterCount<R(Args...)>
4648
{
49+
static constexpr auto value = sizeof...(Args);
4750
};
51+
4852
template <class Method>
49-
struct ApplyRule<Method, 4>
50-
{
51-
static bool applyRule(AssemblyItems::const_iterator _in, std::back_insert_iterator<AssemblyItems> _out)
52-
{
53-
return Method::applySimple(_in[0], _in[1], _in[2], _in[3], _out);
54-
}
55-
};
56-
template <class Method>
57-
struct ApplyRule<Method, 3>
58-
{
59-
static bool applyRule(AssemblyItems::const_iterator _in, std::back_insert_iterator<AssemblyItems> _out)
60-
{
61-
return Method::applySimple(_in[0], _in[1], _in[2], _out);
62-
}
63-
};
64-
template <class Method>
65-
struct ApplyRule<Method, 2>
66-
{
67-
static bool applyRule(AssemblyItems::const_iterator _in, std::back_insert_iterator<AssemblyItems> _out)
68-
{
69-
return Method::applySimple(_in[0], _in[1], _out);
70-
}
71-
};
72-
template <class Method>
73-
struct ApplyRule<Method, 1>
53+
struct SimplePeepholeOptimizerMethod
7454
{
75-
static bool applyRule(AssemblyItems::const_iterator _in, std::back_insert_iterator<AssemblyItems> _out)
55+
template <size_t... Indices>
56+
static bool applyRule(AssemblyItems::const_iterator _in, back_insert_iterator<AssemblyItems> _out, index_sequence<Indices...>)
7657
{
77-
return Method::applySimple(_in[0], _out);
58+
return Method::applySimple(_in[Indices]..., _out);
7859
}
79-
};
80-
81-
template <class Method, size_t WindowSize>
82-
struct SimplePeepholeOptimizerMethod
83-
{
8460
static bool apply(OptimiserState& _state)
8561
{
62+
static constexpr size_t WindowSize = FunctionParameterCount<decltype(Method::applySimple)>::value - 1;
8663
if (
8764
_state.i + WindowSize <= _state.items.size() &&
88-
ApplyRule<Method, WindowSize>::applyRule(_state.items.begin() + static_cast<ptrdiff_t>(_state.i), _state.out)
65+
applyRule(_state.items.begin() + static_cast<ptrdiff_t>(_state.i), _state.out, make_index_sequence<WindowSize>{})
8966
)
9067
{
9168
_state.i += WindowSize;
@@ -96,7 +73,7 @@ struct SimplePeepholeOptimizerMethod
9673
}
9774
};
9875

99-
struct Identity: SimplePeepholeOptimizerMethod<Identity, 1>
76+
struct Identity: SimplePeepholeOptimizerMethod<Identity>
10077
{
10178
static bool applySimple(AssemblyItem const& _item, std::back_insert_iterator<AssemblyItems> _out)
10279
{
@@ -105,7 +82,7 @@ struct Identity: SimplePeepholeOptimizerMethod<Identity, 1>
10582
}
10683
};
10784

108-
struct PushPop: SimplePeepholeOptimizerMethod<PushPop, 2>
85+
struct PushPop: SimplePeepholeOptimizerMethod<PushPop>
10986
{
11087
static bool applySimple(AssemblyItem const& _push, AssemblyItem const& _pop, std::back_insert_iterator<AssemblyItems>)
11188
{
@@ -118,7 +95,7 @@ struct PushPop: SimplePeepholeOptimizerMethod<PushPop, 2>
11895
}
11996
};
12097

121-
struct OpPop: SimplePeepholeOptimizerMethod<OpPop, 2>
98+
struct OpPop: SimplePeepholeOptimizerMethod<OpPop>
12299
{
123100
static bool applySimple(
124101
AssemblyItem const& _op,
@@ -140,15 +117,15 @@ struct OpPop: SimplePeepholeOptimizerMethod<OpPop, 2>
140117
}
141118
};
142119

143-
struct DoubleSwap: SimplePeepholeOptimizerMethod<DoubleSwap, 2>
120+
struct DoubleSwap: SimplePeepholeOptimizerMethod<DoubleSwap>
144121
{
145122
static size_t applySimple(AssemblyItem const& _s1, AssemblyItem const& _s2, std::back_insert_iterator<AssemblyItems>)
146123
{
147124
return _s1 == _s2 && SemanticInformation::isSwapInstruction(_s1);
148125
}
149126
};
150127

151-
struct DoublePush: SimplePeepholeOptimizerMethod<DoublePush, 2>
128+
struct DoublePush: SimplePeepholeOptimizerMethod<DoublePush>
152129
{
153130
static bool applySimple(AssemblyItem const& _push1, AssemblyItem const& _push2, std::back_insert_iterator<AssemblyItems> _out)
154131
{
@@ -163,7 +140,7 @@ struct DoublePush: SimplePeepholeOptimizerMethod<DoublePush, 2>
163140
}
164141
};
165142

166-
struct CommutativeSwap: SimplePeepholeOptimizerMethod<CommutativeSwap, 2>
143+
struct CommutativeSwap: SimplePeepholeOptimizerMethod<CommutativeSwap>
167144
{
168145
static bool applySimple(AssemblyItem const& _swap, AssemblyItem const& _op, std::back_insert_iterator<AssemblyItems> _out)
169146
{
@@ -181,7 +158,7 @@ struct CommutativeSwap: SimplePeepholeOptimizerMethod<CommutativeSwap, 2>
181158
}
182159
};
183160

184-
struct SwapComparison: SimplePeepholeOptimizerMethod<SwapComparison, 2>
161+
struct SwapComparison: SimplePeepholeOptimizerMethod<SwapComparison>
185162
{
186163
static bool applySimple(AssemblyItem const& _swap, AssemblyItem const& _op, std::back_insert_iterator<AssemblyItems> _out)
187164
{
@@ -207,7 +184,7 @@ struct SwapComparison: SimplePeepholeOptimizerMethod<SwapComparison, 2>
207184
};
208185

209186
/// Remove swapN after dupN
210-
struct DupSwap: SimplePeepholeOptimizerMethod<DupSwap, 2>
187+
struct DupSwap: SimplePeepholeOptimizerMethod<DupSwap>
211188
{
212189
static size_t applySimple(
213190
AssemblyItem const& _dupN,
@@ -230,7 +207,7 @@ struct DupSwap: SimplePeepholeOptimizerMethod<DupSwap, 2>
230207
};
231208

232209

233-
struct IsZeroIsZeroJumpI: SimplePeepholeOptimizerMethod<IsZeroIsZeroJumpI, 4>
210+
struct IsZeroIsZeroJumpI: SimplePeepholeOptimizerMethod<IsZeroIsZeroJumpI>
234211
{
235212
static size_t applySimple(
236213
AssemblyItem const& _iszero1,
@@ -256,7 +233,7 @@ struct IsZeroIsZeroJumpI: SimplePeepholeOptimizerMethod<IsZeroIsZeroJumpI, 4>
256233
}
257234
};
258235

259-
struct JumpToNext: SimplePeepholeOptimizerMethod<JumpToNext, 3>
236+
struct JumpToNext: SimplePeepholeOptimizerMethod<JumpToNext>
260237
{
261238
static size_t applySimple(
262239
AssemblyItem const& _pushTag,
@@ -282,7 +259,7 @@ struct JumpToNext: SimplePeepholeOptimizerMethod<JumpToNext, 3>
282259
}
283260
};
284261

285-
struct TagConjunctions: SimplePeepholeOptimizerMethod<TagConjunctions, 3>
262+
struct TagConjunctions: SimplePeepholeOptimizerMethod<TagConjunctions>
286263
{
287264
static bool applySimple(
288265
AssemblyItem const& _pushTag,
@@ -317,7 +294,7 @@ struct TagConjunctions: SimplePeepholeOptimizerMethod<TagConjunctions, 3>
317294
}
318295
};
319296

320-
struct TruthyAnd: SimplePeepholeOptimizerMethod<TruthyAnd, 3>
297+
struct TruthyAnd: SimplePeepholeOptimizerMethod<TruthyAnd>
321298
{
322299
static bool applySimple(
323300
AssemblyItem const& _push,

0 commit comments

Comments
 (0)