mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
YulStack: Don't enable stack optimizations in unoptimized mode when msize is present
This commit is contained in:
parent
25be38905f
commit
51cd87c94d
@ -30,6 +30,7 @@
|
|||||||
#include <libyul/backends/evm/EVMObjectCompiler.h>
|
#include <libyul/backends/evm/EVMObjectCompiler.h>
|
||||||
#include <libyul/backends/evm/EVMMetrics.h>
|
#include <libyul/backends/evm/EVMMetrics.h>
|
||||||
#include <libyul/ObjectParser.h>
|
#include <libyul/ObjectParser.h>
|
||||||
|
#include <libyul/optimiser/Semantics.h>
|
||||||
#include <libyul/optimiser/Suite.h>
|
#include <libyul/optimiser/Suite.h>
|
||||||
#include <libevmasm/Assembly.h>
|
#include <libevmasm/Assembly.h>
|
||||||
#include <liblangutil/Scanner.h>
|
#include <liblangutil/Scanner.h>
|
||||||
@ -87,6 +88,13 @@ bool YulStack::parseAndAnalyze(std::string const& _sourceName, std::string const
|
|||||||
void YulStack::optimize()
|
void YulStack::optimize()
|
||||||
{
|
{
|
||||||
yulAssert(m_analysisSuccessful, "Analysis was not successful.");
|
yulAssert(m_analysisSuccessful, "Analysis was not successful.");
|
||||||
|
yulAssert(m_parserResult);
|
||||||
|
|
||||||
|
if (
|
||||||
|
!m_optimiserSettings.runYulOptimiser &&
|
||||||
|
yul::MSizeFinder::containsMSize(languageToDialect(m_language, m_evmVersion), *m_parserResult)
|
||||||
|
)
|
||||||
|
return;
|
||||||
|
|
||||||
m_analysisSuccessful = false;
|
m_analysisSuccessful = false;
|
||||||
yulAssert(m_parserResult, "");
|
yulAssert(m_parserResult, "");
|
||||||
@ -231,10 +239,13 @@ YulStack::assembleEVMWithDeployed(optional<string_view> _deployName) const
|
|||||||
evmasm::Assembly assembly(m_evmVersion, true, {});
|
evmasm::Assembly assembly(m_evmVersion, true, {});
|
||||||
EthAssemblyAdapter adapter(assembly);
|
EthAssemblyAdapter adapter(assembly);
|
||||||
|
|
||||||
// NOTE: We always need stack optimization when Yul optimizer is disabled. It being disabled
|
// NOTE: We always need stack optimization when Yul optimizer is disabled (unless code contains
|
||||||
// just means that we don't use the full step sequence. We still run it with the minimal steps
|
// msize). It being disabled just means that we don't use the full step sequence. We still run
|
||||||
// required to avoid "stack too deep".
|
// it with the minimal steps required to avoid "stack too deep".
|
||||||
bool optimize = m_optimiserSettings.optimizeStackAllocation || !m_optimiserSettings.runYulOptimiser;
|
bool optimize = m_optimiserSettings.optimizeStackAllocation || (
|
||||||
|
!m_optimiserSettings.runYulOptimiser &&
|
||||||
|
!yul::MSizeFinder::containsMSize(languageToDialect(m_language, m_evmVersion), *m_parserResult)
|
||||||
|
);
|
||||||
compileEVM(adapter, optimize);
|
compileEVM(adapter, optimize);
|
||||||
|
|
||||||
assembly.optimise(evmasm::Assembly::OptimiserSettings::translateSettings(m_optimiserSettings, m_evmVersion));
|
assembly.optimise(evmasm::Assembly::OptimiserSettings::translateSettings(m_optimiserSettings, m_evmVersion));
|
||||||
|
Loading…
Reference in New Issue
Block a user