Hash number literals according to their value instead of their string representation.

This commit is contained in:
chriseth 2022-11-08 11:14:01 +01:00
parent 19fc395662
commit cffacac9de
8 changed files with 32 additions and 11 deletions

View File

@ -13,6 +13,7 @@ Compiler Features:
Bugfixes:
* Yul Optimizer: Hash hex and decimal literals according to their value instead of their representation, improving the detection of equivalent functions.
* Solidity Upgrade Tool ``solidity-upgrade``: Fix the tool returning success code on uncaught exceptions.

View File

@ -54,7 +54,10 @@ std::map<Block const*, uint64_t> BlockHasher::run(Block const& _block)
void BlockHasher::operator()(Literal const& _literal)
{
hash64(compileTimeLiteralHash("Literal"));
hash64(_literal.value.hash());
if (_literal.kind == LiteralKind::Number)
hash64(std::hash<u256>{}(valueOfNumberLiteral(_literal)));
else
hash64(_literal.value.hash());
hash64(_literal.type.hash());
hash8(static_cast<uint8_t>(_literal.kind));
}

View File

@ -33,8 +33,8 @@ contract C {
// compileViaYul: true
// ----
// test1((uint8[],uint8[2])[][][]): 0x20, 1, 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29
// gas irOptimized: 332334
// gas irOptimized: 332586
// test2((uint8[],uint8[2])[][1][]): 0x20, 2, 0x40, 0x0160, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13, 0x20, 1, 0x20, 0x60, 31, 37, 2, 23, 29 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13
// gas irOptimized: 145029
// gas irOptimized: 145182
// test3((uint8[],uint8[2])[1][][2]): 0x20, 0x40, 0x60, 0, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 288, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13
// gas irOptimized: 192344
// gas irOptimized: 192512

View File

@ -31,8 +31,8 @@ contract C {
// compileViaYul: true
// ----
// test1((uint8[],uint8[2])[][]): 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29
// gas irOptimized: 308790
// gas irOptimized: 309123
// test2((uint8[],uint8[2])[][1]): 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13
// gas irOptimized: 118077
// gas irOptimized: 118188
// test3((uint8[],uint8[2])[1][]): 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13
// gas irOptimized: 190775
// gas irOptimized: 190997

View File

@ -28,7 +28,7 @@ contract C {
// compileViaYul: also
// ----
// constructor() ->
// gas irOptimized: 518935
// gas irOptimized: 464753
// gas legacy: 729908
// gas legacyOptimized: 493347
// h() -> 0x20, 0x40, 0x00, 0

View File

@ -299,6 +299,6 @@ contract Test {
// gas legacyOptimized: 267239
// verifyTx() -> true
// ~ emit Verified(string): 0x20, 0x16, "Successfully verified."
// gas irOptimized: 783949
// gas irOptimized: 784027
// gas legacy: 805423
// gas legacyOptimized: 772571

View File

@ -49,11 +49,11 @@ contract C {
}
// ----
// test_f() -> true
// gas irOptimized: 122053
// gas irOptimized: 122510
// gas legacy: 126150
// gas legacyOptimized: 123163
// test_g() -> true
// gas irOptimized: 106138
// gas irOptimized: 106903
// gas legacy: 112481
// gas legacyOptimized: 107706
// addresses(uint256): 0 -> 0x18

View File

@ -0,0 +1,17 @@
{
f()
g()
function f() { mstore(0x01, mload(0x00)) }
function g() { mstore(1, mload(0)) }
}
// ----
// step: equivalentFunctionCombiner
//
// {
// f()
// f()
// function f()
// { mstore(0x01, mload(0x00)) }
// function g()
// { mstore(1, mload(0)) }
// }