Merge pull request #9985 from ethereum/optimizeDeleteStructSol2Yul

[Sol->Yul] Optimizing delete struct.
This commit is contained in:
chriseth
2020-10-15 16:03:06 +02:00
committed by GitHub
5 changed files with 140 additions and 11 deletions
@@ -0,0 +1,35 @@
contract C {
struct S {
uint32 a;
S[] x;
}
S s;
function f() public returns (uint256 r1, uint256 r2, uint256 r3) {
assembly {
// 2 ** 150 - 1
sstore(s.slot, 1427247692705959881058285969449495136382746623)
}
s.a = 1;
s.x.push(); s.x.push();
S storage ptr1 = s.x[0];
S storage ptr2 = s.x[1];
assembly {
// 2 ** 150 - 1
sstore(ptr1.slot, 1427247692705959881058285969449495136382746623)
sstore(ptr2.slot, 1427247692705959881058285969449495136382746623)
}
s.x[0].a = 2; s.x[1].a = 3;
delete s;
assert(s.a == 0);
assert(s.x.length == 0);
assembly {
r1 := sload(s.slot)
r2 := sload(ptr1.slot)
r3 := sload(ptr2.slot)
}
}
}
// ====
// compileViaYul: true
// ----
// f() -> 0, 0, 0
@@ -0,0 +1,24 @@
contract C {
struct S {
uint64 y;
uint64 z;
}
S s;
function f() public returns (uint256 ret) {
assembly {
// 2 ** 150 - 1
sstore(s.slot, 1427247692705959881058285969449495136382746623)
}
s.y = 1; s.z = 2;
delete s;
assert(s.y == 0);
assert(s.z == 0);
assembly {
ret := sload(s.slot)
}
}
}
// ====
// compileViaYul: true
// ----
// f() -> 0
@@ -0,0 +1,29 @@
contract C {
struct S {
uint32 a;
uint32[3] b;
uint32[] x;
}
S s;
function f() public returns (uint256 ret) {
assembly {
// 2 ** 150 - 1
sstore(s.slot, 1427247692705959881058285969449495136382746623)
}
s.a = 1;
s.b[0] = 2; s.b[1] = 3;
s.x.push(4); s.x.push(5);
delete s;
assert(s.a == 0);
assert(s.b[0] == 0);
assert(s.b[1] == 0);
assert(s.x.length == 0);
assembly {
ret := sload(s.slot)
}
}
}
// ====
// compileViaYul: true
// ----
// f() -> 0