- Bitwuzla BV solver is 5.1x faster than Z3 (SMT-COMP 2023) - ESBMC pattern: dispatch to 6 solvers, race for first result - Proposal: add --solver bitwuzla | z3 | portfolio-all flag - Expected 2-5x speedup on fold's BV-64 queries
2 KiB
Z3 Parallel Solving + Multi-Solver Portfolio for fold
Generated 2026-05-29. Research on accelerating fold's Z3 solving.
Current State
fold uses z3::solver with QF_BV logic. The --portfolio flag runs Z3 tactics in parallel threads (bit-blast + SAT). Default per-query timeout is 2000ms.
Multi-Solver Portfolio Opportunity
| Solver | BV perf vs Z3 | Language | Integration |
|---|---|---|---|
| Bitwuzla | 5.1x faster | C/C++ | C API, drop-in for Z3 |
| CVC5 | ~3x slower | C++ | C API, broader theory support |
| MathSAT | Similar | C | C API, optimization (OMT) |
Recommended: Add --solver bitwuzla flag to fold. On BV-only queries (which fold uses exclusively), Bitwuzla is 5x faster. Keep Z3 as default for its mature tactics engine, but offer Bitwuzla for large codebases.
Incremental Solving
fold already uses solver.push()/solver.pop() in the security walker for branch-local constraints. Z3's incremental mode reuses learned clauses across queries — fold leverages this implicitly.
Parallel Portfolio (ESBMC Pattern)
ESBMC dispatches to 6 solvers simultaneously and returns the first result. fold's current checkWithPortfolio uses Z3 tactics only. Could extend to:
// Dispatch to Z3, Bitwuzla, and CVC5 in parallel
auto result = race({
z3_solver.check(assumptions),
bitwuzla_solver.check(assumptions),
cvc5_solver.check(assumptions)
});
This trades memory for speed — 3 solvers running simultaneously on different cores.
Bitwuzla Integration Plan
- Add
--solverflag to ScanOptions (choices: z3, bitwuzla, portfolio-all) - Add Bitwuzla C API wrapper in
src/symbolic/bitwuzla_solver.cpp - Extend
checkWithPortfoliointactics.cppto optionally dispatch to Bitwuzla - Benchmark on fold's own codebase to measure speedup
Expected impact: 2-5x speedup on BV-heavy queries. Most fold queries are simple null-equality checks — Bitwuzla's BV specialization is ideal for this workload.