Do not hard-code the default 'runs' value as 200 in code that fills out optimizer settings

This commit is contained in:
Kamil Śliwak 2021-06-17 17:19:27 +02:00
parent 6d8ef71277
commit 6ad6fa2382
9 changed files with 30 additions and 22 deletions

View File

@ -30,6 +30,8 @@
#include <libsolutil/Assertions.h>
#include <libsolutil/Keccak256.h>
#include <libsolidity/interface/OptimiserSettings.h>
#include <json/json.h>
#include <iostream>
@ -124,7 +126,7 @@ public:
langutil::EVMVersion evmVersion;
/// 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;
size_t expectedExecutionsPerDeployment = frontend::OptimiserSettings{}.expectedExecutionsPerDeployment;
};
/// Modify and return the current assembly such that creation and execution gas usage

View File

@ -22,6 +22,7 @@
#pragma once
#include <libsolutil/Common.h>
#include <libevmasm/Assembly.h>
#include <libevmasm/AssemblyItem.h>
#include <liblangutil/EVMVersion.h>
@ -75,7 +76,7 @@ private:
AssemblyItems& m_items;
std::set<size_t> const& m_tagsReferencedFromOutside;
size_t const m_runs = 200;
size_t const m_runs = Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment;
bool const m_isCreation = false;
langutil::EVMVersion const m_evmVersion;
};

View File

@ -146,7 +146,7 @@ public:
/// Changes the optimiser settings.
/// Must be set before parsing.
void setOptimiserSettings(bool _optimize, size_t _runs = 200);
void setOptimiserSettings(bool _optimize, size_t _runs = OptimiserSettings{}.expectedExecutionsPerDeployment);
/// Changes the optimiser settings.
/// Must be set before parsing.

View File

@ -85,7 +85,6 @@ struct OptimiserSettings
s.runConstantOptimiser = true;
s.runYulOptimiser = true;
s.optimizeStackAllocation = true;
s.expectedExecutionsPerDeployment = 200;
return s;
}
/// Full optimisations. Currently an alias for standard optimisations.

View File

@ -1037,7 +1037,9 @@ General Information)").c_str(),
)
(
g_argOptimizeRuns.c_str(),
po::value<unsigned>()->value_name("n")->default_value(200),
// TODO: The type in OptimiserSettings is size_t but we only accept values up to 2**32-1
// on the CLI and in Standard JSON. We should just switch to uint32_t everywhere.
po::value<unsigned>()->value_name("n")->default_value(static_cast<unsigned>(OptimiserSettings{}.expectedExecutionsPerDeployment)),
"Set for how many contract runs to optimize. "
"Lower values will optimize more for initial deployment cost, higher values will optimize more for high-frequency usage."
)

View File

