Extract StackReuseCodegen tests.

This commit is contained in:
Daniel Kirchner
2021-03-09 15:47:24 +01:00
parent 1d95f95635
commit e99da7e015
36 changed files with 703 additions and 420 deletions
@@ -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