Merge pull request #6249 from ethereum/optimizerTests

Change optimizer tests so that they also always test the peephole optimizer.
This commit is contained in:
chriseth
2019-03-20 18:38:06 +01:00
committed by GitHub
5 changed files with 48 additions and 11 deletions
+1 -1
View File
@@ -41,7 +41,7 @@ namespace test
u256 gasOpt{_gasOpt}; \
u256 gasNoOpt{_gasNoOpt}; \
u256 tolerance{_tolerance}; \
u256 gas = m_optimize ? gasOpt : gasNoOpt; \
u256 gas = m_optimiserSettings == OptimiserSettings::minimal() ? gasNoOpt : gasOpt; \
u256 diff = gas < m_gasUsed ? m_gasUsed - gas : gas - m_gasUsed; \
BOOST_CHECK_MESSAGE( \
diff <= tolerance, \
@@ -73,7 +73,7 @@ public:
m_compiler.addSource("", sourceCode);
m_compiler.setLibraries(_libraryAddresses);
m_compiler.setEVMVersion(m_evmVersion);
m_compiler.setOptimiserSettings(m_optimize, m_optimizeRuns);
m_compiler.setOptimiserSettings(m_optimiserSettings);
if (!m_compiler.compile())
{
langutil::SourceReferenceFormatter formatter(std::cerr);
+42 -6
View File
@@ -54,13 +54,13 @@ public:
unsigned const _optimizeRuns = 200
)
{
bool const c_optimize = m_optimize;
unsigned const c_optimizeRuns = m_optimizeRuns;
m_optimize = _optimize;
m_optimizeRuns = _optimizeRuns;
OptimiserSettings previousSettings = std::move(m_optimiserSettings);
// This uses "none" / "full" while most other test frameworks use
// "minimal" / "enabled".
m_optimiserSettings = _optimize ? OptimiserSettings::full() : OptimiserSettings::none();
m_optimiserSettings.expectedExecutionsPerDeployment = _optimizeRuns;
bytes const& ret = compileAndRun(_sourceCode, _value, _contractName);
m_optimize = c_optimize;
m_optimizeRuns = c_optimizeRuns;
m_optimiserSettings = std::move(previousSettings);
return ret;
}
@@ -665,6 +665,42 @@ BOOST_AUTO_TEST_CASE(optimise_constant_to_codecopy)
BOOST_CHECK_EQUAL(numInstructions(m_optimizedBytecode, Instruction::CODECOPY), 4);
}
BOOST_AUTO_TEST_CASE(byte_access)
{
char const* sourceCode = R"(
contract C
{
function f(bytes32 x) public returns (byte r)
{
assembly { r := and(byte(x, 31), 0xff) }
}
}
)";
compileBothVersions(sourceCode);
compareVersions("f(bytes32)", u256("0x1223344556677889900112233445566778899001122334455667788990011223"));
}
BOOST_AUTO_TEST_CASE(shift_optimizer_bug)
{
char const* sourceCode = R"(
contract C
{
function f(uint x) public returns (uint)
{
return (x << 1) << uint(-1);
}
function g(uint x) public returns (uint)
{
return (x >> 1) >> uint(-1);
}
}
)";
compileBothVersions(sourceCode);
compareVersions("f(uint256)", 7);
compareVersions("g(uint256)", u256(-1));
}
BOOST_AUTO_TEST_SUITE_END()
}