-
Notifications
You must be signed in to change notification settings - Fork 44
keep cache and constraint store after recursion, revert state on exceptions #3929
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
keep cache and constraint store after recursion, revert state on exceptions #3929
Conversation
…e-during-recursive-evaluation
KEVM performance run (
|
Test | HOTFIX-persist-cache-during-recursive-evaluation time | master-3b01114ca time | (HOTFIX-persist-cache-during-recursive-evaluation/master-3b01114ca) time |
---|---|---|---|
mcd/end-pack-pass-rough-spec.k | 88.17 | 106.43 | 0.8284318331297567 |
erc20/hkg/transferFrom-success-1-spec.k | 37.06 | 44.55 | 0.8318742985409653 |
mcd/flapper-yank-pass-rough-spec.k | 110.49 | 132.65 | 0.8329438371654729 |
erc20/hkg/transferFrom-success-2-spec.k | 36.36 | 42.94 | 0.8467629250116442 |
mcd/flopper-kick-pass-rough-spec.k | 81.22 | 95.76 | 0.8481620718462823 |
erc20/ds/transfer-success-1-spec.k | 39.87 | 46.73 | 0.8531992296169484 |
erc20/hkg/approve-spec.k | 31.44 | 36.48 | 0.861842105263158 |
erc20/ds/transferFrom-success-1-spec.k | 46.88 | 54.22 | 0.864625599409812 |
erc20/ds/transfer-success-2-spec.k | 39.31 | 45.29 | 0.867962022521528 |
mcd/flopper-file-pass-rough-spec.k | 237.34 | 272.94 | 0.8695684033120833 |
mcd/flipper-bids-pass-rough-spec.k | 47.03 | 54.03 | 0.8704423468443457 |
mcd/flopper-dent-guy-same-pass-rough-spec.k | 377.16 | 433.1 | 0.8708381436157931 |
erc20/ds/transferFrom-success-2-spec.k | 45.14 | 51.34 | 0.8792364627970393 |
mcd/flopper-dent-guy-diff-tic-not-0-pass-rough-spec.k | 520.02 | 589.44 | 0.8822271986970683 |
kontrol/test-expectreverttest-testfail_expectrevert_false-0-spec.k | 43.67 | 48.85 | 0.8939611054247697 |
mcd/pot-join-pass-rough-spec.k | 116.47 | 130.15 | 0.894890510948905 |
mcd/flopper-tick-pass-rough-spec.k | 113.98 | 126.76 | 0.8991795519091196 |
kontrol/test-safetest-testwithdrawfuzz-uint96-0-spec.k | 32.93 | 36.54 | 0.9012041598248495 |
mcd/dsvalue-peek-pass-rough-spec.k | 38.11 | 42.02 | 0.9069490718705377 |
mcd/cat-file-addr-pass-rough-spec.k | 37.36 | 41.07 | 0.9096664231799366 |
erc20/ds/approve-success-spec.k | 38.21 | 41.94 | 0.9110634239389604 |
mcd/flipper-ttl-pass-spec.k | 35.52 | 38.98 | 0.9112365315546436 |
mcd/cat-exhaustiveness-spec.k | 70.36 | 77.14 | 0.9121078558465128 |
kontrol/test-expectreverttest-testfail_expectrevert_failandsuccess-0-spec.k | 33.47 | 36.67 | 0.9127352058903735 |
kontrol/test-storetest-testaccesses-0-spec.k | 32.96 | 36.07 | 0.9137787635153868 |
mcd/dsvalue-read-pass-spec.k | 38.93 | 42.57 | 0.9144937749588912 |
mcd/flopper-cage-pass-spec.k | 36.68 | 40.1 | 0.914713216957606 |
kontrol/test-owneruponlytest-testincrementasowner-0-spec.k | 46.7 | 51.0 | 0.915686274509804 |
erc20/ds/transferFrom-failure-1-b-spec.k | 68.86 | 75.12 | 0.9166666666666666 |
kontrol/test-allowchangestest-testallow-0-spec.k | 32.9 | 35.88 | 0.9169453734671125 |
kontrol/test-storetest-teststoreload-0-spec.k | 33.19 | 36.18 | 0.9173576561636263 |
kontrol/test-expectcalltest-testexpectregularcall-0-spec.k | 32.96 | 35.92 | 0.9175946547884187 |
kontrol/test-countertest-testincrement-0-spec.k | 57.87 | 62.93 | 0.9195931987923088 |
mcd/vat-move-diff-rough-spec.k | 59.36 | 64.55 | 0.9195972114639814 |
kontrol/test-emitcontracttest-testexpectemitdonotcheckdata-0-spec.k | 32.83 | 35.68 | 0.9201233183856502 |
kontrol/test-emitcontracttest-testexpectemit-0-spec.k | 33.13 | 35.99 | 0.9205334815226452 |
mcd/flipper-tau-pass-spec.k | 35.9 | 38.94 | 0.9219311761684643 |
kontrol/test-allowchangestest-testfailallowcallstoaddress-0-spec.k | 32.86 | 35.63 | 0.9222565253999437 |
mcd/dstoken-approve-fail-rough-spec.k | 54.73 | 59.28 | 0.9232456140350876 |
benchmarks/ecrecoverloop00-sig1-invalid-spec.k | 58.67 | 63.48 | 0.9242281033396346 |
kontrol/test-expectreverttest-testfail_expectrevert_bytes4-0-spec.k | 33.67 | 36.43 | 0.924238265166072 |
kontrol/test-arithmetictest-test_wdiv_rounding-uint256-uint256-0-spec.k | 37.42 | 40.48 | 0.9244071146245061 |
mcd/end-subuu-pass-spec.k | 38.31 | 41.41 | 0.9251388553489497 |
benchmarks/ecrecoverloop00-sig0-invalid-spec.k | 36.92 | 39.85 | 0.926474278544542 |
kontrol/test-allowchangestest-testallow_fail-0-spec.k | 32.98 | 35.59 | 0.9266647934813148 |
mcd/dai-adduu-fail-rough-spec.k | 34.38 | 37.1 | 0.9266846361185984 |
erc20/hkg/transfer-success-1-spec.k | 33.9 | 36.58 | 0.9267359212684527 |
kontrol/test-allowchangestest-testfailallowchangestostorage-0-spec.k | 45.21 | 48.75 | 0.9273846153846154 |
kontrol/test-arithmetictest-test_max1_broken-uint256-uint256-0-spec.k | 31.72 | 34.2 | 0.9274853801169589 |
kontrol/test-expectreverttest-test_expectrevert_message-0-spec.k | 33.42 | 36.03 | 0.9275603663613655 |
mcd/flipper-addu48u48-fail-rough-spec.k | 36.06 | 38.83 | 0.9286634045840846 |
mcd/dai-symbol-pass-spec.k | 35.05 | 37.71 | 0.9294616812516573 |
kontrol/test-expectreverttest-test_expectrevert_returnvalue-0-spec.k | 33.58 | 36.09 | 0.9304516486561373 |
mcd/vat-flux-diff-pass-rough-spec.k | 60.86 | 65.32 | 0.9317207593386406 |
kontrol/test-expectcalltest-testexpectstaticcall-0-spec.k | 32.82 | 35.21 | 0.9321215563760296 |
kontrol/test-arithmetictest-test_wmul_weakly_increasing_positive-uint256-uint256-0-spec.k | 46.03 | 49.24 | 0.9348090982940699 |
kontrol/test-expectreverttest-test_expectrevert_bytes4-0-spec.k | 44.61 | 47.63 | 0.9365945832458534 |
kontrol/test-emitcontracttest-testexpectemitcheckemitter-0-spec.k | 33.01 | 35.16 | 0.9388509670079637 |
mcd/vat-slip-pass-rough-spec.k | 50.96 | 53.84 | 0.9465081723625557 |
erc20/ds/transfer-failure-1-b-spec.k | 54.01 | 57.0 | 0.9475438596491228 |
erc20/hkg/allowance-spec.k | 31.09 | 32.74 | 0.9496029321930359 |
benchmarks/ecrecoverloop00-sigs-valid-spec.k | 44.21 | 46.2 | 0.9569264069264068 |
benchmarks/ecrecoverloop02-sig0-invalid-spec.k | 132.42 | 138.22 | 0.9580379105773403 |
erc20/hkg/transfer-success-2-spec.k | 33.65 | 35.02 | 0.9608794974300399 |
benchmarks/ecrecover00-siginvalid-spec.k | 34.49 | 35.86 | 0.9617958728388177 |
erc20/ds/transferFrom-failure-1-c-spec.k | 55.05 | 57.04 | 0.9651122019635343 |
benchmarks/ecrecoverloop02-sig1-invalid-spec.k | 234.61 | 242.88 | 0.9659502635046114 |
mcd/dsvalue-read-pass-summarize-spec.k | 43.74 | 40.12 | 1.0902293120638087 |
TOTAL | 4380.28 | 4845.87 | 0.9039202454873946 |
…e-during-recursive-evaluation
|
Test | HOTFIX-persist-cache-during-recursive-evaluation time | master-7bbc744b4 time | (HOTFIX-persist-cache-during-recursive-evaluation/master-7bbc744b4) time |
---|---|---|---|
PlainPrankTest.test_stopPrank_notExistent() | 10.91 | 14.18 | 0.7693935119887165 |
AssumeTest.test_multi_assume(address,address) | 22.33 | 28.66 | 0.7791346824842986 |
AccountParamsTest.test_getNonce_unknownSymbolic(address) | 27.76 | 33.14 | 0.8376584188292094 |
ExpectRevertTest.testFail_expectRevert_empty() | 10.79 | 12.88 | 0.8377329192546583 |
ExpectCallTest.testExpectStaticCall() | 15.51 | 17.95 | 0.8640668523676881 |
FreshBytesTest.test_symbolic_bytes_3 | 59.86 | 69.25 | 0.8644043321299639 |
FreshBytesTest.test_symbolic_bytes_length | 32.49 | 37.21 | 0.8731523783929052 |
ConstructorTest.run_constructor() | 10.35 | 11.84 | 0.8741554054054054 |
BytesTypeTest.test_bytes32(bytes32) | 10.58 | 12.09 | 0.8751033912324235 |
AccountParamsTest.testEtchConcrete() | 32.7 | 37.26 | 0.8776167471819647 |
FreshBytesTest.test_symbolic_bytes_1 | 85.2 | 96.23 | 0.885378780006235 |
SymbolicStorageTest.testFail_SymbolicStorage(uint256) | 36.55 | 40.41 | 0.9044790893343232 |
SymbolicStorageTest.testFail_SymbolicStorage1(uint256) | 39.29 | 43.42 | 0.9048825426070934 |
AssumeTest.testFail_assume_true(uint256,uint256) | 32.77 | 36.05 | 0.9090152565880723 |
CounterTest.testSetNumber(uint256) | 18.69 | 20.47 | 0.9130434782608696 |
ExpectRevertTest.test_expectRevert_message() | 16.08 | 17.42 | 0.9230769230769229 |
ExpectRevertTest.test_expectRevert_returnValue() | 20.46 | 22.15 | 0.9237020316027089 |
kontrol/src/tests/integration/test_foundry_prove.py::test_foundry_resume_proof | 34.79 | 37.58 | 0.925758382118148 |
AssumeTest.test_assume_false(uint256,uint256) | 41.89 | 44.98 | 0.9313028012449979 |
LoopsTest.test_sum_10() | 16.77 | 17.99 | 0.9321845469705392 |
PlainPrankTest.test_startPrankWithOrigin_true() | 16.06 | 17.2 | 0.9337209302325581 |
MockCallTestFoundry.testMockNested() | 36.79 | 39.35 | 0.9349428208386277 |
PlainPrankTest.test_prank_zeroAddress_true() | 17.32 | 18.49 | 0.9367225527312062 |
BlockParamsTest.testRoll(uint256) | 13.62 | 14.49 | 0.9399585921325051 |
AssumeTest.test_assume_true(uint256,uint256) | 14.98 | 15.93 | 0.9403640929064658 |
SymbolicStorageTest.testEmptyInitialStorage(uint256) | 12.62 | 13.42 | 0.9403874813710879 |
MockCallTestFoundry.testMockCalldata() | 34.62 | 36.8 | 0.9407608695652174 |
],uint256)) | 132.11 | 140.37 | 0.9411555175607325 |
AccountParamsTest.testFail_GetNonce_true() | 17.38 | 18.46 | 0.9414951245937161 |
]) | 31.27 | 33.2 | 0.941867469879518 |
MockCallTestFoundry.testMockSelector() | 24.27 | 25.76 | 0.9421583850931676 |
ArithmeticTest.test_max1(uint256,uint256) | 28.13 | 29.82 | 0.9433266264252179 |
ExpectRevertTest.test_expectRevert_true() | 13.87 | 14.62 | 0.9487004103967168 |
EmitContractTest.testExpectEmitLessTopics() | 13.76 | 14.48 | 0.9502762430939226 |
ExpectRevertTest.testFail_expectRevert_bytes4() | 18.23 | 19.15 | 0.951958224543081 |
Setup2Test.testFail_setup() | 26.15 | 27.45 | 0.9526411657559198 |
ExpectCallTest.testExpectRegularCall() | 15.34 | 16.06 | 0.9551681195516812 |
AccountParamsTest.testDealSymbolic(uint256) | 16.25 | 17.01 | 0.9553203997648442 |
PlainPrankTest.test_startPrank_zeroAddress_true() | 16.33 | 17.08 | 0.9560889929742389 |
FreshCheatcodes.test_int128() | 13.88 | 14.51 | 0.9565816678152999 |
PlainPrankTest.test_startPrank_true() | 16.14 | 16.87 | 0.956727919383521 |
PlainPrankTest.test_prank_expectRevert() | 17.93 | 18.69 | 0.9593365436062065 |
StoreTest.testStoreLoadNonExistent() | 11.09 | 11.55 | 0.9601731601731601 |
StoreTest.testStoreLoad() | 13.63 | 14.19 | 0.9605355884425653 |
MockCallTest.testSelectorMockCall() | 22.07 | 22.97 | 0.9608184588593819 |
EmitContractTest.testExpectEmit() | 13.77 | 14.33 | 0.9609211444521981 |
ExpectRevertTest.testFail_expectRevert_multipleReverts() | 15.28 | 15.88 | 0.9622166246851385 |
ExpectRevertTest.testFail_expectRevert_false() | 16.49 | 17.12 | 0.9632009345794391 |
LoopsTest.sum_N(uint256) | 127.05 | 131.78 | 0.9641068447412353 |
BlockParamsTest.testWarp(uint256)-trace_options2 | 16.22 | 16.82 | 0.9643281807372175 |
StoreTest.testLoadNonExistent() | 10.81 | 11.19 | 0.9660411081322611 |
AssertTest.test_assert_false() | 30.63 | 29.25 | 1.047179487179487 |
ExpectRevertTest.test_expectRevert_bytes4() | 17.66 | 16.68 | 1.0587529976019185 |
BytesTypeTest.test_bytes4(bytes4) | 14.63 | 13.5 | 1.0837037037037038 |
ExpectRevertTest.testFail_ExpectRevert_failAndSuccess() | 18.38 | 16.72 | 1.0992822966507176 |
kontrol/src/tests/integration/test_foundry_prove.py::test_foundry_refute_node | 10.8 | 9.54 | 1.1320754716981134 |
StructTypeTest.test_vars((uint8,uint32,bytes32)) | 18.96 | 16.71 | 1.1346499102333931 |
FreshCheatcodes.test_freshSymbolicWord() | 16.16 | 13.94 | 1.1592539454806314 |
AddrTest.test_notBuiltinAddress_symbolic(address) | 21.91 | 18.51 | 1.183684494867639 |
FreshCheatcodes.test_address() | 21.44 | 17.45 | 1.22865329512894 |
kontrol/src/tests/integration/test_foundry_prove.py::test_foundry_xml_report | 23.66 | 17.44 | 1.3566513761467889 |
TOTAL | 1563.46 | 1655.94 | 0.9441525659142244 |
@@ -84,8 +84,15 @@ throw = EquationT . lift . throwE | |||
catch_ :: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this function now deserves a comment explaining what it does. How about we write something like: "Recover from an EquationFailure
, taking into account the accumulated EquationState
while executing the exception handler"?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice!
Previously we were discarding any simplifications cached during recursive simplification.
This is overly cautious - while the change flag and the term stack (for iteration count and loop detection) should be restored, the cache remains valid (we may only gain new path conditions, and only in rare cases where equations have an
ensures
clause), and continues to be useful when the same or a similar recursive evaluation is needed.This change sped up a particular request extracted from an
mx-backend
proof from 5 minutes to 5 seconds.