{ let a let b let c let i := 0 for { } lt(i, 10) { i := add(add(a, b), c) } // `b` is always known to be caller() but `a` and `c` may be origin() or caller(). { a := origin() b := origin() c := origin() b := caller() if callvalue() { continue } a := caller() if callvalue() { continue } c := caller() } mstore(a, b) } // ==== // step: rematerialiser // ---- // { // let a // let b // let c // let i := 0 // for { // } // lt(i, 10) // { // i := add(add(a, caller()), c) // } // { // a := origin() // b := origin() // c := origin() // b := caller() // if callvalue() // { // continue // } // a := caller() // if callvalue() // { // continue // } // c := caller() // } // mstore(a, b) // }