mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Deterministically choose memory slots for variables independently of names that may depend on AST IDs.
This commit is contained in:
@@ -349,7 +349,7 @@ YulOptimizerTestCommon::YulOptimizerTestCommon(
|
||||
// Mark all variables with a name starting with "$" for escalation to memory.
|
||||
struct FakeUnreachableGenerator: ASTWalker
|
||||
{
|
||||
map<YulString, set<YulString>> fakeUnreachables;
|
||||
map<YulString, vector<YulString>> fakeUnreachables;
|
||||
using ASTWalker::operator();
|
||||
void operator()(FunctionDefinition const& _function) override
|
||||
{
|
||||
@@ -365,7 +365,8 @@ YulOptimizerTestCommon::YulOptimizerTestCommon(
|
||||
void visitVariableName(YulString _var)
|
||||
{
|
||||
if (!_var.empty() && _var.str().front() == '$')
|
||||
fakeUnreachables[m_currentFunction].insert(_var);
|
||||
if (!util::contains(fakeUnreachables[m_currentFunction], _var))
|
||||
fakeUnreachables[m_currentFunction].emplace_back(_var);
|
||||
}
|
||||
void operator()(VariableDeclaration const& _varDecl) override
|
||||
{
|
||||
|
||||
@@ -36,13 +36,13 @@
|
||||
// }
|
||||
// function f() -> x
|
||||
// {
|
||||
// mstore(0x20, 0)
|
||||
// mstore(0x20, 42)
|
||||
// mstore(0x40, 0)
|
||||
// mstore(0x40, 42)
|
||||
// let $x3_4, $x4_5 := g()
|
||||
// mstore(0x00, $x4_5)
|
||||
// mstore(0x40, $x3_4)
|
||||
// x := mul(add(mload(0x20), mload(0x40)), h(mload(0x00)))
|
||||
// sstore(mload(0x40), mload(0x00))
|
||||
// mstore(0x20, $x3_4)
|
||||
// x := mul(add(mload(0x40), mload(0x20)), h(mload(0x00)))
|
||||
// sstore(mload(0x20), mload(0x00))
|
||||
// }
|
||||
// function h(v) -> a_1
|
||||
// {
|
||||
|
||||
@@ -30,10 +30,10 @@
|
||||
// mstore(0x40, memoryguard(0x80))
|
||||
// function f()
|
||||
// {
|
||||
// mstore(0x40, 0)
|
||||
// mstore(0x60, 42)
|
||||
// sstore(mload(0x40), mload(0x60))
|
||||
// mstore(0x40, 21)
|
||||
// mstore(0x60, 0)
|
||||
// mstore(0x40, 42)
|
||||
// sstore(mload(0x60), mload(0x40))
|
||||
// mstore(0x60, 21)
|
||||
// }
|
||||
// function g(gx)
|
||||
// {
|
||||
@@ -60,9 +60,9 @@
|
||||
// {
|
||||
// let $hx_9, $hy_10, $hz_11, $hw_12 := tuple4()
|
||||
// mstore(0x00, $hw_12)
|
||||
// mstore(0x60, $hz_11)
|
||||
// mstore(0x20, $hz_11)
|
||||
// mstore(0x40, $hy_10)
|
||||
// mstore(0x20, $hx_9)
|
||||
// mstore(0x60, $hx_9)
|
||||
// {
|
||||
// let hx_13, $hy_14, hz_15, $hw_16 := tuple4()
|
||||
// mstore(0x00, $hw_16)
|
||||
@@ -73,7 +73,7 @@
|
||||
// {
|
||||
// let $hx_17, $hy_18, hz_19, hw_20 := tuple4()
|
||||
// mstore(0x40, $hy_18)
|
||||
// mstore(0x20, $hx_17)
|
||||
// mstore(0x60, $hx_17)
|
||||
// hw := hw_20
|
||||
// hz := hz_19
|
||||
// }
|
||||
|
||||
@@ -39,17 +39,17 @@
|
||||
// mstore(0x0140, b12)
|
||||
// mstore(0x0120, b13)
|
||||
// mstore(0x0100, b14)
|
||||
// mstore(0xc0, b17)
|
||||
// mstore(0xa0, b18)
|
||||
// mstore(0x80, b19)
|
||||
// mstore(0xe0, b29)
|
||||
// mstore(0xe0, b17)
|
||||
// mstore(0xc0, b18)
|
||||
// mstore(0xa0, b19)
|
||||
// mstore(0x80, b29)
|
||||
// sstore(0, mload(0x0100))
|
||||
// sstore(1, b15)
|
||||
// sstore(2, b16)
|
||||
// sstore(3, mload(0xc0))
|
||||
// sstore(4, mload(0xa0))
|
||||
// sstore(5, mload(0x80))
|
||||
// sstore(6, mload(0xe0))
|
||||
// v := add(mload(0x02a0), mload(0xe0))
|
||||
// sstore(3, mload(0xe0))
|
||||
// sstore(4, mload(0xc0))
|
||||
// sstore(5, mload(0xa0))
|
||||
// sstore(6, mload(0x80))
|
||||
// v := add(mload(0x02a0), mload(0x80))
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -42,20 +42,20 @@
|
||||
// mstore(0x0160, b13)
|
||||
// mstore(0x0140, b14)
|
||||
// mstore(0x0120, b15)
|
||||
// mstore(0xc0, b17)
|
||||
// mstore(0xa0, b18)
|
||||
// mstore(0x80, b19)
|
||||
// mstore(0xe0, b29)
|
||||
// mstore(0x0100, b30)
|
||||
// mstore(0x0100, b17)
|
||||
// mstore(0xe0, b18)
|
||||
// mstore(0xc0, b19)
|
||||
// mstore(0xa0, b29)
|
||||
// mstore(0x80, b30)
|
||||
// sstore(0, mload(0x0140))
|
||||
// sstore(1, mload(0x0120))
|
||||
// sstore(2, b16)
|
||||
// sstore(3, mload(0xc0))
|
||||
// sstore(4, mload(0xa0))
|
||||
// sstore(5, mload(0x80))
|
||||
// sstore(6, mload(0xe0))
|
||||
// sstore(7, mload(0x0100))
|
||||
// v := mload(0x0100)
|
||||
// sstore(mload(0x02e0), mload(0x0100))
|
||||
// sstore(3, mload(0x0100))
|
||||
// sstore(4, mload(0xe0))
|
||||
// sstore(5, mload(0xc0))
|
||||
// sstore(6, mload(0xa0))
|
||||
// sstore(7, mload(0x80))
|
||||
// v := mload(0x80)
|
||||
// sstore(mload(0x02e0), mload(0x80))
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -43,21 +43,21 @@
|
||||
// mstore(0x0180, b14)
|
||||
// mstore(0x0160, b15)
|
||||
// mstore(0x0140, b16)
|
||||
// mstore(0xc0, b17)
|
||||
// mstore(0xa0, b18)
|
||||
// mstore(0x80, b19)
|
||||
// mstore(0xe0, b29)
|
||||
// mstore(0x0120, b30)
|
||||
// mstore(0x0100, b31)
|
||||
// mstore(0x0120, b17)
|
||||
// mstore(0x0100, b18)
|
||||
// mstore(0xe0, b19)
|
||||
// mstore(0xc0, b29)
|
||||
// mstore(0xa0, b30)
|
||||
// mstore(0x80, b31)
|
||||
// sstore(0, mload(0x0180))
|
||||
// sstore(1, mload(0x0160))
|
||||
// sstore(2, mload(0x0140))
|
||||
// sstore(3, mload(0xc0))
|
||||
// sstore(4, mload(0xa0))
|
||||
// sstore(5, mload(0x80))
|
||||
// sstore(6, mload(0xe0))
|
||||
// sstore(7, mload(0x0120))
|
||||
// sstore(8, mload(0x0100))
|
||||
// v := add(mload(0x0320), mload(0x0100))
|
||||
// sstore(3, mload(0x0120))
|
||||
// sstore(4, mload(0x0100))
|
||||
// sstore(5, mload(0xe0))
|
||||
// sstore(6, mload(0xc0))
|
||||
// sstore(7, mload(0xa0))
|
||||
// sstore(8, mload(0x80))
|
||||
// v := add(mload(0x0320), mload(0x80))
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
// mstore(0x0140, 7)
|
||||
// mstore(0x0160, 8)
|
||||
// mstore(0x0180, 9)
|
||||
// mstore(0x01c0, 10)
|
||||
// mstore(0x01a0, 11)
|
||||
// mstore(0x01a0, 10)
|
||||
// mstore(0x01c0, 11)
|
||||
// mstore(0x01e0, 12)
|
||||
// let a_13 := 13
|
||||
// let a_14 := 14
|
||||
@@ -50,6 +50,6 @@
|
||||
// let a_18 := 18
|
||||
// let a_19 := 19
|
||||
// let a_20 := 20
|
||||
// verbatim_20i_0o("test", mload(0x80), mload(0xa0), mload(0xc0), mload(0xe0), mload(0x0100), mload(0x0120), mload(0x0140), mload(0x0160), mload(0x0180), mload(0x01c0), mload(0x01a0), mload(0x01e0), a_13, a_14, a_15, a_16, a_17, a_18, a_19, a_20)
|
||||
// verbatim_20i_0o("test", mload(0x80), mload(0xa0), mload(0xc0), mload(0xe0), mload(0x0100), mload(0x0120), mload(0x0140), mload(0x0160), mload(0x0180), mload(0x01a0), mload(0x01c0), mload(0x01e0), a_13, a_14, a_15, a_16, a_17, a_18, a_19, a_20)
|
||||
// }
|
||||
// }
|
||||
|
||||
+20
-20
@@ -51,17 +51,17 @@
|
||||
// {
|
||||
// {
|
||||
// mstore(0x40, memoryguard(0x0280))
|
||||
// mstore(0x80, 1)
|
||||
// mstore(0xa0, 2)
|
||||
// mstore(0xc0, 3)
|
||||
// mstore(0xe0, 4)
|
||||
// mstore(0x0100, 5)
|
||||
// mstore(0x0120, 6)
|
||||
// mstore(0x0140, 7)
|
||||
// mstore(0x0160, 8)
|
||||
// mstore(0x0180, 9)
|
||||
// mstore(0x0240, 10)
|
||||
// mstore(0x0220, 11)
|
||||
// mstore(0x0100, 1)
|
||||
// mstore(0x0120, 2)
|
||||
// mstore(0x0140, 3)
|
||||
// mstore(0x0160, 4)
|
||||
// mstore(0x0180, 5)
|
||||
// mstore(0x01a0, 6)
|
||||
// mstore(0x01c0, 7)
|
||||
// mstore(0x01e0, 8)
|
||||
// mstore(0x0200, 9)
|
||||
// mstore(0x0220, 10)
|
||||
// mstore(0x0240, 11)
|
||||
// mstore(0x0260, 12)
|
||||
// let a_13 := 13
|
||||
// let a_14 := 14
|
||||
@@ -71,11 +71,11 @@
|
||||
// let a_18 := 18
|
||||
// let a_19 := 19
|
||||
// let a_20 := 20
|
||||
// let b_1_1, b_2_2, b_3_3, b_4_4, b_5_5, b_6_6, b_7_7, b_8_8, b_9_9, b_10_10, b_11_11, b_12_12, b_13_13, b_14_14, b_15_15, b_16_16, b_17_17, b_18_18, b_19_19, b_20_20 := verbatim_20i_20o("test", mload(0x80), mload(0xa0), mload(0xc0), mload(0xe0), mload(0x0100), mload(0x0120), mload(0x0140), mload(0x0160), mload(0x0180), mload(0x0240), mload(0x0220), mload(0x0260), a_13, a_14, a_15, a_16, a_17, a_18, a_19, a_20)
|
||||
// mstore(0x01a0, b_4_4)
|
||||
// mstore(0x01c0, b_3_3)
|
||||
// mstore(0x01e0, b_2_2)
|
||||
// mstore(0x0200, b_1_1)
|
||||
// let b_1_1, b_2_2, b_3_3, b_4_4, b_5_5, b_6_6, b_7_7, b_8_8, b_9_9, b_10_10, b_11_11, b_12_12, b_13_13, b_14_14, b_15_15, b_16_16, b_17_17, b_18_18, b_19_19, b_20_20 := verbatim_20i_20o("test", mload(0x0100), mload(0x0120), mload(0x0140), mload(0x0160), mload(0x0180), mload(0x01a0), mload(0x01c0), mload(0x01e0), mload(0x0200), mload(0x0220), mload(0x0240), mload(0x0260), a_13, a_14, a_15, a_16, a_17, a_18, a_19, a_20)
|
||||
// mstore(0x80, b_4_4)
|
||||
// mstore(0xa0, b_3_3)
|
||||
// mstore(0xc0, b_2_2)
|
||||
// mstore(0xe0, b_1_1)
|
||||
// let b_20 := b_20_20
|
||||
// let b_19 := b_19_19
|
||||
// let b_18 := b_18_18
|
||||
@@ -92,10 +92,10 @@
|
||||
// let b_7 := b_7_7
|
||||
// let b_6 := b_6_6
|
||||
// let b_5 := b_5_5
|
||||
// sstore(1, mload(0x0200))
|
||||
// sstore(2, mload(0x01e0))
|
||||
// sstore(3, mload(0x01c0))
|
||||
// sstore(4, mload(0x01a0))
|
||||
// sstore(1, mload(0xe0))
|
||||
// sstore(2, mload(0xc0))
|
||||
// sstore(3, mload(0xa0))
|
||||
// sstore(4, mload(0x80))
|
||||
// sstore(5, b_5)
|
||||
// sstore(6, b_6)
|
||||
// sstore(7, b_7)
|
||||
|
||||
Reference in New Issue
Block a user