diff --git a/test/libyul/evmCodeTransform/stackReuse/function_argument_reuse.yul b/test/libyul/evmCodeTransform/stackReuse/function_argument_reuse.yul new file mode 100644 index 000000000..7ef71fb93 --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_argument_reuse.yul @@ -0,0 +1,28 @@ +{ + function f(a, b, c) -> x { pop(address()) sstore(a, c) pop(callvalue()) x := b } +} +// ==== +// stackOptimization: true +// ---- +// PUSH1 0x17 +// JUMP +// JUMPDEST +// PUSH1 0x0 +// ADDRESS +// POP +// DUP4 +// DUP3 +// SSTORE +// CALLVALUE +// POP +// DUP3 +// SWAP1 +// POP +// JUMPDEST +// SWAP4 +// SWAP3 +// POP +// POP +// POP +// JUMP +// JUMPDEST diff --git a/test/libyul/evmCodeTransform/stackReuse/function_many_arguments.yul b/test/libyul/evmCodeTransform/stackReuse/function_many_arguments.yul new file mode 100644 index 000000000..b46cec50a --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_many_arguments.yul @@ -0,0 +1,27 @@ +{ +/* function f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) -> x { + mstore(0x0100, a1) + mstore(0x0120, a2) + mstore(0x0140, a3) + mstore(0x0160, a4) + mstore(0x0180, a5) + mstore(0x01A0, a6) + mstore(0x01C0, a7) + mstore(0x01E0, a8) + mstore(0x0200, a9) + mstore(0x0220, a10) + mstore(0x0240, a11) + mstore(0x0260, a12) + mstore(0x0280, a13) + mstore(0x02A0, a14) + mstore(0x02C0, a15) + mstore(0x02E0, a16) + mstore(0x0300, a17) + mstore(0x0320, a18) + mstore(0x0340, a19) + x := a20 + }*/ +} +// ==== +// stackOptimization: true +// ---- diff --git a/test/libyul/evmCodeTransform/stackReuse/function_retparam_block.yul b/test/libyul/evmCodeTransform/stackReuse/function_retparam_block.yul new file mode 100644 index 000000000..230884b78 --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_retparam_block.yul @@ -0,0 +1,18 @@ +{ + function f() -> x { pop(address()) { pop(callvalue()) } } +} +// ==== +// stackOptimization: true +// ---- +// PUSH1 0xD +// JUMP +// JUMPDEST +// PUSH1 0x0 +// ADDRESS +// POP +// CALLVALUE +// POP +// JUMPDEST +// SWAP1 +// JUMP +// JUMPDEST diff --git a/test/libyul/evmCodeTransform/stackReuse/function_retparam_declaration.yul b/test/libyul/evmCodeTransform/stackReuse/function_retparam_declaration.yul new file mode 100644 index 000000000..a5cd6440f --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_retparam_declaration.yul @@ -0,0 +1,18 @@ +{ + function f() -> x { pop(address()) let y := callvalue() } +} +// ==== +// stackOptimization: true +// ---- +// PUSH1 0xD +// JUMP +// JUMPDEST +// PUSH1 0x0 +// ADDRESS +// POP +// CALLVALUE +// POP +// JUMPDEST +// SWAP1 +// JUMP +// JUMPDEST diff --git a/test/libyul/evmCodeTransform/stackReuse/function_retparam_for.yul b/test/libyul/evmCodeTransform/stackReuse/function_retparam_for.yul new file mode 100644 index 000000000..dc03427ea --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_retparam_for.yul @@ -0,0 +1,27 @@ +{ + function f() -> x { pop(address()) for { pop(callvalue()) } 0 {} { } } +} +// ==== +// stackOptimization: true +// ---- +// PUSH1 0x19 +// JUMP +// JUMPDEST +// PUSH1 0x0 +// ADDRESS +// POP +// CALLVALUE +// POP +// JUMPDEST +// PUSH1 0x0 +// ISZERO +// PUSH1 0x15 +// JUMPI +// JUMPDEST +// PUSH1 0xA +// JUMP +// JUMPDEST +// JUMPDEST +// SWAP1 +// JUMP +// JUMPDEST diff --git a/test/libyul/evmCodeTransform/stackReuse/function_retparam_if.yul b/test/libyul/evmCodeTransform/stackReuse/function_retparam_if.yul new file mode 100644 index 000000000..dd435f320 --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_retparam_if.yul @@ -0,0 +1,23 @@ +{ + function f() -> x { pop(address()) if 1 { pop(callvalue()) } } +} +// ==== +// stackOptimization: true +// ---- +// PUSH1 0x14 +// JUMP +// JUMPDEST +// PUSH1 0x0 +// ADDRESS +// POP +// PUSH1 0x1 +// ISZERO +// PUSH1 0x10 +// JUMPI +// CALLVALUE +// POP +// JUMPDEST +// JUMPDEST +// SWAP1 +// JUMP +// JUMPDEST diff --git a/test/libyul/evmCodeTransform/stackReuse/function_retparam_leave.yul b/test/libyul/evmCodeTransform/stackReuse/function_retparam_leave.yul new file mode 100644 index 000000000..c044cd324 --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_retparam_leave.yul @@ -0,0 +1,20 @@ +{ + function f() -> x { pop(address()) leave pop(callvalue()) } +} +// ==== +// stackOptimization: true +// ---- +// PUSH1 0x10 +// JUMP +// JUMPDEST +// PUSH1 0x0 +// ADDRESS +// POP +// PUSH1 0xD +// JUMP +// CALLVALUE +// POP +// JUMPDEST +// SWAP1 +// JUMP +// JUMPDEST diff --git a/test/libyul/evmCodeTransform/stackReuse/function_retparam_read.yul b/test/libyul/evmCodeTransform/stackReuse/function_retparam_read.yul new file mode 100644 index 000000000..022adce27 --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_retparam_read.yul @@ -0,0 +1,21 @@ +{ + function f() -> x { pop(address()) sstore(0, x) pop(callvalue()) } +} +// ==== +// stackOptimization: true +// ---- +// PUSH1 0x11 +// JUMP +// JUMPDEST +// PUSH1 0x0 +// ADDRESS +// POP +// DUP1 +// PUSH1 0x0 +// SSTORE +// CALLVALUE +// POP +// JUMPDEST +// SWAP1 +// JUMP +// JUMPDEST diff --git a/test/libyul/evmCodeTransform/stackReuse/function_retparam_unassigned.yul b/test/libyul/evmCodeTransform/stackReuse/function_retparam_unassigned.yul new file mode 100644 index 000000000..41d0db7c1 --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_retparam_unassigned.yul @@ -0,0 +1,16 @@ +{ + function f() -> x { pop(callvalue()) } +} +// ==== +// stackOptimization: true +// ---- +// PUSH1 0xB +// JUMP +// JUMPDEST +// PUSH1 0x0 +// CALLVALUE +// POP +// JUMPDEST +// SWAP1 +// JUMP +// JUMPDEST diff --git a/test/libyul/evmCodeTransform/stackReuse/function_retparam_unassigned_multiple.yul b/test/libyul/evmCodeTransform/stackReuse/function_retparam_unassigned_multiple.yul new file mode 100644 index 000000000..54f304c0c --- /dev/null +++ b/test/libyul/evmCodeTransform/stackReuse/function_retparam_unassigned_multiple.yul @@ -0,0 +1,20 @@ +{ + function f() -> x, y, z { pop(callvalue()) } +} +// ==== +// stackOptimization: true +// ---- +// PUSH1 0x11 +// JUMP +// JUMPDEST +// PUSH1 0x0 +// PUSH1 0x0 +// PUSH1 0x0 +// CALLVALUE +// POP +// JUMPDEST +// SWAP1 +// SWAP2 +// SWAP3 +// JUMP +// JUMPDEST