mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Reuse function argument slots and defer allocation of return variable slots in EVMCodeTransform.
This commit is contained in:
@@ -150,6 +150,7 @@ sub_0: assembly {
|
||||
revert(0x00, 0x24)
|
||||
/* "#utility.yul":196:425 */
|
||||
tag_22:
|
||||
/* "#utility.yul":236:239 */
|
||||
0x00
|
||||
/* "#utility.yul":267:268 */
|
||||
dup3
|
||||
|
||||
@@ -155,6 +155,7 @@ sub_0: assembly {
|
||||
revert(0x00, 0x24)
|
||||
/* "#utility.yul":196:425 */
|
||||
tag_19:
|
||||
/* "#utility.yul":236:239 */
|
||||
0x00
|
||||
/* "#utility.yul":267:268 */
|
||||
dup3
|
||||
|
||||
@@ -117,16 +117,63 @@ BOOST_AUTO_TEST_CASE(many_variables_many_uses)
|
||||
BOOST_CHECK_EQUAL(out, "f: 10 ");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(many_return_variables)
|
||||
BOOST_AUTO_TEST_CASE(many_return_variables_unused_arguments)
|
||||
{
|
||||
string out = check(R"({
|
||||
function f(a, b) -> r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19 {
|
||||
}
|
||||
})");
|
||||
BOOST_CHECK_EQUAL(out, "f: 3 ");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(many_return_variables_used_arguments)
|
||||
{
|
||||
string out = check(R"({
|
||||
function f(a, b) -> r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19 {
|
||||
r1 := 0
|
||||
sstore(a, b)
|
||||
}
|
||||
})");
|
||||
BOOST_CHECK_EQUAL(out, "f: 5 ");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(multiple_functions)
|
||||
BOOST_AUTO_TEST_CASE(multiple_functions_used_arguments)
|
||||
{
|
||||
string out = check(R"({
|
||||
function f(a, b) -> r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19 {
|
||||
r1 := 0
|
||||
sstore(a, b)
|
||||
}
|
||||
function g(r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19) -> x, y {
|
||||
x := 0
|
||||
sstore(r1, r2)
|
||||
}
|
||||
function h(x) {
|
||||
let r1 := 0
|
||||
let r2 := 0
|
||||
let r3 := 0
|
||||
let r4 := 0
|
||||
let r5 := 0
|
||||
let r6 := 0
|
||||
let r7 := 0
|
||||
let r8 := 0
|
||||
let r9 := 0
|
||||
let r10 := 0
|
||||
let r11 := 0
|
||||
let r12 := 0
|
||||
let r13 := 0
|
||||
let r14 := 0
|
||||
let r15 := 0
|
||||
let r16 := 0
|
||||
let r17 := 0
|
||||
let r18 := 0
|
||||
x := add(add(add(add(add(add(add(add(add(add(add(add(x, r12), r11), r10), r9), r8), r7), r6), r5), r4), r3), r2), r1)
|
||||
}
|
||||
})");
|
||||
BOOST_CHECK_EQUAL(out, "h: 9 g: 3 f: 5 ");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(multiple_functions_unused_arguments)
|
||||
{
|
||||
string out = check(R"({
|
||||
function f(a, b) -> r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19 {
|
||||
@@ -155,10 +202,47 @@ BOOST_AUTO_TEST_CASE(multiple_functions)
|
||||
x := add(add(add(add(add(add(add(add(add(add(add(add(x, r12), r11), r10), r9), r8), r7), r6), r5), r4), r3), r2), r1)
|
||||
}
|
||||
})");
|
||||
BOOST_CHECK_EQUAL(out, "h: 9 g: 5 f: 5 ");
|
||||
BOOST_CHECK_EQUAL(out, "h: 9 f: 3 ");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(nested)
|
||||
BOOST_AUTO_TEST_CASE(nested_used_arguments)
|
||||
{
|
||||
string out = check(R"({
|
||||
function h(x) {
|
||||
let r1 := 0
|
||||
let r2 := 0
|
||||
let r3 := 0
|
||||
let r4 := 0
|
||||
let r5 := 0
|
||||
let r6 := 0
|
||||
let r7 := 0
|
||||
let r8 := 0
|
||||
let r9 := 0
|
||||
let r10 := 0
|
||||
let r11 := 0
|
||||
let r12 := 0
|
||||
let r13 := 0
|
||||
let r14 := 0
|
||||
let r15 := 0
|
||||
let r16 := 0
|
||||
let r17 := 0
|
||||
let r18 := 0
|
||||
function f(a, b) -> t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19 {
|
||||
function g(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19) -> w, v {
|
||||
w := v
|
||||
sstore(s1, s2)
|
||||
}
|
||||
t1 := t2
|
||||
sstore(a, b)
|
||||
}
|
||||
x := add(add(add(add(add(add(add(add(add(add(add(add(x, r12), r11), r10), r9), r8), r7), r6), r5), r4), r3), r2), r1)
|
||||
}
|
||||
})");
|
||||
BOOST_CHECK_EQUAL(out, "h: 9 g: 3 f: 5 ");
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(nested_unused_arguments)
|
||||
{
|
||||
string out = check(R"({
|
||||
function h(x) {
|
||||
@@ -187,10 +271,42 @@ BOOST_AUTO_TEST_CASE(nested)
|
||||
x := add(add(add(add(add(add(add(add(add(add(add(add(x, r12), r11), r10), r9), r8), r7), r6), r5), r4), r3), r2), r1)
|
||||
}
|
||||
})");
|
||||
BOOST_CHECK_EQUAL(out, "h: 9 g: 5 f: 5 ");
|
||||
BOOST_CHECK_EQUAL(out, "h: 9 f: 3 ");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(also_in_outer_block)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(also_in_outer_block_used_arguments)
|
||||
{
|
||||
string out = check(R"({
|
||||
let x := 0
|
||||
let r1 := 0
|
||||
let r2 := 0
|
||||
let r3 := 0
|
||||
let r4 := 0
|
||||
let r5 := 0
|
||||
let r6 := 0
|
||||
let r7 := 0
|
||||
let r8 := 0
|
||||
let r9 := 0
|
||||
let r10 := 0
|
||||
let r11 := 0
|
||||
let r12 := 0
|
||||
let r13 := 0
|
||||
let r14 := 0
|
||||
let r15 := 0
|
||||
let r16 := 0
|
||||
let r17 := 0
|
||||
let r18 := 0
|
||||
x := add(add(add(add(add(add(add(add(add(add(add(add(x, r12), r11), r10), r9), r8), r7), r6), r5), r4), r3), r2), r1)
|
||||
function g(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19) -> w, v {
|
||||
w := v
|
||||
sstore(s1, s2)
|
||||
}
|
||||
})");
|
||||
BOOST_CHECK_EQUAL(out, "g: 3 : 9 ");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(also_in_outer_block_unused_arguments)
|
||||
{
|
||||
string out = check(R"({
|
||||
let x := 0
|
||||
@@ -216,7 +332,7 @@ BOOST_AUTO_TEST_CASE(also_in_outer_block)
|
||||
function g(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19) -> w, v {
|
||||
}
|
||||
})");
|
||||
BOOST_CHECK_EQUAL(out, "g: 5 : 9 ");
|
||||
BOOST_CHECK_EQUAL(out, ": 9 ");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
@@ -12,18 +12,17 @@
|
||||
// PUSH1 0xD
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x16
|
||||
// PUSH1 0x15
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP3
|
||||
// SWAP2
|
||||
// POP
|
||||
// POP
|
||||
// SWAP1
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x20
|
||||
// PUSH1 0x1F
|
||||
// PUSH1 0x4
|
||||
// PUSH1 0x3
|
||||
// PUSH1 0xD
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
// PUSH1 0x8
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// POP
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
|
||||
@@ -8,18 +8,17 @@
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x11
|
||||
// PUSH1 0x10
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP5
|
||||
// POP
|
||||
// SWAP5
|
||||
// SWAP3
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// SWAP1
|
||||
// SWAP2
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
|
||||
+11
-12
@@ -4,14 +4,18 @@
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x1F
|
||||
// PUSH1 0x1E
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x3
|
||||
// SWAP4
|
||||
// POP
|
||||
// PUSH1 0x3
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x9
|
||||
// PUSH1 0x2
|
||||
// SWAP2
|
||||
@@ -21,12 +25,7 @@
|
||||
// MSTORE
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// SWAP5
|
||||
// POP
|
||||
// SWAP5
|
||||
// SWAP3
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// SWAP1
|
||||
// SWAP2
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
|
||||
@@ -14,19 +14,19 @@
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// DUP2
|
||||
// SWAP2
|
||||
// POP
|
||||
// DUP1
|
||||
// POP
|
||||
// PUSH1 0x3
|
||||
// SWAP2
|
||||
// POP
|
||||
// DUP2
|
||||
// SWAP1
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// SWAP3
|
||||
// DUP1
|
||||
// SWAP2
|
||||
// POP
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// SWAP1
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x7
|
||||
|
||||
@@ -10,15 +10,14 @@
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x15
|
||||
// PUSH1 0x14
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP3
|
||||
// SWAP2
|
||||
// POP
|
||||
// POP
|
||||
// SWAP1
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
@@ -28,13 +27,13 @@
|
||||
// SWAP2
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x1F
|
||||
// PUSH1 0x1E
|
||||
// PUSH1 0x2
|
||||
// PUSH1 0x1
|
||||
// PUSH1 0x3
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x29
|
||||
// PUSH1 0x28
|
||||
// PUSH1 0x4
|
||||
// PUSH1 0x3
|
||||
// PUSH1 0x3
|
||||
@@ -43,12 +42,12 @@
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x32
|
||||
// PUSH1 0xC
|
||||
// PUSH1 0x31
|
||||
// PUSH1 0xB
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x38
|
||||
// PUSH1 0xC
|
||||
// PUSH1 0x37
|
||||
// PUSH1 0xB
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// SWAP2
|
||||
|
||||
@@ -31,6 +31,7 @@ object "Contract" {
|
||||
// tag_7
|
||||
// jumpi
|
||||
// /* "source":82:87 */
|
||||
// pop
|
||||
// jump(tag_6)
|
||||
// /* "source":75:77 */
|
||||
// tag_7:
|
||||
@@ -47,8 +48,8 @@ object "Contract" {
|
||||
// jump // in
|
||||
// tag_8:
|
||||
// /* "source":73:104 */
|
||||
// tag_6:
|
||||
// pop
|
||||
// tag_6:
|
||||
// jump // out
|
||||
// tag_1:
|
||||
// /* "source":109:113 */
|
||||
@@ -59,6 +60,6 @@ object "Contract" {
|
||||
// tag_5
|
||||
// jump // in
|
||||
// tag_9:
|
||||
// Bytecode: 6025565b600b6001600e565b5b565b80156017576022565b602160028201600e565b5b50565b602d6001600e565b
|
||||
// Opcodes: PUSH1 0x25 JUMP JUMPDEST PUSH1 0xB PUSH1 0x1 PUSH1 0xE JUMP JUMPDEST JUMPDEST JUMP JUMPDEST DUP1 ISZERO PUSH1 0x17 JUMPI PUSH1 0x22 JUMP JUMPDEST PUSH1 0x21 PUSH1 0x2 DUP3 ADD PUSH1 0xE JUMP JUMPDEST JUMPDEST POP JUMP JUMPDEST PUSH1 0x2D PUSH1 0x1 PUSH1 0xE JUMP JUMPDEST
|
||||
// SourceMappings: 33:21:0:-:0;;;48:4;50:1;48:4;:::i;:::-;46:8;:::o;59:45::-;78:1;75:2;;;82:5;;75:2;90:12;99:1;96;92:9;90:12;:::i;:::-;73:31;;:::o;:::-;109:4;111:1;109:4;:::i;:::-
|
||||
// Bytecode: 6026565b600b6001600e565b5b565b8015601857506024565b602260028201600e565b505b565b602e6001600e565b
|
||||
// Opcodes: PUSH1 0x26 JUMP JUMPDEST PUSH1 0xB PUSH1 0x1 PUSH1 0xE JUMP JUMPDEST JUMPDEST JUMP JUMPDEST DUP1 ISZERO PUSH1 0x18 JUMPI POP PUSH1 0x24 JUMP JUMPDEST PUSH1 0x22 PUSH1 0x2 DUP3 ADD PUSH1 0xE JUMP JUMPDEST POP JUMPDEST JUMP JUMPDEST PUSH1 0x2E PUSH1 0x1 PUSH1 0xE JUMP JUMPDEST
|
||||
// SourceMappings: 33:21:0:-:0;;;48:4;50:1;48:4;:::i;:::-;46:8;:::o;59:45::-;78:1;75:2;;;82:5;;;75:2;90:12;99:1;96;92:9;90:12;:::i;:::-;73:31;;:::o;:::-;109:4;111:1;109:4;:::i;:::-
|
||||
|
||||
Reference in New Issue
Block a user