Skip to content

MDD libvsync optimizations - #634

Draft
mondokm wants to merge 3 commits into
masterfrom
mdd-libvsync
Draft

mondokm wants to merge 3 commits into
masterfrom
mdd-libvsync

Conversation

@mondokm

@mondokm mondokm commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Optimizations to allow solving the libvsync tasks with GSAT:

  • Handling variable values outside of an int's 32 bits by reserving a range (2^16 possible values) for them. As we give up at 1000 edges by default, this should be enough. Values that were originally in the range also get one from there using the same process.
  • Introducing separate variables for dynamic array addresses that are used like a variable. This is done using a best effort value analysis (start from the initial states and keep appling all writes until a fixpoint without considering control flow).

We can solve 6 of the 12 libvsync tasks with this

mondokm and others added 3 commits October 19, 2026 13:00
An integer outside the int range was truncated to its low 32 bits, so different values shared a key and MDD could report a spurious counterexample. Such values now get keys from a reserved band.
Memory partitions whose accesses have bounded bases and offsets are split into one variable per cell, so MDD sees small scalar domains instead of arrays.
@github-actions

Copy link
Copy Markdown
Contributor

❗ Please modify build.gradle.kts to contain a later version than 8.3.5. Current version is 8.3.5.
You can add a new comment with /version-bump <patch|minor|major> to let the bot do it for you.

@github-actions

Copy link
Copy Markdown
Contributor

Release Preview

Version: 8.3.5
Tag: v8.3.5

Release Notes:
MDD libvsync optimizations

Optimizations to allow solving the libvsync tasks with GSAT:

  • Handling variable values outside of an int's 32 bits by reserving a range (2^16 possible values) for them. As we give up at 1000 edges by default, this should be enough. Values that were originally in the range also get one from there using the same process.
  • Introducing separate variables for dynamic array addresses that are used like a variable. This is done using a best effort value analysis (start from the initial states and keep appling all writes until a fixpoint without considering control flow).

We can solve 6 of the 12 libvsync tasks with this

Modified subprojects (since v8.3.5):
common/analysis
xcfa/xcfa
xcfa/xcfa-analysis

Files to be uploaded:

@github-actions

Copy link
Copy Markdown
Contributor

Benchexec test report for a selection of benchmarks (correct / incorrect / all):

Rundefinition Correct Incorrect All Status
CHC-COMP_Portfolio 147 0 195 ✅
Hardware_CEGAR 47 0 54 ✅
PLC_CEGAR 9 0 9 ✅
PetriNet_MDD 58 0 122 ✅
PetriNet_PN_MDD 72 0 122 ✅
SV-COMP_Portfolio_Emergent 138 0 168 ✅
SV-COMP_Portfolio_Horn 140 0 168 ✅
SV-COMP_Portfolio_Stable 164 0 168 ✅
SV-COMP_Portfolio_Symbolic 112 0 168 ✅
Statechart_CEGAR 110 0 126 ✅

📦 Download the results - extract the zip and open the *.html files.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant