added optimization. shl comes out from being distributed over and

This commit is contained in:
nishant-sachdeva 2022-09-15 15:49:18 +05:30
parent c72645327e
commit efbd3666a7
36 changed files with 94 additions and 47 deletions

View File

@ -440,7 +440,8 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleListPart7(
Pattern B, Pattern B,
Pattern, Pattern,
Pattern X, Pattern X,
Pattern Y Pattern Y,
Pattern Z
) )
{ {
using Word = typename Pattern::Word; using Word = typename Pattern::Word;
@ -629,6 +630,12 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleListPart7(
feasibilityFunction feasibilityFunction
}); });
rules.push_back({
// AND(SHL(Z, X), SHL(Z, Y)) -> SHL(Z, AND(X, Y))
Builtins::AND(Builtins::SHL(Z, X), Builtins::SHL(Z, Y)),
[=]() -> Pattern { return Builtins::SHL(Z, Builtins::AND(X, Y)); }
});
rules.push_back({ rules.push_back({
Builtins::BYTE(A, Builtins::SHL(B, X)), Builtins::BYTE(A, Builtins::SHL(B, X)),
[=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); }, [=]() -> Pattern { return Builtins::BYTE(A.d() + B.d() / 8, X); },
@ -823,7 +830,7 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleList(
rules += simplificationRuleListPart4_5(A, B, C, W, X); rules += simplificationRuleListPart4_5(A, B, C, W, X);
rules += simplificationRuleListPart5(_evmVersion.has_value(), A, B, C, W, X); rules += simplificationRuleListPart5(_evmVersion.has_value(), A, B, C, W, X);
rules += simplificationRuleListPart6(A, B, C, W, X); rules += simplificationRuleListPart6(A, B, C, W, X);
rules += simplificationRuleListPart7(A, B, C, W, X); rules += simplificationRuleListPart7(A, B, C, W, X, Y);
rules += simplificationRuleListPart8(A, B, C, W, X); rules += simplificationRuleListPart8(A, B, C, W, X);
if (_evmVersion.has_value()) if (_evmVersion.has_value())

View File

@ -0,0 +1,25 @@
from opcodes import AND, SHL
from rule import Rule
from z3 import BitVec
"""
Rule:
AND(SHL(Z,X), SHL(Z,Y)) -> SHL(Z, AND(X,Y))
"""
rule = Rule()
n_bits = 128
# Input vars
X = BitVec('X', n_bits)
Y = BitVec('Y', n_bits)
Z = BitVec('Z', n_bits)
# Non optimized result
nonopt = AND(SHL(Z,X), SHL(Z,Y))
# Optimized result
opt = SHL(Z, AND(X,Y))
rule.check(nonopt, opt)

View File

@ -24,6 +24,6 @@ contract C {
// ---- // ----
// library: L // library: L
// f() -> 8, 7, 1, 2, 7, 12 // f() -> 8, 7, 1, 2, 7, 12
// gas irOptimized: 166525 // gas irOptimized: 166513
// gas legacy: 169347 // gas legacy: 169347
// gas legacyOptimized: 167269 // gas legacyOptimized: 167269

View File

@ -12,7 +12,7 @@ contract Test {
} }
// ---- // ----
// set(uint24[3][]): 0x20, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12 -> 0x06 // set(uint24[3][]): 0x20, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12 -> 0x06
// gas irOptimized: 186766 // gas irOptimized: 186550
// gas legacy: 211149 // gas legacy: 211149
// gas legacyOptimized: 206054 // gas legacyOptimized: 206054
// data(uint256,uint256): 0x02, 0x02 -> 0x09 // data(uint256,uint256): 0x02, 0x02 -> 0x09

View File

@ -17,6 +17,6 @@ contract c {
} }
// ---- // ----
// test() -> 0 // test() -> 0
// gas irOptimized: 157200 // gas irOptimized: 157188
// gas legacy: 188576 // gas legacy: 188576
// gas legacyOptimized: 183333 // gas legacyOptimized: 183333

View File

@ -46,6 +46,6 @@ contract C {
} }
// ---- // ----
// f() -> true // f() -> true
// gas irOptimized: 146936 // gas irOptimized: 146756
// gas legacy: 155961 // gas legacy: 155961
// gas legacyOptimized: 153588 // gas legacyOptimized: 153588

View File

@ -17,6 +17,6 @@ contract c {
} }
// ---- // ----
// test() -> 5, 4 // test() -> 5, 4
// gas irOptimized: 225027 // gas irOptimized: 224973
// gas legacy: 233801 // gas legacy: 233801
// gas legacyOptimized: 232816 // gas legacyOptimized: 232816

View File

@ -23,6 +23,6 @@ contract c {
// compileToEwasm: also // compileToEwasm: also
// ---- // ----
// test() -> 3, 4 // test() -> 3, 4
// gas irOptimized: 189690 // gas irOptimized: 189516
// gas legacy: 215253 // gas legacy: 215253
// gas legacyOptimized: 212341 // gas legacyOptimized: 212341

View File

@ -18,6 +18,6 @@ contract c {
// ---- // ----
// test() -> 5, 4 // test() -> 5, 4
// gas irOptimized: 272950 // gas irOptimized: 272893
// gas legacy: 270834 // gas legacy: 270834
// gas legacyOptimized: 269960 // gas legacyOptimized: 269960

View File

@ -15,6 +15,6 @@ contract C {
} }
// ---- // ----
// f() -> 0x20, 2, 0x40, 0xa0, 2, 0, 1, 2, 2, 3 // f() -> 0x20, 2, 0x40, 0xa0, 2, 0, 1, 2, 2, 3
// gas irOptimized: 161777 // gas irOptimized: 161735
// gas legacy: 162278 // gas legacy: 162278
// gas legacyOptimized: 159955 // gas legacyOptimized: 159955

View File

@ -19,6 +19,6 @@ contract c {
// compileToEwasm: also // compileToEwasm: also
// ---- // ----
// test() -> 0xffffffff, 0x0000000000000000000000000a00090008000700060005000400030002000100, 0x0000000000000000000000000000000000000000000000000000000000000000 // test() -> 0xffffffff, 0x0000000000000000000000000a00090008000700060005000400030002000100, 0x0000000000000000000000000000000000000000000000000000000000000000
// gas irOptimized: 124910 // gas irOptimized: 124640
// gas legacy: 187414 // gas legacy: 187414
// gas legacyOptimized: 165659 // gas legacyOptimized: 165659

View File

@ -21,6 +21,6 @@ contract c {
// compileToEwasm: also // compileToEwasm: also
// ---- // ----
// test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x0 // test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x0
// gas irOptimized: 293621 // gas irOptimized: 293486
// gas legacy: 303626 // gas legacy: 303626
// gas legacyOptimized: 301945 // gas legacyOptimized: 301945

View File

@ -21,6 +21,6 @@ contract c {
// compileToEwasm: also // compileToEwasm: also
// ---- // ----
// test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x00 // test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x00
// gas irOptimized: 273177 // gas irOptimized: 273093
// gas legacy: 276360 // gas legacy: 276360
// gas legacyOptimized: 275411 // gas legacyOptimized: 275411

View File

@ -26,4 +26,4 @@ contract C {
// compileViaYul: true // compileViaYul: true
// ---- // ----
// f() -> 3, 3, 3, 1 // f() -> 3, 3, 3, 1
// gas irOptimized: 182237 // gas irOptimized: 181997

View File

@ -16,7 +16,7 @@ contract C {
} }
// ---- // ----
// constructor() // constructor()
// gas irOptimized: 237351 // gas irOptimized: 236265
// gas legacy: 221315 // gas legacy: 221315
// gas legacyOptimized: 185247 // gas legacyOptimized: 185247
// f() -> 0 // f() -> 0

View File

@ -13,6 +13,6 @@ contract C {
} }
// ---- // ----
// f() -> 2, 3, 4 // f() -> 2, 3, 4
// gas irOptimized: 110135 // gas irOptimized: 109838
// gas legacy: 126350 // gas legacy: 126350
// gas legacyOptimized: 120704 // gas legacyOptimized: 120704

View File

@ -16,6 +16,6 @@ contract c {
} }
// ---- // ----
// test1() -> true // test1() -> true
// gas irOptimized: 207928 // gas irOptimized: 206428
// gas legacy: 254905 // gas legacy: 254905
// gas legacyOptimized: 247415 // gas legacyOptimized: 247415

View File

@ -14,7 +14,7 @@ contract c {
// ---- // ----
// storageEmpty -> 1 // storageEmpty -> 1
// fill() -> // fill() ->
// gas irOptimized: 519487 // gas irOptimized: 519361
// gas legacy: 521584 // gas legacy: 521584
// gas legacyOptimized: 517027 // gas legacyOptimized: 517027
// storageEmpty -> 0 // storageEmpty -> 0

View File

@ -16,7 +16,7 @@ contract c {
// ---- // ----
// storageEmpty -> 1 // storageEmpty -> 1
// fill() -> 8 // fill() -> 8
// gas irOptimized: 123024 // gas irOptimized: 123012
// gas legacy: 121756 // gas legacy: 121756
// gas legacyOptimized: 120687 // gas legacyOptimized: 120687
// storageEmpty -> 0 // storageEmpty -> 0

View File

@ -18,7 +18,7 @@ contract c {
} }
// ---- // ----
// test() -> 38, 28, 18 // test() -> 38, 28, 18
// gas irOptimized: 186370 // gas irOptimized: 185650
// gas legacy: 189492 // gas legacy: 189492
// gas legacyOptimized: 178318 // gas legacyOptimized: 178318
// storageEmpty -> 1 // storageEmpty -> 1

View File

@ -18,7 +18,7 @@ contract c {
} }
// ---- // ----
// test() -> 20, 10 // test() -> 20, 10
// gas irOptimized: 158020 // gas irOptimized: 157570
// gas legacy: 159279 // gas legacy: 159279
// gas legacyOptimized: 152937 // gas legacyOptimized: 152937
// storageEmpty -> 1 // storageEmpty -> 1

View File

@ -10,6 +10,6 @@ contract c {
// ---- // ----
// test() -> 0x20, 29, 0x0303030303030303030303030303030303030303030303030303030303000000 // test() -> 0x20, 29, 0x0303030303030303030303030303030303030303030303030303030303000000
// gas irOptimized: 109310 // gas irOptimized: 109301
// gas legacy: 126702 // gas legacy: 126702
// gas legacyOptimized: 123422 // gas legacyOptimized: 123422

View File

@ -16,7 +16,7 @@ contract c {
} }
// ---- // ----
// test() -> true // test() -> true
// gas irOptimized: 176111 // gas irOptimized: 175619
// gas legacy: 224093 // gas legacy: 224093
// gas legacyOptimized: 205152 // gas legacyOptimized: 205152
// storageEmpty -> 1 // storageEmpty -> 1

View File

@ -15,7 +15,7 @@ contract c {
} }
// ---- // ----
// test() -> // test() ->
// gas irOptimized: 142636 // gas irOptimized: 142528
// gas legacy: 164430 // gas legacy: 164430
// gas legacyOptimized: 158513 // gas legacyOptimized: 158513
// storageEmpty -> 1 // storageEmpty -> 1

View File

@ -10,6 +10,6 @@ contract c {
// ---- // ----
// test() -> 0x20, 33, 0x303030303030303030303030303030303030303030303030303030303030303, 0x0300000000000000000000000000000000000000000000000000000000000000 // test() -> 0x20, 33, 0x303030303030303030303030303030303030303030303030303030303030303, 0x0300000000000000000000000000000000000000000000000000000000000000
// gas irOptimized: 108115 // gas irOptimized: 108097
// gas legacy: 125584 // gas legacy: 125584
// gas legacyOptimized: 122560 // gas legacyOptimized: 122560

View File

@ -16,6 +16,6 @@ contract c {
} }
// ---- // ----
// test() -> 5, 4, 3, 3 // test() -> 5, 4, 3, 3
// gas irOptimized: 111448 // gas irOptimized: 111406
// gas legacy: 111838 // gas legacy: 111838
// gas legacyOptimized: 111128 // gas legacyOptimized: 111128

View File

@ -15,6 +15,6 @@ contract c {
} }
// ---- // ----
// test() -> 0 // test() -> 0
// gas irOptimized: 174126 // gas irOptimized: 173456
// gas legacy: 216790 // gas legacy: 216790
// gas legacyOptimized: 204003 // gas legacyOptimized: 204003

View File

@ -27,14 +27,14 @@ contract C {
// ---- // ----
// l() -> 0 // l() -> 0
// f(uint256,uint256): 42, 64 -> // f(uint256,uint256): 42, 64 ->
// gas irOptimized: 112476 // gas irOptimized: 112470
// gas legacy: 108105 // gas legacy: 108105
// gas legacyOptimized: 101987 // gas legacyOptimized: 101987
// l() -> 1 // l() -> 1
// ll(uint256): 0 -> 43 // ll(uint256): 0 -> 43
// a(uint256,uint256): 0, 42 -> 64 // a(uint256,uint256): 0, 42 -> 64
// f(uint256,uint256): 84, 128 -> // f(uint256,uint256): 84, 128 ->
// gas irOptimized: 119064 // gas irOptimized: 119058
// gas legacy: 110325 // gas legacy: 110325
// gas legacyOptimized: 96331 // gas legacyOptimized: 96331
// l() -> 2 // l() -> 2

View File

@ -21,7 +21,7 @@ contract C {
// ---- // ----
// l() -> 0 // l() -> 0
// g(uint256): 70 -> // g(uint256): 70 ->
// gas irOptimized: 183584 // gas irOptimized: 182534
// gas legacy: 183811 // gas legacy: 183811
// gas legacyOptimized: 179218 // gas legacyOptimized: 179218
// l() -> 70 // l() -> 70

View File

@ -15,6 +15,6 @@ contract C {
// ---- // ----
// createEvent(uint256): 42 -> // createEvent(uint256): 42 ->
// ~ emit E(uint256[][]): 0x20, 0x02, 0x40, 0xa0, 0x02, 0x2a, 0x2b, 0x02, 0x2c, 0x2d // ~ emit E(uint256[][]): 0x20, 0x02, 0x40, 0xa0, 0x02, 0x2a, 0x2b, 0x02, 0x2c, 0x2d
// gas irOptimized: 185142 // gas irOptimized: 185118
// gas legacy: 187603 // gas legacy: 187603
// gas legacyOptimized: 184566 // gas legacyOptimized: 184566

View File

@ -17,6 +17,6 @@ contract C {
// ---- // ----
// deposit() -> // deposit() ->
// ~ emit E(string,uint256[4]): #0xa7fb06bb999a5eb9aff9e0779953f4e1e4ce58044936c2f51c7fb879b85c08bd, #0xe755d8cc1a8cde16a2a31160dcd8017ac32d7e2f13215b29a23cdae40a78aa81 // ~ emit E(string,uint256[4]): #0xa7fb06bb999a5eb9aff9e0779953f4e1e4ce58044936c2f51c7fb879b85c08bd, #0xe755d8cc1a8cde16a2a31160dcd8017ac32d7e2f13215b29a23cdae40a78aa81
// gas irOptimized: 333476 // gas irOptimized: 332396
// gas legacy: 388679 // gas legacy: 388679
// gas legacyOptimized: 374441 // gas legacyOptimized: 374441

View File

@ -27,4 +27,4 @@ contract C {
// compileViaYul: true // compileViaYul: true
// ---- // ----
// f() -> 0 // f() -> 0
// gas irOptimized: 111594 // gas irOptimized: 111570

View File

@ -34,6 +34,6 @@ contract C {
// ---- // ----
// f(bytes): 0x20, 0x5, "abcde" -> 0 // f(bytes): 0x20, 0x5, "abcde" -> 0
// gas irOptimized: 241890 // gas irOptimized: 241872
// gas legacy: 243341 // gas legacy: 243341
// gas legacyOptimized: 242454 // gas legacyOptimized: 242454

View File

@ -16,38 +16,38 @@ contract C {
// ---- // ----
// test_indices(uint256): 1 -> // test_indices(uint256): 1 ->
// test_indices(uint256): 129 -> // test_indices(uint256): 129 ->
// gas irOptimized: 3021484 // gas irOptimized: 3020710
// gas legacy: 3071683 // gas legacy: 3071683
// gas legacyOptimized: 3014415 // gas legacyOptimized: 3014415
// test_indices(uint256): 5 -> // test_indices(uint256): 5 ->
// gas irOptimized: 722540 // gas irOptimized: 722510
// gas legacy: 719151 // gas legacy: 719151
// gas legacyOptimized: 716139 // gas legacyOptimized: 716139
// test_indices(uint256): 10 -> // test_indices(uint256): 10 ->
// gas irOptimized: 158407 // gas irOptimized: 158347
// gas legacy: 162657 // gas legacy: 162657
// gas legacyOptimized: 158422 // gas legacyOptimized: 158422
// test_indices(uint256): 15 -> // test_indices(uint256): 15 ->
// gas irOptimized: 173467 // gas irOptimized: 173377
// gas legacy: 179782 // gas legacy: 179782
// gas legacyOptimized: 173727 // gas legacyOptimized: 173727
// test_indices(uint256): 0xFF -> // test_indices(uint256): 0xFF ->
// gas irOptimized: 5681652 // gas irOptimized: 5680122
// gas legacy: 5780977 // gas legacy: 5780977
// gas legacyOptimized: 5668997 // gas legacyOptimized: 5668997
// test_indices(uint256): 1000 -> // test_indices(uint256): 1000 ->
// gas irOptimized: 18208919 // gas irOptimized: 18202919
// gas legacy: 18602799 // gas legacy: 18602799
// gas legacyOptimized: 18179744 // gas legacyOptimized: 18179744
// test_indices(uint256): 129 -> // test_indices(uint256): 129 ->
// gas irOptimized: 5198552 // gas irOptimized: 5197778
// gas legacy: 5212013 // gas legacy: 5212013
// gas legacyOptimized: 5157889 // gas legacyOptimized: 5157889
// test_indices(uint256): 128 -> // test_indices(uint256): 128 ->
// gas irOptimized: 417500 // gas irOptimized: 416732
// gas legacy: 470568 // gas legacy: 470568
// gas legacyOptimized: 423768 // gas legacyOptimized: 423768
// test_indices(uint256): 1 -> // test_indices(uint256): 1 ->
// gas irOptimized: 726968 // gas irOptimized: 726962
// gas legacy: 721789 // gas legacy: 721789
// gas legacyOptimized: 720209 // gas legacyOptimized: 720209

View File

@ -52,18 +52,18 @@ contract C {
// ---- // ----
// test_zeroed_indicies(uint256): 1 -> // test_zeroed_indicies(uint256): 1 ->
// test_zeroed_indicies(uint256): 5 -> // test_zeroed_indicies(uint256): 5 ->
// gas irOptimized: 165074 // gas irOptimized: 165044
// gas legacy: 166201 // gas legacy: 166201
// gas legacyOptimized: 163439 // gas legacyOptimized: 163439
// test_zeroed_indicies(uint256): 10 -> // test_zeroed_indicies(uint256): 10 ->
// gas irOptimized: 282677 // gas irOptimized: 282617
// gas legacy: 285088 // gas legacy: 285088
// gas legacyOptimized: 280012 // gas legacyOptimized: 280012
// test_zeroed_indicies(uint256): 15 -> // test_zeroed_indicies(uint256): 15 ->
// gas irOptimized: 405422 // gas irOptimized: 405332
// gas legacy: 409138 // gas legacy: 409138
// gas legacyOptimized: 401827 // gas legacyOptimized: 401827
// test_zeroed_indicies(uint256): 0xFF -> // test_zeroed_indicies(uint256): 0xFF ->
// gas irOptimized: 6404812 // gas irOptimized: 6403282
// gas legacy: 6466233 // gas legacy: 6466233
// gas legacyOptimized: 6333077 // gas legacyOptimized: 6333077

View File

@ -0,0 +1,15 @@
{
let x := calldataload(0)
let a := and(shl(x, 248), shl(x, 12))
sstore(10, a)
}
// ====
// EVMVersion: >byzantium
// ----
// step: expressionSimplifier
//
// {
// {
// sstore(10, shl(calldataload(0), 8))
// }
// }