Skip to content

Commit

Permalink
Merge pull request #1418 from ethereum/develop
Browse files Browse the repository at this point in the history
Release 0.4.6
  • Loading branch information
chriseth committed Nov 22, 2016
2 parents b318366 + 3d9a180 commit 2dabbdf
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 39 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Expand Up @@ -8,7 +8,7 @@ include(EthPolicy)
eth_policy()

# project name and version should be set after cmake_policy CMP0048
set(PROJECT_VERSION "0.4.5")
set(PROJECT_VERSION "0.4.6")
project(solidity VERSION ${PROJECT_VERSION})

# Let's find our dependencies
Expand Down
5 changes: 5 additions & 0 deletions Changelog.md
@@ -1,3 +1,8 @@
### 0.4.6 (2016-11-22)

Bugfixes:
* Optimizer: Knowledge about state was not correctly cleared for JUMPDESTs

### 0.4.5 (2016-11-21)

Features:
Expand Down
4 changes: 2 additions & 2 deletions docs/conf.py
Expand Up @@ -56,9 +56,9 @@ def setup(sphinx):
# built documents.
#
# The short X.Y version.
version = '0.4.5'
version = '0.4.6'
# The full version, including alpha/beta/rc tags.
release = '0.4.5-develop'
release = '0.4.6-develop'

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
Expand Down
61 changes: 25 additions & 36 deletions libevmasm/Assembly.cpp
Expand Up @@ -360,46 +360,35 @@ map<u256, u256> Assembly::optimiseInternal(bool _enable, bool _isCreation, size_
auto iter = m_items.begin();
while (iter != m_items.end())
{
auto end = iter;
while (end != m_items.end())
if (SemanticInformation::altersControlFlow(*end++))
break;

KnownState emptyState;
CommonSubexpressionEliminator eliminator(emptyState);
auto blockIter = iter;
auto const blockEnd = end;
while (blockIter < blockEnd)
auto orig = iter;
iter = eliminator.feedItems(iter, m_items.end());
bool shouldReplace = false;
AssemblyItems optimisedChunk;
try
{
optimisedChunk = eliminator.getOptimizedItems();
shouldReplace = (optimisedChunk.size() < size_t(iter - orig));
}
catch (StackTooDeepException const&)
{
// This might happen if the opcode reconstruction is not as efficient
// as the hand-crafted code.
}
catch (ItemNotAvailableException const&)
{
auto orig = blockIter;
blockIter = eliminator.feedItems(blockIter, blockEnd);
bool shouldReplace = false;
AssemblyItems optimisedChunk;
try
{
optimisedChunk = eliminator.getOptimizedItems();
shouldReplace = (optimisedChunk.size() < size_t(blockIter - orig));
}
catch (StackTooDeepException const&)
{
// This might happen if the opcode reconstruction is not as efficient
// as the hand-crafted code.
}
catch (ItemNotAvailableException const&)
{
// This might happen if e.g. associativity and commutativity rules
// reorganise the expression tree, but not all leaves are available.
}

if (shouldReplace)
{
count++;
optimisedItems += optimisedChunk;
}
else
copy(orig, blockIter, back_inserter(optimisedItems));
// This might happen if e.g. associativity and commutativity rules
// reorganise the expression tree, but not all leaves are available.
}
iter = end;

if (shouldReplace)
{
count++;
optimisedItems += optimisedChunk;
}
else
copy(orig, iter, back_inserter(optimisedItems));
}
if (optimisedItems.size() < m_items.size())
{
Expand Down
20 changes: 20 additions & 0 deletions test/libsolidity/SolidityOptimizer.cpp
Expand Up @@ -1246,6 +1246,26 @@ BOOST_AUTO_TEST_CASE(dead_code_elimination_across_assemblies)
compareVersions("test()");
}

BOOST_AUTO_TEST_CASE(invalid_state_at_control_flow_join)
{
char const* sourceCode = R"(
contract Test {
uint256 public totalSupply = 100;
function f() returns (uint r) {
if (false)
r = totalSupply;
totalSupply -= 10;
}
function test() returns (uint) {
f();
return this.totalSupply();
}
}
)";
compileBothVersions(sourceCode);
compareVersions("test()");
}

BOOST_AUTO_TEST_SUITE_END()

}
Expand Down

0 comments on commit 2dabbdf

Please sign in to comment.