Repository navigation
v0.2.0
[0.2.0] - 2026-06-03
Major release: a target-agnostic native SSA substrate for modern lifters,
new construction/editing infrastructure, and a broad performance/memory pass.
A few IR enum shapes changed (see Changed).
Added
- Native SSA substrate: target-independent pointer sizes & endianness;
first-class SIMD/vector operations with target-independent lane/vector-type
semantics; native atomics (exchange, lock-RMW, compare-exchange); native
opaque operations with machine-state clobbers; multi-output SSA definitions;
boolean ops and native condition helpers; native flag semantics; and implicit
wide (low/high, quotient/remainder) arithmetic. - Memory effect summaries, exception/interrupt support, and native operation
classes plus target-generic feature tokens. - Fluent SSA builder (
ir::function::builder) and a checked, verifier-preserving
SSA editor (ir::function::editor); all built-in passes migrated onto the
checked mutation APIs. - Recommended normalization-pipeline API, pass bisection/debug hooks, and
structured verifier diagnostics. - Expanded
Targettrait (vector descriptors, pointer sizes, endianness),
MockTarget, and a much larger test suite (builder, scheduling, verifier,
pipeline, and canonicalization coverage). - Allocation-free helpers:
SsaOp::{uses_var, for_each_successor, has_successor},
SsaInstruction::{uses_var, for_each_variable},SsaBlock::for_each_successor,
SymbolicExpr::for_each_variable,SsaFunction::compute_predecessors,
BitSet::is_full,EventLog::into_events,EventListener::is_enabled.
Changed (breaking)
SsaOp::NativeOpaqueis now a tuple variant wrapping a boxed payload
(NativeOpaque(Box<NativeOpaqueData>)) instead of an inline struct variant.ConstValueheap-bearing arms are now boxed:Vector(Box<[ConstValue<T>]>),
DecryptedString(Box<str>),DecryptedArray(Box<DecryptedArrayData<T>>).SsaOpandConstValuegained many new variants for the native substrate;
exhaustive downstream matches must handle them.
Performance & memory
- Shrunk core IR types ~3–4×:
SsaOp168→40 B,SsaInstruction176→48 B,
Option<SsaVarId>16→4 B (niche-encodedSsaVarId),ConstValue40→24 B,
PhiOperand16→8 B; guarded by asize_ofregression test. - Removed hot-loop allocations (
uses()/successors()purge, word-skipping
BitSetiterator, DFS/postorder scratch reuse, cached solver exit set). DefUseIndexuses denseVec-indexed storage instead ofBTreeMap.- De-quadratized DCE, GVN removal, jump-threading safety check, LICM invariant
detection, predicate branch evaluation, trivial-phi predecessor build, and
block-merge redirection; dataflow solver uses an RPO-priority worklist. DirectedGraphstores neighbor ids inline,IndexedGraphdedups edges in
O(1), and cycle detection is iterative (stack-safe on deep graphs).- Scheduler dirty-set membership is O(1); logging allocates nothing under
NullListener.