@@ -690,16 +690,12 @@ struct DeduplicateNextTagSize1 : SimplePeepholeOptimizerMethod<DeduplicateNextTa
690
690
}
691
691
};
692
692
693
- void applyMethods (OptimiserState&)
693
+ template <typename ... Method>
694
+ void applyMethods (OptimiserState& _state)
694
695
{
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." );
703
699
}
704
700
705
701
size_t numberOfPops (AssemblyItems const & _items)
@@ -721,33 +717,32 @@ bool PeepholeOptimiser::optimise()
721
717
auto const approx = evmasm::Precision::Approximate;
722
718
OptimiserState state {m_items, 0 , back_inserter (m_optimisedItems), m_evmVersion};
723
719
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);
751
746
if (m_optimisedItems.size () < m_items.size () || (
752
747
m_optimisedItems.size () == m_items.size () && (
753
748
evmasm::bytesRequired (m_optimisedItems, 3 , m_evmVersion, approx) < evmasm::bytesRequired (m_items, 3 , m_evmVersion, approx) ||
0 commit comments