Merge pull request #5326 from ethereum/removeSideEffectFreeStatements

[Yul] Remove side-effect-free statements.
This commit is contained in:
chriseth 2018-11-08 19:09:07 +01:00 committed by GitHub
commit cbd0116e98
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 7 deletions

View File

@ -135,6 +135,8 @@ If there are two assignments to a variable where the first one is a movable expr
and the variable is not used between the two assignments (and the second is not inside and the variable is not used between the two assignments (and the second is not inside
a loop or conditional, the first one is not inside), the first assignment is removed. a loop or conditional, the first one is not inside), the first assignment is removed.
This step also removes movable expression statements.
## Function Unifier ## Function Unifier

View File

@ -85,6 +85,16 @@ void UnusedPruner::operator()(Block& _block)
}}; }};
} }
} }
else if (statement.type() == typeid(ExpressionStatement))
{
ExpressionStatement& exprStmt = boost::get<ExpressionStatement>(statement);
if (MovableChecker(exprStmt.expression).movable())
{
// pop(x) should be movable!
subtractReferences(ReferencesCounter::countReferences(exprStmt.expression));
statement = Block{std::move(exprStmt.location), {}};
}
}
removeEmptyBlocks(_block); removeEmptyBlocks(_block);

View File

@ -32,10 +32,8 @@ namespace yul
{ {
/** /**
* Optimisation stage that removes unused variables and functions. * Optimisation stage that removes unused variables and functions and also
* * removes movable expression statements.
* TODO: Also remove intermediate variable assignments from movable expressions
* which are not referenced until after the next assignment to the same variable.
* *
* Note that this does not remove circular references. * Note that this does not remove circular references.
* *

View File

@ -16,9 +16,7 @@
// { // {
// let _18 := 0x20 // let _18 := 0x20
// let allocate__7 := 0x40 // let allocate__7 := 0x40
// let allocate_p_12 := mload(allocate__7) // mstore(allocate__7, add(mload(allocate__7), _18))
// mstore(allocate__7, add(allocate_p_12, _18))
// pop(allocate_p_12)
// let allocate_p_12_31 := mload(allocate__7) // let allocate_p_12_31 := mload(allocate__7)
// mstore(allocate__7, add(allocate_p_12_31, allocate__7)) // mstore(allocate__7, add(allocate_p_12_31, allocate__7))
// mstore(add(allocate_p_12_31, 96), 2) // mstore(add(allocate_p_12_31, 96), 2)

View File

@ -0,0 +1,8 @@
{
let a := 1
pop(a)
}
// ----
// unusedPruner
// {
// }