mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #5325 from ethereum/fixDataFlow
[Yul] Fix data flow analyzer for function definitions.
This commit is contained in:
commit
cd11f7cfac
@ -84,13 +84,26 @@ void DataFlowAnalyzer::operator()(Switch& _switch)
|
|||||||
|
|
||||||
void DataFlowAnalyzer::operator()(FunctionDefinition& _fun)
|
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);
|
pushScope(true);
|
||||||
|
|
||||||
for (auto const& parameter: _fun.parameters)
|
for (auto const& parameter: _fun.parameters)
|
||||||
m_variableScopes.back().variables.emplace(parameter.name);
|
m_variableScopes.back().variables.emplace(parameter.name);
|
||||||
for (auto const& var: _fun.returnVariables)
|
for (auto const& var: _fun.returnVariables)
|
||||||
m_variableScopes.back().variables.emplace(var.name);
|
m_variableScopes.back().variables.emplace(var.name);
|
||||||
ASTModifier::operator()(_fun);
|
ASTModifier::operator()(_fun);
|
||||||
|
|
||||||
popScope();
|
popScope();
|
||||||
|
m_value.swap(value);
|
||||||
|
m_references.swap(references);
|
||||||
|
m_referencedBy.swap(referencedBy);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataFlowAnalyzer::operator()(ForLoop& _for)
|
void DataFlowAnalyzer::operator()(ForLoop& _for)
|
||||||
|
@ -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)
|
||||||
|
// }
|
||||||
|
// }
|
@ -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)
|
||||||
|
// }
|
Loading…
Reference in New Issue
Block a user