mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
[yul] Ensures DataFlowAnalyzer works fine with break/continue statements just like without.
This commit is contained in:
@@ -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
|
||||
// }
|
||||
Reference in New Issue
Block a user