mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add optimizer setting for fuzzing.
This commit is contained in:
parent
7e061db811
commit
48ba4e33c6
@ -521,6 +521,7 @@ void CompilerContext::appendInlineAssembly(
|
||||
analysisInfo,
|
||||
*m_asm,
|
||||
m_evmVersion,
|
||||
_optimiserSettings.forceOldPipeline,
|
||||
identifierAccess.generateCode,
|
||||
_system,
|
||||
_optimiserSettings.optimizeStackAllocation
|
||||
@ -557,6 +558,7 @@ void CompilerContext::optimizeYul(
|
||||
&meter,
|
||||
_object,
|
||||
_optimiserSettings.optimizeStackAllocation,
|
||||
_optimiserSettings.forceOldPipeline,
|
||||
_optimiserSettings.yulOptimiserSteps,
|
||||
isCreation? nullopt : make_optional(_optimiserSettings.expectedExecutionsPerDeployment),
|
||||
_externalIdentifiers,
|
||||
|
@ -915,6 +915,7 @@ bool ContractCompiler::visit(InlineAssembly const& _inlineAssembly)
|
||||
*analysisInfo,
|
||||
*m_context.assemblyPtr(),
|
||||
m_context.evmVersion(),
|
||||
m_optimiserSettings.forceOldPipeline,
|
||||
identifierAccessCodeGen,
|
||||
false,
|
||||
m_optimiserSettings.optimizeStackAllocation
|
||||
|
@ -149,6 +149,7 @@ struct OptimiserSettings
|
||||
/// This specifies an estimate on how often each opcode in this assembly will be executed,
|
||||
/// i.e. use a small value to optimise for size and a large value to optimise for runtime gas usage.
|
||||
size_t expectedExecutionsPerDeployment = 200;
|
||||
bool forceOldPipeline = false;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -168,7 +168,7 @@ bool AssemblyStack::analyzeParsed(Object& _object)
|
||||
return success;
|
||||
}
|
||||
|
||||
void AssemblyStack::compileEVM(AbstractAssembly& _assembly, bool _optimize) const
|
||||
void AssemblyStack::compileEVM(AbstractAssembly& _assembly, bool _optimize, bool _forceOldPipeline) const
|
||||
{
|
||||
EVMDialect const* dialect = nullptr;
|
||||
switch (m_language)
|
||||
@ -185,7 +185,7 @@ void AssemblyStack::compileEVM(AbstractAssembly& _assembly, bool _optimize) cons
|
||||
break;
|
||||
}
|
||||
|
||||
EVMObjectCompiler::compile(*m_parserResult, _assembly, *dialect, _optimize);
|
||||
EVMObjectCompiler::compile(*m_parserResult, _assembly, *dialect, _optimize, _forceOldPipeline);
|
||||
}
|
||||
|
||||
void AssemblyStack::optimize(Object& _object, bool _isCreation)
|
||||
@ -205,6 +205,7 @@ void AssemblyStack::optimize(Object& _object, bool _isCreation)
|
||||
meter.get(),
|
||||
_object,
|
||||
m_optimiserSettings.optimizeStackAllocation,
|
||||
m_optimiserSettings.forceOldPipeline,
|
||||
m_optimiserSettings.yulOptimiserSteps,
|
||||
_isCreation ? nullopt : make_optional(m_optimiserSettings.expectedExecutionsPerDeployment),
|
||||
{}
|
||||
@ -283,7 +284,7 @@ AssemblyStack::assembleEVMWithDeployed(optional<string_view> _deployName) const
|
||||
|
||||
evmasm::Assembly assembly;
|
||||
EthAssemblyAdapter adapter(assembly);
|
||||
compileEVM(adapter, m_optimiserSettings.optimizeStackAllocation);
|
||||
compileEVM(adapter, m_optimiserSettings.optimizeStackAllocation, m_optimiserSettings.forceOldPipeline);
|
||||
|
||||
assembly.optimise(translateOptimiserSettings(m_optimiserSettings, m_evmVersion));
|
||||
|
||||
|
@ -125,7 +125,7 @@ private:
|
||||
bool analyzeParsed();
|
||||
bool analyzeParsed(yul::Object& _object);
|
||||
public:
|
||||
void compileEVM(yul::AbstractAssembly& _assembly, bool _optimize) const;
|
||||
void compileEVM(yul::AbstractAssembly& _assembly, bool _optimize, bool _forceOldPipeline) const;
|
||||
private:
|
||||
void optimize(yul::Object& _object, bool _isCreation);
|
||||
|
||||
|
@ -38,6 +38,7 @@ void CodeGenerator::assemble(
|
||||
AsmAnalysisInfo& _analysisInfo,
|
||||
evmasm::Assembly& _assembly,
|
||||
langutil::EVMVersion _evmVersion,
|
||||
bool _forceOldPipeline,
|
||||
ExternalIdentifierAccess::CodeGenerator _identifierAccessCodeGen,
|
||||
bool _system,
|
||||
bool _optimizeStackAllocation
|
||||
@ -45,7 +46,7 @@ void CodeGenerator::assemble(
|
||||
{
|
||||
EthAssemblyAdapter assemblyAdapter(_assembly);
|
||||
BuiltinContext builtinContext;
|
||||
if (_system && _optimizeStackAllocation && _evmVersion.canOverchargeGasForCall())
|
||||
if (!_forceOldPipeline && _system && _optimizeStackAllocation && _evmVersion.canOverchargeGasForCall())
|
||||
{
|
||||
int oldStackHeight = assemblyAdapter.stackHeight();
|
||||
assemblyAdapter.setStackHeight(0);
|
||||
|
@ -44,6 +44,7 @@ public:
|
||||
AsmAnalysisInfo& _analysisInfo,
|
||||
evmasm::Assembly& _assembly,
|
||||
langutil::EVMVersion _evmVersion,
|
||||
bool _forceOldPipeline,
|
||||
ExternalIdentifierAccess::CodeGenerator _identifierAccess = {},
|
||||
bool _system = false,
|
||||
bool _optimizeStackAllocation = false
|
||||
|
@ -31,13 +31,13 @@
|
||||
using namespace solidity::yul;
|
||||
using namespace std;
|
||||
|
||||
void EVMObjectCompiler::compile(Object& _object, AbstractAssembly& _assembly, EVMDialect const& _dialect, bool _optimize)
|
||||
void EVMObjectCompiler::compile(Object& _object, AbstractAssembly& _assembly, EVMDialect const& _dialect, bool _optimize, bool _forceOldPipeline)
|
||||
{
|
||||
EVMObjectCompiler compiler(_assembly, _dialect);
|
||||
compiler.run(_object, _optimize);
|
||||
compiler.run(_object, _optimize, _forceOldPipeline);
|
||||
}
|
||||
|
||||
void EVMObjectCompiler::run(Object& _object, bool _optimize)
|
||||
void EVMObjectCompiler::run(Object& _object, bool _optimize, bool _forceOldPipeline)
|
||||
{
|
||||
BuiltinContext context;
|
||||
context.currentObject = &_object;
|
||||
@ -49,7 +49,7 @@ void EVMObjectCompiler::run(Object& _object, bool _optimize)
|
||||
auto subAssemblyAndID = m_assembly.createSubAssembly(subObject->name.str());
|
||||
context.subIDs[subObject->name] = subAssemblyAndID.second;
|
||||
subObject->subId = subAssemblyAndID.second;
|
||||
compile(*subObject, *subAssemblyAndID.first, m_dialect, _optimize);
|
||||
compile(*subObject, *subAssemblyAndID.first, m_dialect, _optimize, _forceOldPipeline);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -63,9 +63,8 @@ void EVMObjectCompiler::run(Object& _object, bool _optimize)
|
||||
|
||||
yulAssert(_object.analysisInfo, "No analysis info.");
|
||||
yulAssert(_object.code, "No code.");
|
||||
if (_optimize && m_dialect.evmVersion().canOverchargeGasForCall())
|
||||
if (!_forceOldPipeline && (_optimize && m_dialect.evmVersion().canOverchargeGasForCall()))
|
||||
{
|
||||
|
||||
auto stackErrors = OptimizedEVMCodeTransform::run(m_assembly, *_object.analysisInfo, *_object.code, m_dialect, context);
|
||||
if (!stackErrors.empty())
|
||||
BOOST_THROW_EXCEPTION(stackErrors.front());
|
||||
|
@ -30,13 +30,13 @@ struct EVMDialect;
|
||||
class EVMObjectCompiler
|
||||
{
|
||||
public:
|
||||
static void compile(Object& _object, AbstractAssembly& _assembly, EVMDialect const& _dialect, bool _optimize);
|
||||
static void compile(Object& _object, AbstractAssembly& _assembly, EVMDialect const& _dialect, bool _optimize, bool _forceOldPipeline);
|
||||
private:
|
||||
EVMObjectCompiler(AbstractAssembly& _assembly, EVMDialect const& _dialect):
|
||||
m_assembly(_assembly), m_dialect(_dialect)
|
||||
{}
|
||||
|
||||
void run(Object& _object, bool _optimize);
|
||||
void run(Object& _object, bool _optimize, bool _forceOldPipeline);
|
||||
|
||||
AbstractAssembly& m_assembly;
|
||||
EVMDialect const& m_dialect;
|
||||
|
@ -87,6 +87,7 @@ void OptimiserSuite::run(
|
||||
GasMeter const* _meter,
|
||||
Object& _object,
|
||||
bool _optimizeStackAllocation,
|
||||
bool _forceOldPipeline,
|
||||
string const& _optimisationSequence,
|
||||
optional<size_t> _expectedExecutionsPerDeployment,
|
||||
set<YulString> const& _externallyUsedIdentifiers,
|
||||
@ -95,6 +96,7 @@ void OptimiserSuite::run(
|
||||
{
|
||||
EVMDialect const* evmDialect = dynamic_cast<EVMDialect const*>(&_dialect);
|
||||
bool usesOptimizedCodeGenerator =
|
||||
!_forceOldPipeline &&
|
||||
_optimizeStackAllocation &&
|
||||
evmDialect &&
|
||||
evmDialect->evmVersion().canOverchargeGasForCall();
|
||||
|
@ -64,6 +64,7 @@ public:
|
||||
GasMeter const* _meter,
|
||||
Object& _object,
|
||||
bool _optimizeStackAllocation,
|
||||
bool _forceOldPipeline,
|
||||
std::string const& _optimisationSequence,
|
||||
std::optional<size_t> _expectedExecutionsPerDeployment,
|
||||
std::set<YulString> const& _externallyUsedIdentifiers = {},
|
||||
|
@ -61,7 +61,7 @@ TestCase::TestResult EVMCodeTransformTest::run(ostream& _stream, string const& _
|
||||
|
||||
evmasm::Assembly assembly;
|
||||
EthAssemblyAdapter adapter(assembly);
|
||||
stack.compileEVM(adapter, m_stackOpt);
|
||||
stack.compileEVM(adapter, m_stackOpt, settings.forceOldPipeline);
|
||||
|
||||
std::ostringstream output;
|
||||
output << assembly;
|
||||
|
@ -79,8 +79,9 @@ using namespace std;
|
||||
|
||||
YulOptimizerTestCommon::YulOptimizerTestCommon(
|
||||
shared_ptr<Object> _obj,
|
||||
Dialect const& _dialect
|
||||
)
|
||||
Dialect const& _dialect,
|
||||
bool _forceOldPipeline
|
||||
): m_forceOldPipeline(_forceOldPipeline)
|
||||
{
|
||||
m_object = _obj;
|
||||
m_ast = m_object->code;
|
||||
@ -322,6 +323,7 @@ YulOptimizerTestCommon::YulOptimizerTestCommon(
|
||||
&meter,
|
||||
*m_object,
|
||||
true,
|
||||
m_forceOldPipeline,
|
||||
frontend::OptimiserSettings::DefaultYulOptimiserSteps,
|
||||
frontend::OptimiserSettings::standard().expectedExecutionsPerDeployment
|
||||
);
|
||||
|
@ -40,7 +40,8 @@ class YulOptimizerTestCommon
|
||||
public:
|
||||
explicit YulOptimizerTestCommon(
|
||||
std::shared_ptr<Object> _obj,
|
||||
Dialect const& _dialect
|
||||
Dialect const& _dialect,
|
||||
bool _forceOldPipeline = false
|
||||
);
|
||||
/// Sets optimiser step to be run to @param
|
||||
/// _optimiserStep.
|
||||
@ -71,6 +72,7 @@ private:
|
||||
std::shared_ptr<Block> m_ast;
|
||||
std::shared_ptr<AsmAnalysisInfo> m_analysisInfo;
|
||||
std::map<std::string, std::function<void(void)>> m_namedSteps;
|
||||
bool m_forceOldPipeline = false;
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user