mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Extract StackReuseCodegen tests.
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
{ for { let z := 0 } 1 { } { let x := 3 } let t := 2 }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x0
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x1
|
||||
// ISZERO
|
||||
// PUSH1 0x11
|
||||
// JUMPI
|
||||
// PUSH1 0x3
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x3
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x2
|
||||
// POP
|
||||
@@ -0,0 +1,22 @@
|
||||
{ for { let z := 0 } 1 { } { z := 8 let x := 3 } let t := 2 }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// PUSH1 0x1
|
||||
// ISZERO
|
||||
// PUSH1 0x14
|
||||
// JUMPI
|
||||
// PUSH1 0x8
|
||||
// SWAP1
|
||||
// POP
|
||||
// PUSH1 0x3
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x2
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// PUSH1 0x2
|
||||
// POP
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
let b := f(1, 2)
|
||||
function f(a, r) -> t { }
|
||||
b := f(3, 4)
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x9
|
||||
// PUSH1 0x2
|
||||
// PUSH1 0x1
|
||||
// PUSH1 0xD
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x16
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP3
|
||||
// SWAP2
|
||||
// POP
|
||||
// POP
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x20
|
||||
// PUSH1 0x4
|
||||
// PUSH1 0x3
|
||||
// PUSH1 0xD
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
function f(a, b) { }
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x8
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// POP
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
@@ -0,0 +1,25 @@
|
||||
// This does not re-use the parameters for the return parameters
|
||||
// We do not expect parameters to be fully unused, so the stack
|
||||
// layout for a function is still fixed, even though parameters
|
||||
// can be re-used.
|
||||
{
|
||||
function f(a, b, c, d) -> x, y { }
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x11
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP5
|
||||
// POP
|
||||
// SWAP5
|
||||
// SWAP3
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
function f(a, b, c, d) -> x, y { b := 3 let s := 9 y := 2 mstore(s, y) }
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x1F
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x3
|
||||
// SWAP4
|
||||
// POP
|
||||
// PUSH1 0x9
|
||||
// PUSH1 0x2
|
||||
// SWAP2
|
||||
// POP
|
||||
// DUP2
|
||||
// DUP2
|
||||
// MSTORE
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// SWAP5
|
||||
// POP
|
||||
// SWAP5
|
||||
// SWAP3
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
function f() -> x, y { }
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0xC
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP1
|
||||
// SWAP2
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
function f() { }
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x6
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// JUMPDEST
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
let b := 3
|
||||
function f(a, r) -> t {
|
||||
// r could be removed right away, but a cannot - this is not implemented, though
|
||||
let x := a a := 3 t := a
|
||||
}
|
||||
b := 7
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x3
|
||||
// PUSH1 0x17
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// DUP2
|
||||
// POP
|
||||
// PUSH1 0x3
|
||||
// SWAP2
|
||||
// POP
|
||||
// DUP2
|
||||
// SWAP1
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// SWAP3
|
||||
// SWAP2
|
||||
// POP
|
||||
// POP
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x7
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,61 @@
|
||||
{
|
||||
function f(a, b) -> t { }
|
||||
function g() -> r, s { }
|
||||
let x := f(1, 2)
|
||||
x := f(3, 4)
|
||||
let y, z := g()
|
||||
y, z := g()
|
||||
let unused := 7
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x15
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP3
|
||||
// SWAP2
|
||||
// POP
|
||||
// POP
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP1
|
||||
// SWAP2
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x1F
|
||||
// PUSH1 0x2
|
||||
// PUSH1 0x1
|
||||
// PUSH1 0x3
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x29
|
||||
// PUSH1 0x4
|
||||
// PUSH1 0x3
|
||||
// PUSH1 0x3
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x32
|
||||
// PUSH1 0xC
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x38
|
||||
// PUSH1 0xC
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// SWAP2
|
||||
// POP
|
||||
// SWAP2
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x7
|
||||
// POP
|
||||
@@ -0,0 +1,17 @@
|
||||
// z is only removed after the if (after the jumpdest)
|
||||
{ let z := mload(0) if z { let x := z } let t := 3 }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x0
|
||||
// MLOAD
|
||||
// DUP1
|
||||
// ISZERO
|
||||
// PUSH1 0xA
|
||||
// JUMPI
|
||||
// DUP1
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// PUSH1 0x3
|
||||
// POP
|
||||
@@ -0,0 +1,10 @@
|
||||
{ let z := 0 { pop(z) } let x := 1 }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x0
|
||||
// DUP1
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x1
|
||||
// POP
|
||||
@@ -0,0 +1,23 @@
|
||||
{ let z := mload(0) { let x := 1 x := 6 z := x } { let x := 2 z := x x := 4 } }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x0
|
||||
// MLOAD
|
||||
// PUSH1 0x1
|
||||
// PUSH1 0x6
|
||||
// SWAP1
|
||||
// POP
|
||||
// DUP1
|
||||
// SWAP2
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x2
|
||||
// DUP1
|
||||
// SWAP2
|
||||
// POP
|
||||
// PUSH1 0x4
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,14 @@
|
||||
{ let x := 1 x := 6 let y := 2 y := 4 }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x1
|
||||
// PUSH1 0x6
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x2
|
||||
// PUSH1 0x4
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,14 @@
|
||||
{ let x := 1 x := 6 { let y := 2 y := 4 } }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x1
|
||||
// PUSH1 0x6
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x2
|
||||
// PUSH1 0x4
|
||||
// SWAP1
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
let x := 5
|
||||
{
|
||||
let y := x // y should not reuse the stack slot of x, since x is not in the same scope
|
||||
sstore(y, y)
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x5
|
||||
// DUP1
|
||||
// DUP1
|
||||
// DUP2
|
||||
// SSTORE
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
let x := 5
|
||||
let y := x // y should reuse the stack slot of x
|
||||
sstore(y, y)
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x5
|
||||
// DUP1
|
||||
// SWAP1
|
||||
// POP
|
||||
// DUP1
|
||||
// DUP2
|
||||
// SSTORE
|
||||
// POP
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
let x := 5
|
||||
let y := add(x, 2) // y should reuse the stack slot of x
|
||||
sstore(y, y)
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x5
|
||||
// PUSH1 0x2
|
||||
// DUP2
|
||||
// ADD
|
||||
// SWAP1
|
||||
// POP
|
||||
// DUP1
|
||||
// DUP2
|
||||
// SSTORE
|
||||
// POP
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
let x := 5
|
||||
let y := x // y should not reuse the stack slot of x, since x is still used below
|
||||
sstore(y, x)
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x5
|
||||
// DUP1
|
||||
// DUP2
|
||||
// DUP2
|
||||
// SSTORE
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,23 @@
|
||||
{ let a, b, c, d let x := 2 let y := 3 mstore(x, a) mstore(y, c) }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// POP
|
||||
// PUSH1 0x2
|
||||
// SWAP2
|
||||
// POP
|
||||
// PUSH1 0x3
|
||||
// DUP4
|
||||
// DUP4
|
||||
// MSTORE
|
||||
// DUP2
|
||||
// DUP2
|
||||
// MSTORE
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
function f() -> x, y, z, t {}
|
||||
let a, b, c, d := f() let x1 := 2 let y1 := 3 mstore(x1, a) mstore(y1, c)
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x12
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP1
|
||||
// SWAP2
|
||||
// SWAP3
|
||||
// SWAP4
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x18
|
||||
// PUSH1 0x3
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// PUSH1 0x2
|
||||
// SWAP2
|
||||
// POP
|
||||
// PUSH1 0x3
|
||||
// DUP4
|
||||
// DUP4
|
||||
// MSTORE
|
||||
// DUP2
|
||||
// DUP2
|
||||
// MSTORE
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
// Only x3 is actually used, the slots of
|
||||
// x1 and x2 will be reused right away.
|
||||
let x1 := 5 let x2 := 6 let x3 := 7
|
||||
mstore(x1, x2)
|
||||
function f() -> x, y, z, t {}
|
||||
let a, b, c, d := f() mstore(x3, a) mstore(c, d)
|
||||
}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x5
|
||||
// PUSH1 0x6
|
||||
// PUSH1 0x7
|
||||
// DUP2
|
||||
// DUP4
|
||||
// MSTORE
|
||||
// PUSH1 0x1B
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// PUSH1 0x0
|
||||
// JUMPDEST
|
||||
// SWAP1
|
||||
// SWAP2
|
||||
// SWAP3
|
||||
// SWAP4
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x21
|
||||
// PUSH1 0xC
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// SWAP6
|
||||
// POP
|
||||
// SWAP4
|
||||
// POP
|
||||
// POP
|
||||
// DUP1
|
||||
// DUP3
|
||||
// MSTORE
|
||||
// POP
|
||||
// POP
|
||||
// DUP2
|
||||
// DUP2
|
||||
// MSTORE
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,6 @@
|
||||
{ let x }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x0
|
||||
// POP
|
||||
@@ -0,0 +1,6 @@
|
||||
{ let x := 1 }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x1
|
||||
// POP
|
||||
@@ -0,0 +1,9 @@
|
||||
{ let x := 1 mstore(3, 4) }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x1
|
||||
// POP
|
||||
// PUSH1 0x4
|
||||
// PUSH1 0x3
|
||||
// MSTORE
|
||||
@@ -0,0 +1,12 @@
|
||||
{ let x := 1 mstore(3, 4) pop(mload(x)) }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x1
|
||||
// PUSH1 0x4
|
||||
// PUSH1 0x3
|
||||
// MSTORE
|
||||
// DUP1
|
||||
// MLOAD
|
||||
// POP
|
||||
// POP
|
||||
@@ -0,0 +1,4 @@
|
||||
{}
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
@@ -0,0 +1,26 @@
|
||||
{ let z := 0 switch z case 0 { let x := 2 let y := 3 } default { z := 3 } let t := 9 }
|
||||
// ====
|
||||
// stackOptimization: true
|
||||
// ----
|
||||
// PUSH1 0x0
|
||||
// DUP1
|
||||
// PUSH1 0x0
|
||||
// DUP2
|
||||
// EQ
|
||||
// PUSH1 0x11
|
||||
// JUMPI
|
||||
// PUSH1 0x3
|
||||
// SWAP2
|
||||
// POP
|
||||
// PUSH1 0x18
|
||||
// JUMP
|
||||
// JUMPDEST
|
||||
// PUSH1 0x2
|
||||
// POP
|
||||
// PUSH1 0x3
|
||||
// POP
|
||||
// JUMPDEST
|
||||
// POP
|
||||
// POP
|
||||
// PUSH1 0x9
|
||||
// POP
|
||||
Reference in New Issue
Block a user