Skip to content

Commit ce5f2b4

Browse files
avrabeclaude
andauthored
chore(release): v0.36.0 — unreachable traps, sparse tables, 40 verified rules, 81 bridge Qed (#673)
* chore(release): v0.36.0 — unreachable traps + sparse tables + 40 rules + 81 bridge Qed (#668/#669/#670/#671) Pin sweep 0.35.0 -> 0.36.0 + CHANGELOG. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore: fold #672 (post-exhaustion quality) into the v0.36.0 changelog — merged ahead of the tag Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent fd174e5 commit ce5f2b4

14 files changed

Lines changed: 99 additions & 45 deletions

File tree

CHANGELOG.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,60 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.36.0] - 2026-07-08
11+
12+
**`unreachable` finally traps (it was decode-dropped as an "intentional no-op"
13+
on every backend — WASM §4.4.5); RV32 rem_s stops over-trapping; sparse
14+
funcref tables dispatch with null-slot traps (falcon complete); the verified
15+
selector DSL reaches 40 rules and the Sail/ASL bridge reaches 81 Qed —
16+
catching two latent bugs in our own hand-written model.**
17+
18+
### Changed
19+
20+
- **Post-exhaustion code quality (PR #672, #242 — the VCR-VER-001-named
21+
capability):** spill-cleanup now reaches allocation-time Belady slots
22+
(exit-dead scratch renaming, const rematerialization, bounded cleanup
23+
fixpoint, const-divisor guard elision under spill) — all scoped to
24+
`SYNTH_SPILL_ON_EXHAUST` firings; flag-off bit-identical. Cycle-proxy vs
25+
PR #659: spill_rung +32.4% → +8.8%, exhaust +30.4% → +17.4%,
26+
high_pressure_i32 and signed_div_const now BEAT the decline path (−24%,
27+
−33%). Residual named: the bridge's fixed 5-register destination pool —
28+
i.e. the Track-A allocator replacement itself. Flip stays held (#580).
29+
30+
### Fixed
31+
32+
- **WASM `unreachable` compiled to a no-op on thumb-2 AND rv32 (#665, PR
33+
#668).** One decode drop: `Unreachable` was whitelisted as intentionally
34+
ignorable next to `Nop`, so every backend's existing trap arm was dead
35+
code. Now decoded; UDF/ebreak/brk fire per backend; optimized path
36+
loud-declines to direct. Differential: 5 red → green with non-vacuity.
37+
- **RV32 i32.rem_s(INT_MIN,-1) spuriously trapped (#666, PR #668)** — rem_s
38+
had inherited div_s's overflow guard; M-ext REM already returns 0 per
39+
spec. The ARM #633 twin-pins now exist on RV32 (rem_s carries only the
40+
zero guard).
41+
42+
### Added
43+
44+
- **Null-funcref-slot call_indirect (#664, PR #669):** sparse tables no
45+
longer decline — initialized slots type-verified closed-world, null slots
46+
trap at runtime (check emitted only when the table has nulls; fully-
47+
initialized tables whole-ELF byte-identical, 24/24). Contract: null slots
48+
link as zero words (BSS satisfies). falcon's dispatch story is complete.
49+
- **VCR-SEL-001 increment 4 (PR #670, #242/#667):** 40 rules / 40 Qed —
50+
clz, ctz (scratch=dest, no side condition), popcnt (pseudo-op tier), and
51+
the ten binary i64 comparisons (the #615 cond-mapping class, register-
52+
polymorphic). New DSL-coverage metric in coq/STATUS.md: 26% DSL-served /
53+
62% model-only / 12% unverified — the #73 divergence now retires by
54+
measurable subtraction. Named executor gap (SBCS flags-chain) converges
55+
with the ISA spike's PC-executor gap.
56+
- **VCR-ISA-001 round 2 (PR #671, #242):** SailArmBridge.v 23 → **81 Qed**
57+
(28 whole-instruction bridges: AddWithCarry family incl. live-carry
58+
ADC/SBC, flag-free ALU, all four shifts in both forms, MOV/MOVW/MOVT).
59+
**Found two latent hand-model divergences from ARM's ASL** (LSR/ASR #32,
60+
register shift amounts ≥ 32 — unreachable via WASM masking, documented).
61+
Amortization beat the spike estimate: six-plus classes in ~half a day.
62+
VCR-ISA-001 → approved.
63+
1064
## [0.35.0] - 2026-07-08
1165

1266
**The North-Star acceleration wave: the verified selector DSL enters the i64

Cargo.lock

Lines changed: 18 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ resolver = "2"
2828
# semver to publish, so the convention now catches up: workspace
2929
# version follows the release tag, bumped pre-tag in the release
3030
# checklist. See docs/release-process.md.
31-
version = "0.35.0"
31+
version = "0.36.0"
3232
edition = "2024"
3333
rust-version = "1.88"
3434
authors = ["PulseEngine Team"]

MODULE.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module(
77
name = "synth",
88
# Kept in lockstep with [workspace.package] version in Cargo.toml.
99
# Both are bumped pre-tag — see docs/release-process.md.
10-
version = "0.35.0",
10+
version = "0.36.0",
1111
)
1212

1313
# Bazel dependencies

crates/synth-backend-aarch64/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ categories.workspace = true
1111
description = "AArch64 (A64) host-native backend for synth — integer subset (milestone 1, #538)"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.35.0" }
14+
synth-core = { path = "../synth-core", version = "0.36.0" }
1515
thiserror.workspace = true
1616
tracing.workspace = true

crates/synth-backend-awsm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ categories.workspace = true
1111
description = "aWsm backend integration for the Synth compiler"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.35.0" }
14+
synth-core = { path = "../synth-core", version = "0.36.0" }
1515
anyhow.workspace = true
1616
thiserror.workspace = true

crates/synth-backend-riscv/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ categories.workspace = true
1111
description = "RISC-V encoder, ELF builder, PMP allocator, and bare-metal startup for synth"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.35.0" }
15-
synth-synthesis = { path = "../synth-synthesis", version = "0.35.0" }
14+
synth-core = { path = "../synth-core", version = "0.36.0" }
15+
synth-synthesis = { path = "../synth-synthesis", version = "0.36.0" }
1616
anyhow.workspace = true
1717
thiserror.workspace = true
1818
tracing.workspace = true

crates/synth-backend-wasker/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ categories.workspace = true
1111
description = "Wasker backend integration for the Synth compiler"
1212

1313
[dependencies]
14-
synth-core = { path = "../synth-core", version = "0.35.0" }
14+
synth-core = { path = "../synth-core", version = "0.36.0" }
1515
anyhow.workspace = true
1616
thiserror.workspace = true

crates/synth-backend/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ default = ["arm-cortex-m"]
1515
arm-cortex-m = ["synth-synthesis"]
1616

1717
[dependencies]
18-
synth-core = { path = "../synth-core", version = "0.35.0" }
19-
synth-synthesis = { path = "../synth-synthesis", version = "0.35.0", optional = true }
18+
synth-core = { path = "../synth-core", version = "0.36.0" }
19+
synth-synthesis = { path = "../synth-synthesis", version = "0.36.0", optional = true }
2020
anyhow.workspace = true
2121
thiserror.workspace = true

crates/synth-cli/Cargo.toml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,23 @@ verify = ["synth-verify"]
4444
# Path deps carry `version` so `cargo publish` rewrites them to the
4545
# crates.io coordinate. Bumping the workspace version requires
4646
# updating these in lockstep — see docs/release-process.md.
47-
synth-core = { path = "../synth-core", version = "0.35.0" }
48-
synth-frontend = { path = "../synth-frontend", version = "0.35.0" }
49-
synth-synthesis = { path = "../synth-synthesis", version = "0.35.0" }
50-
synth-backend = { path = "../synth-backend", version = "0.35.0" }
47+
synth-core = { path = "../synth-core", version = "0.36.0" }
48+
synth-frontend = { path = "../synth-frontend", version = "0.36.0" }
49+
synth-synthesis = { path = "../synth-synthesis", version = "0.36.0" }
50+
synth-backend = { path = "../synth-backend", version = "0.36.0" }
5151

5252
# AArch64 host-native backend (#538) — small pure-Rust crate, always on.
53-
synth-backend-aarch64 = { path = "../synth-backend-aarch64", version = "0.35.0" }
53+
synth-backend-aarch64 = { path = "../synth-backend-aarch64", version = "0.36.0" }
5454

5555
# Optional external backends
56-
synth-backend-awsm = { path = "../synth-backend-awsm", version = "0.35.0", optional = true }
57-
synth-backend-wasker = { path = "../synth-backend-wasker", version = "0.35.0", optional = true }
58-
synth-backend-riscv = { path = "../synth-backend-riscv", version = "0.35.0", optional = true }
56+
synth-backend-awsm = { path = "../synth-backend-awsm", version = "0.36.0", optional = true }
57+
synth-backend-wasker = { path = "../synth-backend-wasker", version = "0.36.0", optional = true }
58+
synth-backend-riscv = { path = "../synth-backend-riscv", version = "0.36.0", optional = true }
5959

6060
# Optional translation validation — pure-Rust ordeal engine by default (#553),
6161
# no C++ toolchain needed. For the Z3 differential oracle build with
6262
# `--features verify,synth-verify/z3-solver` (+ SYNTH_SOLVER_DIFF=1 at runtime).
63-
synth-verify = { path = "../synth-verify", version = "0.35.0", optional = true, features = ["arm"] }
63+
synth-verify = { path = "../synth-verify", version = "0.36.0", optional = true, features = ["arm"] }
6464

6565
# Optional PulseEngine WASM optimizer
6666
# Uncomment when loom crate is available:

0 commit comments

Comments
 (0)