diff --git a/libyul/optimiser/StackCompressor.cpp b/libyul/optimiser/StackCompressor.cpp index 2deef5234..75440f4e9 100644 --- a/libyul/optimiser/StackCompressor.cpp +++ b/libyul/optimiser/StackCompressor.cpp @@ -229,10 +229,7 @@ bool StackCompressor::run( ); bool usesOptimizedCodeGenerator = false; if (auto evmDialect = dynamic_cast(&_dialect)) - usesOptimizedCodeGenerator = - _optimizeStackAllocation && - evmDialect->evmVersion().canOverchargeGasForCall() && - evmDialect->providesObjectAccess(); + usesOptimizedCodeGenerator = _optimizeStackAllocation && evmDialect->evmVersion().canOverchargeGasForCall(); bool allowMSizeOptimzation = !MSizeFinder::containsMSize(_dialect, *_object.code); if (usesOptimizedCodeGenerator) { diff --git a/libyul/optimiser/Suite.cpp b/libyul/optimiser/Suite.cpp index 2cf2b3abd..68fc675d1 100644 --- a/libyul/optimiser/Suite.cpp +++ b/libyul/optimiser/Suite.cpp @@ -96,8 +96,7 @@ void OptimiserSuite::run( bool usesOptimizedCodeGenerator = _optimizeStackAllocation && evmDialect && - evmDialect->evmVersion().canOverchargeGasForCall() && - evmDialect->providesObjectAccess(); + evmDialect->evmVersion().canOverchargeGasForCall(); set reservedIdentifiers = _externallyUsedIdentifiers; reservedIdentifiers += _dialect.fixedFunctionNames(); diff --git a/test/libyul/StackShufflingTest.cpp b/test/libyul/StackShufflingTest.cpp index f33134318..bfeaf3f0c 100644 --- a/test/libyul/StackShufflingTest.cpp +++ b/test/libyul/StackShufflingTest.cpp @@ -29,6 +29,25 @@ using namespace std; namespace solidity::yul::test { +namespace +{ +bool triggersStackTooDeep(Stack _source, Stack const& _target) +{ + bool result = false; + createStackLayout(_source, _target, [&](unsigned _i) { + if (_i > 16) + result = true; + }, [&](StackSlot const& _slot) { + if (canBeFreelyGenerated(_slot)) + return; + if (auto depth = util::findOffset(_source | ranges::views::reverse, _slot); depth && *depth >= 16) + if (*depth >= 16) + result = true; + }, [&]() {}); + return result; +} +} + BOOST_AUTO_TEST_SUITE(StackHelpers) BOOST_AUTO_TEST_CASE(avoid_deep_dup) @@ -74,8 +93,7 @@ BOOST_AUTO_TEST_CASE(avoid_deep_dup) VariableSlot{variableContainer[14]}, // While "optimal", bringing this slot up first will make the next unreachable. VariableSlot{variableContainer[0]} }}; - auto unreachable = OptimizedEVMCodeTransform::tryCreateStackLayout(from, to, {}); - BOOST_CHECK(unreachable.empty()); + BOOST_CHECK(!triggersStackTooDeep(from, to)); } BOOST_AUTO_TEST_SUITE_END()