@ -1286,7 +1286,8 @@ BOOST_AUTO_TEST_CASE(jumpdest_removal_subassemblies)
settings.runCSE = true;
settings.runConstantOptimiser = true;
settings.evmVersion = solidity::test::CommonOptions::get().evmVersion();
settings.expectedExecutionsPerDeployment = 200;
settings.expectedExecutionsPerDeployment = OptimiserSettings{}.expectedExecutionsPerDeployment;
;
main.optimise(settings);
AssemblyItems expectationMain{
@ -1679,7 +1680,7 @@ BOOST_AUTO_TEST_CASE(inliner)
Instruction::SWAP1,
jumpOutOf,
};
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()
@ -1701,7 +1702,7 @@ BOOST_AUTO_TEST_CASE(inliner_no_inline_type)
Instruction::SWAP1,
Instruction::JUMP,
};
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
items.begin(), items.end()
@ -1726,7 +1727,7 @@ BOOST_AUTO_TEST_CASE(inliner_no_inline)
Instruction::JUMPI,
Instruction::JUMP,
};
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()
@ -1757,7 +1758,7 @@ BOOST_AUTO_TEST_CASE(inliner_single_jump)
AssemblyItem(Tag, 2),
jumpOutOf,
};
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()
@ -1777,7 +1778,7 @@ BOOST_AUTO_TEST_CASE(inliner_end_of_bytecode)
Instruction::STOP,
AssemblyItem(Tag, 2),
};
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
items.begin(), items.end()
@ -1802,7 +1803,7 @@ BOOST_AUTO_TEST_CASE(inliner_cse_break)
Instruction::STOP, // CSE breaking instruction
jumpOutOf
};
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
items.begin(), items.end()
@ -1822,7 +1823,7 @@ BOOST_AUTO_TEST_CASE(inliner_stop)
AssemblyItem(Tag, 1),
Instruction::STOP
};
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()
@ -1840,7 +1841,7 @@ BOOST_AUTO_TEST_CASE(inliner_stop_jumpi)
Instruction::STOP
};
AssemblyItems expectation = items;
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()
@ -1867,7 +1868,7 @@ BOOST_AUTO_TEST_CASE(inliner_revert)
Instruction::REVERT
};
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()
@ -1887,7 +1888,7 @@ BOOST_AUTO_TEST_CASE(inliner_revert_increased_datagas)
};
AssemblyItems expectation = items;
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()
@ -1908,7 +1909,7 @@ BOOST_AUTO_TEST_CASE(inliner_invalid)
AssemblyItem(Tag, 1),
Instruction::INVALID
};
Inliner{items, {}, 200, false, {}}.optimise();
Inliner{items, {}, Assembly::OptimiserSettings{}.expectedExecutionsPerDeployment, false, {}}.optimise();
BOOST_CHECK_EQUAL_COLLECTIONS(
items.begin(), items.end(),
expectation.begin(), expectation.end()

View File

@ -34,7 +34,6 @@ using namespace solidity::frontend;
using namespace solidity::frontend::test;
using namespace solidity;
using namespace std;
namespace fs = boost::filesystem;
using namespace boost::unit_test;
GasTest::GasTest(string const& _filename):
@ -43,7 +42,7 @@ GasTest::GasTest(string const& _filename):
m_source = m_reader.source();
m_optimise = m_reader.boolSetting("optimize", false);
m_optimiseYul = m_reader.boolSetting("optimize-yul", false);
m_optimiseRuns = m_reader.sizetSetting("optimize-runs", 200);
m_optimiseRuns = m_reader.sizetSetting("optimize-runs", OptimiserSettings{}.expectedExecutionsPerDeployment);
parseExpectations(m_reader.stream());
}

View File

@ -22,6 +22,8 @@
#include <test/TestCase.h>
#include <liblangutil/Exceptions.h>
#include <libsolidity/interface/OptimiserSettings.h>
#include <iosfwd>
#include <string>
#include <vector>
@ -47,7 +49,7 @@ private:
bool m_optimise = false;
bool m_optimiseYul = false;
size_t m_optimiseRuns = 200;
size_t m_optimiseRuns = OptimiserSettings{}.expectedExecutionsPerDeployment;
std::map<std::string, std::map<std::string, std::string>> m_expectations;
};

View File

@ -19,6 +19,7 @@
#include "libsolidity/formal/ModelCheckerSettings.h"
#include <test/tools/fuzzer_common.h>
#include <libsolidity/interface/OptimiserSettings.h>
#include <libsolidity/interface/CompilerStack.h>
#include <libsolutil/JSON.h>
@ -34,9 +35,10 @@
using namespace std;
using namespace solidity;
using namespace solidity::util;
using namespace solidity::evmasm;
using namespace solidity::frontend;
using namespace solidity::langutil;
using namespace solidity::util;
static vector<EVMVersion> s_evmVersions = {
EVMVersion::homestead(),
@ -62,7 +64,7 @@ void FuzzerUtil::testCompilerJsonInterface(string const& _input, bool _optimize,
config["settings"] = Json::objectValue;
config["settings"]["optimizer"] = Json::objectValue;
config["settings"]["optimizer"]["enabled"] = _optimize;
config["settings"]["optimizer"]["runs"] = 200;
config["settings"]["optimizer"]["runs"] = static_cast<int>(OptimiserSettings{}.expectedExecutionsPerDeployment);
config["settings"]["evmVersion"] = "berlin";
// Enable all SourceUnit-level outputs.