Switch to widen which doesn't require leq on arguments - #2081
Conversation
The paper has it this way as well, just checking the side-effected value.
|
In sv-benchmarks level01 60s 1GB comparisons, there's no verdict differences: https://goblint.cs.ut.ee/results/380-all-level01-pr-2081-after-2/.
In those cases, before this PR: After this PR: So there is something possibly suspicious happening that it gets stuck at the same number of vars. In overall performance, there's sadly no difference either. I'm still running the rsync comparison to see if it makes a difference there, because the initial hope was based on rsync profiling. |
I traced this with Right-hand side value and new (widened?) value: I guess this might've gone back and forth infinitely (?), I didn't actually check: the log file is impossibly large to interact with. I then had another look at the widening changes of partitioned arrays and found out that I had mistakenly not adapted the various EDIT: The real culprit seems to be #2112 (comment). So my latest commit here should probably get reverted then. |
The speedup on rsync is huge: from ~7h 16 min to "just" ~5h. That's a 31% speedup! |
I am a bit skeptical. Why would we see such a huge speedup here? Is it the removed asserts? |
|
Here are screenshots of the corresponding
It is true that by just pushing the Out of all of our domains, intervals are one of the few that actually have an interesting Before
After
|
|
Thank you for the detailed writeup! |


Arguments for this approach are given here: https://link.springer.com/chapter/10.1007/978-981-19-9601-6_4.
This currently just pushes thejoindown into the domains, so it currently doesn't achieve much.The goal would be to avoid all such intermediate
joins when they're actually not needed and only have the necessary ones in "leaf" domains.This pushes the
joinfrom the solver down into the domains, as far as possible, ideally to the "leaf" domains.And in that case the
joincan often be inlined and integrated intowidento lift theleqassumption without needing to actually construct the intermediate joined value.There are a couple of places where there's still a
joinat an intermediate domain: specifically the variousHoareDomainand set-based struct domains. The whole widening situation there is quite tricky and for the most part we don't use those domains, so the main bottlenecks should be avoided already.This should improve performance on large programs like rsync: #1967 (comment). And it finally should allow #1484 to be integrated without global state hacks.
TODO
widen_with_fctsmart_widenOUT OF MEMORY→TIMEOUTchanges: Switch towidenwhich doesn't requireleqon arguments #2081 (comment)ArrayDomain.Partitioned.makereturning non-normalized values #2112