TUNA
This section documents TUNA, the compiler-optimization-based SMT
simplification toolkit in Lotus.
Overview
Location: lib/Solvers/SMT/TUNA/
Origin: https://dl.acm.org/doi/10.1145/3795879 (“Compiler Optimization-Based SMT Simplifications: An In-Depth Study”)
TUNA speeds up SMT solving by translating SMT-LIB 2 formulas to LLVM IR, applying LLVM optimization passes, and translating the optimized IR back to SMT-LIB 2. The simplified formula is typically faster to solve than the original. A genetic algorithm (GA) searches for the best combination of LLVM passes for a given benchmark dataset.
TUNA is a standalone subproject. It targets LLVM 16 (Lotus itself builds against LLVM 14) and is not built by the default Lotus build. See tuna-build below.
Components
TUNA-Opt
The core optimization framework under lib/Solvers/SMT/TUNA/TUNA-Opt/.
It contains two modules:
SMT2LLVM (
TUNA-Opt/SMT2LLVM/): a bidirectional SMT-LIB 2 to LLVM IR conversion toolkit, extended from SLOT. Builds five command-line tools:slot,fastslot,smt2llvm,llvm2smt, andllvm2feat.GA (
TUNA-Opt/GA/): a genetic algorithm optimizer that searches for the optimal LLVM pass combination for a dataset of SMT files.
TUNA-Learn
A planned machine-learning-based optimization framework under
lib/Solvers/SMT/TUNA/TUNA-Learn/. Currently a placeholder with no
implementation.
Build
TUNA is not part of the default Lotus build. Build it from its own CMake project:
cd lib/Solvers/SMT/TUNA/TUNA-Opt/SMT2LLVM
mkdir build && cd build
cmake ..
make -j 32
The build produces five binaries in build/: slot, fastslot,
smt2llvm, llvm2smt, and llvm2feat.
Dependencies: LLVM 16.0.0, Z3 4.12.1, CMake + Ninja, Python 3. The
dependency paths are configured in SMT2LLVM/CMakeLists.txt
(LLVM_PATH and Z3_PATH).
Tools
slot
Full pipeline: SMT-LIB 2 to LLVM IR, optimize, LLVM IR back to SMT-LIB 2.
./slot -m -s problem.smt2 -lu before.ll -lo after.ll -o simplified.smt2 -p ../passes-run.txt
Options (verified in src/tools/main.cpp):
-s <file>: input SMT-LIB 2 file (required)-o <file>: output SMT-LIB 2 file (default: stdout)-lu <file>: write LLVM IR before optimization-lo <file>: write LLVM IR after optimization-t <file>: append timing statistics (CSV)-m: convert constant right-shifts to multiplications-p <file>: read the LLVM pass list from a file-h: show help
fastslot
Pass-file-driven pipeline for batch processing. Supports -s, -o,
-lu, -lo, -t, -m, -p, and -h.
./fastslot -m -s input.smt2 -o result.smt2 -p ../passes-run.txt
smt2llvm
Single-step SMT-LIB 2 to LLVM IR conversion.
./smt2llvm -s input.smt2 -lu output.ll
llvm2smt
Single-step LLVM IR to SMT-LIB 2 conversion.
./llvm2smt -lo optimized.ll -o result.smt2
llvm2feat
Extracts program features (instruction counts, control flow, constant statistics, etc.) from LLVM IR.
./llvm2feat -lo input.ll -f ./features/
Usage
End-to-end SMT simplification:
./slot -m -s problem.smt2 -o simplified.smt2 -p ../passes-run.txt
Step-by-step with intermediate IR inspection:
./smt2llvm -s problem.smt2 -lu before.ll
opt -passes="instcombine,gvn" -S before.ll -o after.ll
./llvm2smt -lo after.ll -o simplified.smt2
Pass Configuration Files
The pass lists live in TUNA-Opt/SMT2LLVM/ and follow the LLVM new Pass
Manager (-passes=) syntax:
File |
Count |
Description |
|---|---|---|
|
9 |
Core passes used by the original SLOT |
|
41 |
All currently supported meaningful passes |
|
25 |
Subset with clear optimization benefit |
|
33 |
Optimization-related passes |
|
80 |
Base pass list available in LLVM 16 |
|
353 |
Full LLVM 16 pass list |
See TUNA-Opt/SMT2LLVM/FunctionPasses.md for pass descriptions.
GA Optimizer
The GA under TUNA-Opt/GA/ searches the boolean pass-enable space to
minimize total pipeline time:
SMT -> smt2llvm -> LLVM IR -> opt (pass combination) -> LLVM IR -> llvm2smt -> SMT -> solver
Configure paths in GA/config.yaml (slot_dir, llvm_dir,
dataset_dir, smt_solver_path, output_csv_path,
smac_log_output_directory), then run:
cd lib/Solvers/SMT/TUNA/TUNA-Opt/GA
python -m ga_optimizer
The GA runs 32 iterations with a population size of 32 and 40 parallel
processes. Pass combinations that beat the baseline solve time are written to
output_csv_path in the format
file_relative_path, cost_time, <pass1>, <pass2>, ..., status.
Optional post-processing scripts:
python -m delta_debugger: prune redundant passes from the best combination, writingRefine_<original_filename>.csvpython -m phrase_time_counter: compare total pipeline time across strategies (default solve, SLOT default passes, GA best, GA worst,-O3)
Runtime logs go to ~/logs/RQ1/ (rq1.info and rq1.error).
Relationship to STAUB
STAUB rewrites unbounded SMT constraints into bounded encodings. Its bounded
formulas can be translated to LLVM IR by TUNA’s SMT2LLVM tools. See
SMT Theory Arbitrage (STAUB) for the STAUB flow.
See Also
SMT Theory Arbitrage (STAUB) - bounded-theory conversion that feeds TUNA’s SMT2LLVM tools
SMT (Satisfiability Modulo Theories) - the SMT solver backend
SMT Samplers - SMT model sampling utilities
Solver Tools - solver command-line front-ends