Remove unnecessary masking of the result of known short instructions

This commit is contained in:
Alex Beregszaszi 2018-04-18 13:36:20 +01:00
parent 27d7990684
commit 38460d8b47
4 changed files with 110 additions and 0 deletions

View File

@ -1,6 +1,7 @@
### 0.4.24 (unreleased) ### 0.4.24 (unreleased)
Features: Features:
* Optimizer: Remove unnecessary masking of the result of known short instructions (``ADDRESS``, ``CALLER``, ``ORIGIN`` and ``COINBASE``).
Bugfixes: Bugfixes:

View File

@ -174,6 +174,26 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleList(
}); });
} }
for (auto const& op: std::vector<Instruction>{
Instruction::ADDRESS,
Instruction::CALLER,
Instruction::ORIGIN,
Instruction::COINBASE
})
{
u256 const mask = (u256(1) << 160) - 1;
rules.push_back({
{Instruction::AND, {{op, mask}}},
[=]() -> Pattern { return op; },
false
});
rules.push_back({
{Instruction::AND, {{mask, op}}},
[=]() -> Pattern { return op; },
false
});
}
// Double negation of opcodes with boolean result // Double negation of opcodes with boolean result
for (auto const& op: std::vector<Instruction>{ for (auto const& op: std::vector<Instruction>{
Instruction::EQ, Instruction::EQ,

View File

@ -1072,6 +1072,75 @@ BOOST_AUTO_TEST_CASE(cse_sub_zero)
}); });
} }
BOOST_AUTO_TEST_CASE(cse_remove_unwanted_masking_of_address)
{
vector<Instruction> ops{
Instruction::ADDRESS,
Instruction::CALLER,
Instruction::ORIGIN,
Instruction::COINBASE
};
for (auto const& op: ops)
{
checkCSE({
u256("0xffffffffffffffffffffffffffffffffffffffff"),
op,
Instruction::AND
}, {
op
});
checkCSE({
op,
u256("0xffffffffffffffffffffffffffffffffffffffff"),
Instruction::AND
}, {
op
});
// do not remove mask for other masking
checkCSE({
u256(1234),
op,
Instruction::AND
}, {
op,
u256(1234),
Instruction::AND
});
checkCSE({
op,
u256(1234),
Instruction::AND
}, {
u256(1234),
op,
Instruction::AND
});
}
// leave other opcodes untouched
checkCSE({
u256("0xffffffffffffffffffffffffffffffffffffffff"),
Instruction::CALLVALUE,
Instruction::AND
}, {
Instruction::CALLVALUE,
u256("0xffffffffffffffffffffffffffffffffffffffff"),
Instruction::AND
});
checkCSE({
Instruction::CALLVALUE,
u256("0xffffffffffffffffffffffffffffffffffffffff"),
Instruction::AND
}, {
u256("0xffffffffffffffffffffffffffffffffffffffff"),
Instruction::CALLVALUE,
Instruction::AND
});
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()

View File

@ -11881,6 +11881,26 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constants_constantinople)
BOOST_CHECK(callContractFunction("shr_3()") == encodeArgs(u256(1))); BOOST_CHECK(callContractFunction("shr_3()") == encodeArgs(u256(1)));
} }
BOOST_AUTO_TEST_CASE(senders_balance)
{
char const* sourceCode = R"(
contract C {
function f() public view returns (uint) {
return msg.sender.balance;
}
}
contract D {
C c = new C();
constructor() payable { }
function f() public view returns (uint) {
return c.f();
}
}
)";
compileAndRun(sourceCode, 27, "D");
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(27)));
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()
} }