Skip to content

Commit 8f38f23

Browse files
committed
Peephole optimiser: Replace apply methods recursion by folding expression
1 parent ad281dd commit 8f38f23

File tree

1 file changed

+31
-36
lines changed

1 file changed

+31
-36
lines changed

libevmasm/PeepholeOptimiser.cpp

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -690,16 +690,12 @@ struct DeduplicateNextTagSize1 : SimplePeepholeOptimizerMethod<DeduplicateNextTa
690690
}
691691
};
692692

693-
void applyMethods(OptimiserState&)
693+
template <typename... Method>
694+
void applyMethods(OptimiserState& _state)
694695
{
695-
assertThrow(false, OptimizerException, "Peephole optimizer failed to apply identity.");
696-
}
697-
698-
template <typename Method, typename... OtherMethods>
699-
void applyMethods(OptimiserState& _state, Method, OtherMethods... _other)
700-
{
701-
if (!Method::apply(_state))
702-
applyMethods(_state, _other...);
696+
bool continueWithNextMethod = true;
697+
((continueWithNextMethod && (continueWithNextMethod &= !Method::apply(_state))), ...);
698+
assertThrow(!continueWithNextMethod, OptimizerException, "Peephole optimizer failed to apply identity.");
703699
}
704700

705701
size_t numberOfPops(AssemblyItems const& _items)
@@ -721,33 +717,32 @@ bool PeepholeOptimiser::optimise()
721717
auto const approx = evmasm::Precision::Approximate;
722718
OptimiserState state {m_items, 0, back_inserter(m_optimisedItems), m_evmVersion};
723719
while (state.i < m_items.size())
724-
applyMethods(
725-
state,
726-
PushPop(),
727-
OpPop(),
728-
OpStop(),
729-
OpReturnRevert(),
730-
DoublePush(),
731-
DoubleSwap(),
732-
CommutativeSwap(),
733-
SwapComparison(),
734-
DupSwap(),
735-
IsZeroIsZeroJumpI(),
736-
IsZeroIsZeroRJumpI(), // EOF specific
737-
EqIsZeroJumpI(),
738-
EqIsZeroRJumpI(), // EOF specific
739-
DoubleJump(),
740-
DoubleRJump(), // EOF specific
741-
JumpToNext(),
742-
RJumpToNext(), // EOF specific
743-
UnreachableCode(),
744-
DeduplicateNextTagSize3(),
745-
DeduplicateNextTagSize2(),
746-
DeduplicateNextTagSize1(),
747-
TagConjunctions(),
748-
TruthyAnd(),
749-
Identity()
750-
);
720+
applyMethods<
721+
PushPop,
722+
OpPop,
723+
OpStop,
724+
OpReturnRevert,
725+
DoublePush,
726+
DoubleSwap,
727+
CommutativeSwap,
728+
SwapComparison,
729+
DupSwap,
730+
IsZeroIsZeroJumpI,
731+
IsZeroIsZeroRJumpI, // EOF specific
732+
EqIsZeroJumpI,
733+
EqIsZeroRJumpI, // EOF specific
734+
DoubleJump,
735+
DoubleRJump, // EOF specific
736+
JumpToNext,
737+
RJumpToNext, // EOF specific
738+
UnreachableCode,
739+
DeduplicateNextTagSize3,
740+
DeduplicateNextTagSize2,
741+
DeduplicateNextTagSize1,
742+
TagConjunctions,
743+
TruthyAnd,
744+
Identity
745+
>(state);
751746
if (m_optimisedItems.size() < m_items.size() || (
752747
m_optimisedItems.size() == m_items.size() && (
753748
evmasm::bytesRequired(m_optimisedItems, 3, m_evmVersion, approx) < evmasm::bytesRequired(m_items, 3, m_evmVersion, approx) ||

0 commit comments

Comments
 (0)