Replace byte(A, X) by zero if A >= 32

This commit is contained in:
chriseth 2019-08-28 17:34:31 +02:00
parent e74b63b6de
commit e86b5cf14e
3 changed files with 25 additions and 0 deletions

View File

@ -5,6 +5,7 @@ Language Features:
Compiler Features:
* Optimizer: Add rule that replaces the BYTE opcode by 0 if the first argument is larger than 31.
Bugfixes:

View File

@ -259,6 +259,14 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleListPart5(
[=]() { return A.d() >= 256; }
});
// Replace BYTE(A, X), A >= 32 with 0
rules.push_back({
{Instruction::BYTE, {A, X}},
[=]() -> Pattern { return u256(0); },
true,
[=]() { return A.d() >= 32; }
});
for (auto const& op: std::vector<Instruction>{
Instruction::ADDRESS,
Instruction::CALLER,

View File

@ -0,0 +1,16 @@
{
let a := calldataload(0)
let b := byte(33, a)
let c := byte(20, a)
// create cannot be removed.
let d := byte(33, create(0, 0, 0x20))
}
// ====
// step: expressionSimplifier
// ----
// {
// let a := calldataload(0)
// let b := 0
// let c := byte(20, a)
// let d := byte(33, create(0, 0, 0x20))
// }