[yul] Ensures DataFlowAnalyzer works fine with break/continue statements just like without.

This commit is contained in:
Christian Parpart
2019-03-14 16:18:45 +01:00
committed by Christian Parpart
parent 94cd81de8c
commit 57bcb8ba83
7 changed files with 188 additions and 13 deletions
@@ -0,0 +1,38 @@
{
let a
let b
for {let i := 0} lt(i, 10) {i := add(a, b)} {
a := origin()
b := origin()
b := caller()
// a=origin, b=caller
if callvalue() { break }
// a=origin, b=caller
a := caller()
}
mstore(a, b)
}
// ----
// rematerialiser
// {
// let a
// let b
// for {
// let i := 0
// }
// lt(i, 10)
// {
// i := add(caller(), caller())
// }
// {
// a := origin()
// b := origin()
// b := caller()
// if callvalue()
// {
// break
// }
// a := caller()
// }
// mstore(a, b)
// }
@@ -0,0 +1,40 @@
{
let a
let b
for { let i := 0 }
lt(i, 10)
{ i := add(a, b) } // `b` is always known to be caller() but `a` may be origin() or caller().
{
a := origin()
b := origin()
b := caller()
if callvalue() { continue }
a := caller()
}
mstore(a, b)
}
// ----
// rematerialiser
// {
// let a
// let b
// for {
// let i := 0
// }
// lt(i, 10)
// {
// i := add(a, caller())
// }
// {
// a := origin()
// b := origin()
// b := caller()
// if callvalue()
// {
// continue
// }
// a := caller()
// }
// mstore(a, b)
// }
@@ -0,0 +1,54 @@
{
let a
let b
let c
for {
let i := 0
b := origin()
c := origin()
}
lt(i, 10)
{
i := add(a, b)
b := callvalue()
c := caller()
}
{
a := origin()
b := caller()
if callvalue() { continue }
a := caller()
}
let x := b // does not rematerialize as b may be either origin() or callvalue() (btw: not caller())
let y := c // does not rematerialize as c may be either origin() or caller()
}
// ----
// rematerialiser
// {
// let a
// let b
// let c
// for {
// let i := 0
// b := origin()
// c := origin()
// }
// lt(i, 10)
// {
// i := add(a, caller())
// b := callvalue()
// c := caller()
// }
// {
// a := origin()
// b := caller()
// if callvalue()
// {
// continue
// }
// a := caller()
// }
// let x := b
// let y := c
// }