diff --git a/test/libyul/yulOptimizerTests/commonSubexpressionEliminator/for_reassign.sol b/test/libyul/yulOptimizerTests/commonSubexpressionEliminator/for_reassign.sol new file mode 100644 index 000000000..fbfd2c0f9 --- /dev/null +++ b/test/libyul/yulOptimizerTests/commonSubexpressionEliminator/for_reassign.sol @@ -0,0 +1,42 @@ +{ + let x := 0 + let y := 2 + for {} sload(0) { let t := add(y, 0) } { + x := 0 + if calldataload(0) { x := 2 revert(0, 0) } + if calldataload(0) { x := 2 break } + if calldataload(0) { x := 2 continue } + // zero here can be replaced + let r := sload(0) + } + // not anymore because of break/continue + let u := 0 +} +// ---- +// step: commonSubexpressionEliminator +// +// { +// let x := 0 +// let y := 2 +// for { } sload(0) { let t := add(y, x) } +// { +// x := 0 +// if calldataload(x) +// { +// x := y +// revert(0, 0) +// } +// if calldataload(x) +// { +// x := y +// break +// } +// if calldataload(x) +// { +// x := y +// continue +// } +// let r := sload(x) +// } +// let u := 0 +// } diff --git a/test/libyul/yulOptimizerTests/loadResolver/for_break_sstore.sol b/test/libyul/yulOptimizerTests/loadResolver/for_break_sstore.sol new file mode 100644 index 000000000..875e0f5de --- /dev/null +++ b/test/libyul/yulOptimizerTests/loadResolver/for_break_sstore.sol @@ -0,0 +1,51 @@ +{ + sstore(0, 123213) + let x := 0 + for {} sload(0) { mstore(0x50, sload(0)) } { + if calldataload(0) { revert(0, 0) } + let t := sload(0) + if calldataload(0) { sstore(0, 2) break } + let u := sload(0) + if calldataload(0) { mstore(0, 3) continue } + let v := sload(0) + mstore(0, t) + mstore(0x20, u) + mstore(0x40, v) + } + let z := sload(0) + sstore(6, z) + sstore(7, keccak256(0, 0x100)) +} +// ---- +// step: loadResolver +// +// { +// { +// let _1 := 123213 +// let _2 := 0 +// sstore(_2, _1) +// for { } sload(_2) { mstore(0x50, sload(_2)) } +// { +// let _7 := calldataload(_2) +// if _7 { revert(_2, _2) } +// let t := sload(_2) +// if _7 +// { +// sstore(_2, 2) +// break +// } +// let u := t +// if _7 +// { +// mstore(_2, 3) +// continue +// } +// let v := t +// mstore(_2, t) +// mstore(0x20, u) +// mstore(0x40, v) +// } +// sstore(6, sload(_2)) +// sstore(7, keccak256(_2, 0x100)) +// } +// } diff --git a/test/libyul/yulOptimizerTests/loadResolver/for_continue_sstore.sol b/test/libyul/yulOptimizerTests/loadResolver/for_continue_sstore.sol new file mode 100644 index 000000000..c8a56944c --- /dev/null +++ b/test/libyul/yulOptimizerTests/loadResolver/for_continue_sstore.sol @@ -0,0 +1,41 @@ +{ + sstore(0, 123213) + let x := 0 + for {} sload(0) { mstore(0x50, sload(0)) } { + if calldataload(0) { revert(0, 0) } + let t := sload(0) + if calldataload(0) { sstore(0, 3) continue } + let v := sload(0) + mstore(0, t) + mstore(0x40, v) + } + let z := sload(0) + sstore(6, z) + sstore(7, keccak256(0, 0x100)) +} +// ---- +// step: loadResolver +// +// { +// { +// let _1 := 123213 +// let _2 := 0 +// sstore(_2, _1) +// for { } sload(_2) { mstore(0x50, sload(_2)) } +// { +// let _7 := calldataload(_2) +// if _7 { revert(_2, _2) } +// let t := sload(_2) +// if _7 +// { +// sstore(_2, 3) +// continue +// } +// let v := t +// mstore(_2, t) +// mstore(0x40, v) +// } +// sstore(6, sload(_2)) +// sstore(7, keccak256(_2, 0x100)) +// } +// } diff --git a/test/libyul/yulOptimizerTests/loadResolver/for_reverting.sol b/test/libyul/yulOptimizerTests/loadResolver/for_reverting.sol new file mode 100644 index 000000000..fe830076c --- /dev/null +++ b/test/libyul/yulOptimizerTests/loadResolver/for_reverting.sol @@ -0,0 +1,55 @@ +{ + sstore(0, 123213) + let x := 0 + for {} sload(0) { mstore(0x50, sload(0)) } { + if calldataload(0) { mstore(0, 1) revert(0, 0) } + let t := sload(0) + if calldataload(0) { mstore(0, 2) break } + let u := sload(0) + if calldataload(0) { mstore(0, 3) continue } + let v := sload(0) + mstore(0, t) + mstore(0x20, u) + mstore(0x40, v) + } + let z := sload(0) + sstore(6, z) + sstore(7, keccak256(0, 0x100)) +} +// ---- +// step: loadResolver +// +// { +// { +// let _1 := 123213 +// let _2 := 0 +// sstore(_2, _1) +// for { } _1 { mstore(0x50, _1) } +// { +// let _7 := calldataload(_2) +// if _7 +// { +// mstore(_2, 1) +// revert(_2, _2) +// } +// let t := _1 +// if _7 +// { +// mstore(_2, 2) +// break +// } +// let u := _1 +// if _7 +// { +// mstore(_2, 3) +// continue +// } +// let v := _1 +// mstore(_2, t) +// mstore(0x20, u) +// mstore(0x40, v) +// } +// sstore(6, _1) +// sstore(7, keccak256(_2, 0x100)) +// } +// } diff --git a/test/libyul/yulOptimizerTests/loadResolver/for_reverting_sstore.sol b/test/libyul/yulOptimizerTests/loadResolver/for_reverting_sstore.sol new file mode 100644 index 000000000..c40ebae82 --- /dev/null +++ b/test/libyul/yulOptimizerTests/loadResolver/for_reverting_sstore.sol @@ -0,0 +1,55 @@ +{ + sstore(0, 123213) + let x := 0 + for {} sload(0) { mstore(0x50, sload(0)) } { + if calldataload(0) { sstore(0, 1) revert(0, 0) } + let t := sload(0) + if calldataload(0) { mstore(0, 2) break } + let u := sload(0) + if calldataload(0) { mstore(0, 3) continue } + let v := sload(0) + mstore(0, t) + mstore(0x20, u) + mstore(0x40, v) + } + let z := sload(0) + sstore(6, z) + sstore(7, keccak256(0, 0x100)) +} +// ---- +// step: loadResolver +// +// { +// { +// let _1 := 123213 +// let _2 := 0 +// sstore(_2, _1) +// for { } sload(_2) { mstore(0x50, sload(_2)) } +// { +// let _7 := calldataload(_2) +// if _7 +// { +// sstore(_2, 1) +// revert(_2, _2) +// } +// let t := sload(_2) +// if _7 +// { +// mstore(_2, 2) +// break +// } +// let u := t +// if _7 +// { +// mstore(_2, 3) +// continue +// } +// let v := t +// mstore(_2, t) +// mstore(0x20, u) +// mstore(0x40, v) +// } +// sstore(6, sload(_2)) +// sstore(7, keccak256(_2, 0x100)) +// } +// }