Skip to content

Commit

Permalink
Update Solidity to 0.5.16
Browse files Browse the repository at this point in the history
  • Loading branch information
neo hong committed Mar 1, 2021
2 parents ed412d1 + 9c3226c commit 7d79e84
Show file tree
Hide file tree
Showing 9 changed files with 106 additions and 26 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ include(EthPolicy)
eth_policy()

# project name and version should be set after cmake_policy CMP0048
set(PROJECT_VERSION "0.5.15")
set(PROJECT_VERSION "0.5.16")
project(solidity VERSION ${PROJECT_VERSION} LANGUAGES C CXX)

include(TestBigEndian)
Expand Down
7 changes: 6 additions & 1 deletion Changelog.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
### 0.5.16 (2020-01-02)

Bugfixes:
* Yul Optimizer: Fix bug in redundant assignment remover in combination with break and continue statements.


### 0.5.15 (2019-12-17)

Bugfixes:
* Yul Optimizer: Fix incorrect redundant load optimization crossing user-defined functions that contain for-loops with memory / storage writes.


### 0.5.14 (2019-12-09)

Language Features:
Expand Down
11 changes: 11 additions & 0 deletions docs/bugs.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
[
{
"name": "YulOptimizerRedundantAssignmentBreakContinue0.5",
"summary": "The Yul optimizer can remove essential assignments to variables declared inside for loops when Yul's continue or break statement is used. You are unlikely to be affected if you do not use inline assembly with for loops and continue and break statements.",
"description": "The Yul optimizer has a stage that removes assignments to variables that are overwritten again or are not used in all following control-flow branches. This logic incorrectly removes such assignments to variables declared inside a for loop if they can be removed in a control-flow branch that ends with ``break`` or ``continue`` even though they cannot be removed in other control-flow branches. Variables declared outside of the respective for loop are not affected.",
"introduced": "0.5.8",
"fixed": "0.5.16",
"severity": "low",
"conditions": {
"yulOptimizer": true
}
},
{
"name": "ABIEncoderV2LoopYulOptimizer",
"summary": "If both the experimental ABIEncoderV2 and the experimental Yul optimizer are activated, one component of the Yul optimizer may reuse data in memory that has been changed in the meantime.",
Expand Down
24 changes: 20 additions & 4 deletions docs/bugs_by_version.json
Original file line number Diff line number Diff line change
Expand Up @@ -742,32 +742,46 @@
},
"0.5.10": {
"bugs": [
"YulOptimizerRedundantAssignmentBreakContinue0.5",
"ABIEncoderV2CalldataStructsWithStaticallySizedAndDynamicallyEncodedMembers"
],
"released": "2019-06-25"
},
"0.5.11": {
"bugs": [],
"bugs": [
"YulOptimizerRedundantAssignmentBreakContinue0.5"
],
"released": "2019-08-12"
},
"0.5.12": {
"bugs": [],
"bugs": [
"YulOptimizerRedundantAssignmentBreakContinue0.5"
],
"released": "2019-10-01"
},
"0.5.13": {
"bugs": [],
"bugs": [
"YulOptimizerRedundantAssignmentBreakContinue0.5"
],
"released": "2019-11-14"
},
"0.5.14": {
"bugs": [
"YulOptimizerRedundantAssignmentBreakContinue0.5",
"ABIEncoderV2LoopYulOptimizer"
],
"released": "2019-12-09"
},
"0.5.15": {
"bugs": [],
"bugs": [
"YulOptimizerRedundantAssignmentBreakContinue0.5"
],
"released": "2019-12-17"
},
"0.5.16": {
"bugs": [],
"released": "2020-01-02"
},
"0.5.2": {
"bugs": [
"SignedArrayStorageCopy",
Expand Down Expand Up @@ -840,6 +854,7 @@
},
"0.5.8": {
"bugs": [
"YulOptimizerRedundantAssignmentBreakContinue0.5",
"ABIEncoderV2CalldataStructsWithStaticallySizedAndDynamicallyEncodedMembers",
"SignedArrayStorageCopy",
"ABIEncoderV2StorageArrayWithMultiSlotElement",
Expand All @@ -849,6 +864,7 @@
},
"0.5.9": {
"bugs": [
"YulOptimizerRedundantAssignmentBreakContinue0.5",
"ABIEncoderV2CalldataStructsWithStaticallySizedAndDynamicallyEncodedMembers",
"SignedArrayStorageCopy",
"ABIEncoderV2StorageArrayWithMultiSlotElement"
Expand Down
31 changes: 15 additions & 16 deletions libyul/optimiser/RedundantAssignEliminator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -268,29 +268,28 @@ void RedundantAssignEliminator::changeUndecidedTo(YulString _variable, Redundant

void RedundantAssignEliminator::finalize(YulString _variable, RedundantAssignEliminator::State _finalState)
{
finalize(m_assignments, _variable, _finalState);
for (auto& assignments: m_forLoopInfo.pendingBreakStmts)
finalize(assignments, _variable, _finalState);
for (auto& assignments: m_forLoopInfo.pendingContinueStmts)
finalize(assignments, _variable, _finalState);
}
std::map<Assignment const*, State> assignments;
joinMap(assignments, std::move(m_assignments[_variable]), State::join);
m_assignments.erase(_variable);

void RedundantAssignEliminator::finalize(
TrackedAssignments& _assignments,
YulString _variable,
RedundantAssignEliminator::State _finalState
)
{
for (auto const& assignment: _assignments[_variable])
for (auto& breakAssignments: m_forLoopInfo.pendingBreakStmts)
{
joinMap(assignments, std::move(breakAssignments[_variable]), State::join);
breakAssignments.erase(_variable);
}
for (auto& continueAssignments: m_forLoopInfo.pendingContinueStmts)
{
joinMap(assignments, std::move(continueAssignments[_variable]), State::join);
continueAssignments.erase(_variable);
}

for (auto const& assignment: assignments)
{
State const state = assignment.second == State::Undecided ? _finalState : assignment.second;

if (state == State::Unused && SideEffectsCollector{*m_dialect, *assignment.first->value}.movable())
// TODO the only point where we actually need this
// to be a set is for the for loop
m_pendingRemovals.insert(assignment.first);
}
_assignments.erase(_variable);
}

void AssignmentRemover::operator()(Block& _block)
Expand Down
2 changes: 0 additions & 2 deletions libyul/optimiser/RedundantAssignEliminator.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,6 @@ class RedundantAssignEliminator: public ASTWalker
/// assignments to the final state. In this case, this also applies to pending
/// break and continue TrackedAssignments.
void finalize(YulString _variable, State _finalState);
/// Helper function for the above.
void finalize(TrackedAssignments& _assignments, YulString _variable, State _finalState);

Dialect const* m_dialect;
std::set<YulString> m_declaredVariables;
Expand Down
2 changes: 0 additions & 2 deletions test/libsolidity/SolidityEndToEndTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14718,8 +14718,6 @@ BOOST_AUTO_TEST_CASE(event_wrong_abi_name)
)";
compileAndRun(sourceCode, 0, "ClientReceipt", bytes());
compileAndRun(sourceCode, 0, "Test", bytes(), map<string, Address>{{"ClientReceipt", m_contractAddress}});
//u256 value(18);
//u256 id(0x1234);

callContractFunction("f()");
BOOST_REQUIRE_EQUAL(numLogs(), 1);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
let i := 0
for {} lt(i, 2) { i := add(i, 1) }
{
let x
x := 1337
if lt(i,1) {
x := 42
break
}
mstore(0, x)
}
}
// ====
// step: redundantAssignEliminator
// ----
// {
// let i := 0
// for { } lt(i, 2) { i := add(i, 1) }
// {
// let x
// x := 1337
// if lt(i, 1) { break }
// mstore(0, x)
// }
// }
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
let i := 0
for {} lt(i, 2) { i := add(i, 1) }
{
let x
x := 1337
if lt(i,1) {
x := 42
continue
}
mstore(0, x)
}
}

// ====
// step: redundantAssignEliminator
// ----
// {
// let i := 0
// for { } lt(i, 2) { i := add(i, 1) }
// {
// let x
// x := 1337
// if lt(i, 1) { continue }
// mstore(0, x)
// }
// }

0 comments on commit 7d79e84

Please sign in to comment.