diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index c890dcf2f..0e3017d67 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -661,12 +661,24 @@ bool CompilerStack::compile(State _stopAfter) string const evmAssemblyJsonSource = m_evmAssemblyJson.begin()->first; + evmasm::Assembly::OptimiserSettings optimiserSettings; + optimiserSettings.evmVersion = m_evmVersion; + optimiserSettings.expectedExecutionsPerDeployment = m_optimiserSettings.expectedExecutionsPerDeployment; + optimiserSettings.runCSE = m_optimiserSettings.runCSE; + optimiserSettings.runConstantOptimiser = m_optimiserSettings.runConstantOptimiser; + optimiserSettings.runDeduplicate = m_optimiserSettings.runDeduplicate; + optimiserSettings.runInliner = m_optimiserSettings.runInliner; + optimiserSettings.runJumpdestRemover = m_optimiserSettings.runJumpdestRemover; + optimiserSettings.runPeephole = m_optimiserSettings.runPeephole; + m_contracts[evmAssemblyJsonSource].evmAssembly = make_shared(evmAssemblyJsonSource); m_contracts[evmAssemblyJsonSource].evmAssembly->loadFromAssemblyJSON(m_evmAssemblyJson[evmAssemblyJsonSource]); + m_contracts[evmAssemblyJsonSource].evmAssembly->optimise(optimiserSettings); m_contracts[evmAssemblyJsonSource].object = m_contracts[evmAssemblyJsonSource].evmAssembly->assemble(); m_contracts[evmAssemblyJsonSource].evmRuntimeAssembly = make_shared(evmAssemblyJsonSource); m_contracts[evmAssemblyJsonSource].evmRuntimeAssembly->loadFromAssemblyJSON(m_evmAssemblyJson[evmAssemblyJsonSource][".data"]["0"]); + m_contracts[evmAssemblyJsonSource].evmRuntimeAssembly->optimise(optimiserSettings); m_contracts[evmAssemblyJsonSource].runtimeObject = m_contracts[evmAssemblyJsonSource].evmRuntimeAssembly->assemble(); } else diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index acfc09c87..6cf664c89 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -1218,12 +1218,15 @@ bool CommandLineParser::processArgs() } if (m_options.optimizer.enabled && (m_options.assembly.inputLanguage != Input::StrictAssembly && m_options.assembly.inputLanguage != Input::Ewasm)) { - serr() << - "Optimizer can only be used for strict assembly. Use --" << - g_strStrictAssembly << - "." << - endl; - return false; + if (m_options.input.mode != InputMode::CompilerWithEvmAssemblyJsonImport) + { + serr() << + "Optimizer can only be used for strict assembly or with assembly import. Use --" << + g_strStrictAssembly << + " or --" << g_strImportEvmAssemblerJson << "." << + endl; + return false; + } } if (m_options.assembly.targetMachine == Machine::Ewasm && m_options.assembly.inputLanguage != Input::StrictAssembly && m_options.assembly.inputLanguage != Input::Ewasm) {