From d145919b5d025d953a800e3f3ca3be97b2c68516 Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 17 Mar 2022 17:27:34 +0100 Subject: [PATCH] new tests --- .../for_reassign_only_break.sol | 43 +++++++++++++++++++ .../loadResolver/clash_in_branches.yul | 38 ++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 test/libyul/yulOptimizerTests/commonSubexpressionEliminator/for_reassign_only_break.sol create mode 100644 test/libyul/yulOptimizerTests/loadResolver/clash_in_branches.yul diff --git a/test/libyul/yulOptimizerTests/commonSubexpressionEliminator/for_reassign_only_break.sol b/test/libyul/yulOptimizerTests/commonSubexpressionEliminator/for_reassign_only_break.sol new file mode 100644 index 000000000..abcc68b6b --- /dev/null +++ b/test/libyul/yulOptimizerTests/commonSubexpressionEliminator/for_reassign_only_break.sol @@ -0,0 +1,43 @@ +{ + let x := 0 + for {} sload(0) { let t := 0 /* can replace this */ } { + x := 0 + if calldataload(0) { x := 2 break } + let r := 0 + if calldataload(1) { x := 3 revert(0, 0) } + let s := 0 + if calldataload(0) { continue } + let v := 0 + x := 4 + revert(0, 0) + } + // cannot replace this + let u := 0 +} +// ---- +// step: commonSubexpressionEliminator +// +// { +// let x := 0 +// for { } sload(0) { let t := x } +// { +// x := 0 +// if calldataload(x) +// { +// x := 2 +// break +// } +// let r := x +// if calldataload(1) +// { +// x := 3 +// revert(0, 0) +// } +// let s := x +// if calldataload(x) { continue } +// let v := x +// x := 4 +// revert(0, 0) +// } +// let u := 0 +// } diff --git a/test/libyul/yulOptimizerTests/loadResolver/clash_in_branches.yul b/test/libyul/yulOptimizerTests/loadResolver/clash_in_branches.yul new file mode 100644 index 000000000..cc47436da --- /dev/null +++ b/test/libyul/yulOptimizerTests/loadResolver/clash_in_branches.yul @@ -0,0 +1,38 @@ +{ + let x := calldataload(0) + let y := calldataload(1) + sstore(x, y) + switch calldataload(2) + case 0 { + x := 2 + sstore(x, y) + } + default { + x := 3 + sstore(x, y) + } + let t := sload(x) + sstore(0, t) +} +// ---- +// step: loadResolver +// +// { +// { +// let _1 := 0 +// let x := calldataload(_1) +// let y := calldataload(1) +// sstore(x, y) +// let _3 := 2 +// switch calldataload(_3) +// case 0 { +// x := _3 +// sstore(_3, y) +// } +// default { +// x := 3 +// sstore(x, y) +// } +// sstore(_1, sload(x)) +// } +// }