mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Remove unnecessary masking of the result of known short instructions
This commit is contained in:
parent
27d7990684
commit
38460d8b47
@ -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:
|
||||||
|
@ -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,
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user