{ let a let b let i := 0 for { } 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) } // ==== // step: rematerialiser // ---- // { // let a // let b // let i := 0 // for { } lt(i, 10) { i := add(a, caller()) } // { // a := origin() // b := origin() // b := caller() // if callvalue() { continue } // a := caller() // } // mstore(a, b) // }