Merge pull request #5325 from ethereum/fixDataFlow

[Yul] Fix data flow analyzer for function definitions.
This commit is contained in:
chriseth 2018-11-08 12:52:51 +01:00 committed by GitHub
commit cd11f7cfac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 117 additions and 0 deletions

View File

@ -84,13 +84,26 @@ void DataFlowAnalyzer::operator()(Switch& _switch)
void DataFlowAnalyzer::operator()(FunctionDefinition& _fun)
{
// Save all information. We might rather reinstantiate this class,
// but this could be difficult if it is subclassed.
map<YulString, Expression const*> value;
map<YulString, set<YulString>> references;
map<YulString, set<YulString>> referencedBy;
m_value.swap(value);
m_references.swap(references);
m_referencedBy.swap(referencedBy);
pushScope(true);
for (auto const& parameter: _fun.parameters)
m_variableScopes.back().variables.emplace(parameter.name);
for (auto const& var: _fun.returnVariables)
m_variableScopes.back().variables.emplace(var.name);
ASTModifier::operator()(_fun);
popScope();
m_value.swap(value);
m_references.swap(references);
m_referencedBy.swap(referencedBy);
}
void DataFlowAnalyzer::operator()(ForLoop& _for)

View File

@ -0,0 +1,52 @@
{
let _13 := 0x20
let _14 := allocate(_13)
pop(_14)
let _15 := 2
let _16 := 3
let _17 := 0x40
let _18 := allocate(_17)
let _19 := array_index_access(_18, _16)
mstore(_19, _15)
function allocate(size) -> p
{
let _1 := 0x40
let p_2 := mload(_1)
p := p_2
let _20 := add(p_2, size)
mstore(_1, _20)
}
function array_index_access(array, index) -> p_1
{
let _21 := 0x20
let _22 := mul(index, _21)
p_1 := add(array, _22)
}
}
// ----
// commonSubexpressionEliminator
// {
// let _13 := 0x20
// let _14 := allocate(_13)
// pop(_14)
// let _15 := 2
// let _16 := 3
// let _17 := 0x40
// let _18 := allocate(_17)
// let _19 := array_index_access(_18, _16)
// mstore(_19, _15)
// function allocate(size) -> p
// {
// let _1 := 0x40
// let p_2 := mload(_1)
// p := p_2
// let _20 := add(p_2, size)
// mstore(_1, _20)
// }
// function array_index_access(array, index) -> p_1
// {
// let _21 := 0x20
// let _22 := mul(index, _21)
// p_1 := add(array, _22)
// }
// }

View File

@ -0,0 +1,52 @@
{
function allocate(size) -> p
{
let _1 := 0x40
p := mload(_1)
let _2 := add(p, size)
let _3 := 0x40
mstore(_3, _2)
}
function array_index_access(array, index) -> p_1
{
let _4 := 0x20
let _5 := mul(index, _4)
p_1 := add(array, _5)
}
let _6 := 0x20
let _7 := allocate(_6)
pop(_7)
let _8 := 0x40
let x := allocate(_8)
let _9 := 2
let _10 := 3
let _11 := array_index_access(x, _10)
mstore(_11, _9)
}
// ----
// commonSubexpressionEliminator
// {
// function allocate(size) -> p
// {
// let _1 := 0x40
// p := mload(_1)
// let _2 := add(p, size)
// let _3 := _1
// mstore(_1, _2)
// }
// function array_index_access(array, index) -> p_1
// {
// let _4 := 0x20
// let _5 := mul(index, _4)
// p_1 := add(array, _5)
// }
// let _6 := 0x20
// let _7 := allocate(_6)
// pop(_7)
// let _8 := 0x40
// let x := allocate(_8)
// let _9 := 2
// let _10 := 3
// let _11 := array_index_access(x, _10)
// mstore(_11, _9)
// }