IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal - #505

Merged
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf
Jul 21, 2026
Merged

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal#505
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf

Conversation

@arthurpaulino

Copy link
Copy Markdown
Member

Selective port of the IxVM-side commits from sb/aiur-perf, adapted to
current main (post-#450/#457) and re-measured. Every candidate was
benchmarked before acceptance; patches that regressed FFT cost or bought
too little for their trace-width cost were dropped (details below).

Commits

  1. Drop dead KValNode/KVal/KValEnv (f4d87d0)
    Leftover NbE value-domain types with no remaining references.

  2. Memoized prim_family dispatch + width-safe offset-stuck placement
    (bbd05c4)
    prim_family(addr) classifies a Const-head address into the one
    reducer family that could fire (nat/str/bitvec/native/decidable —
    the address sets are disjoint), memoized per distinct address, so
    whnf_const_head calls at most one family reducer instead of running
    the 5-reducer gauntlet. The symbolic-Nat offset-stuck check moves from
    a delta-arm probe into try_nat_dispatch's miss path (verdict 2 =
    "already stuck, do not re-whnf"), where the whnf'd args already exist.
    Nat-literal majors expose one constructor layer via
    nat_lit_to_ctor_or_self instead of materializing succ chains.

    Adaptations vs the original patch: whnf_nd_const_head (no-delta
    WHNF, added on main after the patch) converted to the same family
    dispatch; main's cold-extracted try_nat_binop_dispatch kept, with
    the symbolic-base case routed to try_nat_offset_dispatch from its
    miss arm.

  3. H-14: ptr_val skip map + lockstep addr cursor (d42865c,
    originally John C. Burnham's jcb/fixes)
    check_all_skipping keys the assumption-leaf skip set on ptr_val
    (sound by the interning invariant; a de-interned pointer reads as
    absent and the constant just gets checked — fail-closed) and walks
    addrs in lockstep with consts instead of list_lookup(addrs, pos)
    per constant, which was a standalone O(closure²). addr_key is
    retained for the Inductive.lean block-membership table.

Measurements

lake exe ix check Nat.add_comm, cumulative vs main:

metricmainthis PRΔ
total trace width34,82034,781−39
FFT cost (add_comm)49,571,21048,860,647−1.43%

All 53 pinned targets in Tests/Ix/IxVM.lean decreased
(−0.19%..−1.43%); pins updated in the same commit as the change. Full
lake test -- --ignored ixvm suite green (kernel checks, codegen/bytecode
parity, claim smokes including the frontier-assumption path, arena).
crates/ixvm-codegen regenerated per commit; clippy clean.

Dropped after measurement

  • 4940b9f (inline lbr guards on expr_inst1_walk App children):
    regressed every pin on current main (+1.1% on the heavy targets). It
    was measured pre-IxVM kernel: unblock UTF-8 decode/encode proof + Nat-layer FFT cuts #450; main's cold-extracted BVar/Let arms and the
    expr_inst1 lbr fast path already capture the saving, so the App-arm
    guards only added per-row width.
  • fbedfc8 (idx-keyed projection-definition classification): +61 total
    width for −0.28% FFT on its best-case constant
    (Int8.instRxcHasSize_eq). Width taxes proof size and recursive
    verification on every proof; the FFT win is workload-dependent. A
    width-neutral variant (keep the proj_def_info_of split, drop the
    is_proj_def caller gate) is worth revisiting if the SInt/UTF-8
    instance class shows up in real workloads.
  • H-12 output caps on pow/shiftLeft (from the Rust-side branch): not
    a soundness gate — capped results stay stuck, which can only reject,
    never wrongly accept. It is prover-side DoS protection, and compute is
    the prover's concern in a zkVM deployment. Note the resulting
    divergence: the Rust kernel caps, IxVM does not, so the Rust kernel
    rejects some huge-arithmetic terms IxVM accepts (benign when Rust is
    used as a conservative preflight).
  • b9827d4 and b86c632 were already on main (IxVM kernel: canonical level normalization + FFT-cost pinning #447, feat: Add SP1 and Zisk kernel proving backends #411/IxVM: native execution pipeline #463).

From ap/kernel 828fb85 (Arthur Paulino): the NbE value domain is defined
but referenced nowhere — the live kernel runs on de-Bruijn KExpr;
vestigial from an abandoned NbE direction. (The closed-term context
normalization from that commit was measured separately and not taken:
the per-call expr_lbr probe cost +2.9% FFT on recursor loops for a 0.5%
record reduction.)
Three coordinated changes to Const-head whnf dispatch (cherry-pick of
130f30b, adapted to post-#450/#457 main):
1. prim_family(addr) classifies a head address into the one reducer
family that could fire on it (nat/str/bitvec/native/decidable; the
sets are disjoint). Keyed on the ADDRESS ALONE it memoizes to one row
per distinct constant address per run, and whnf_const_head calls at
most one family reducer. The previous gauntlet ran every reducer in
sequence for guaranteed misses.
2. The symbolic-Nat offset-stuck check moves from a delta-arm probe into
try_nat_dispatch's miss path as a cold function
(try_nat_offset_dispatch, verdict 2 = "already stuck, do not
re-whnf"), with the offset construction shared via
mk_nat_offset_stuck (also used by the linear-rec collapse).
3. nat_lit_to_ctor_or_self exposes ONE constructor layer
(n -> succ(Lit(n-1))) instead of materializing the full succ chain.
Adaptations vs the original patch:
- whnf_nd_const_head (no-delta WHNF, added on main after the patch)
converted to the same family dispatch.
- Kept main's cold-extracted try_nat_binop_dispatch and routed the
symbolic-base case to try_nat_offset_dispatch from its miss arm.
Measured (lake exe ix check Nat.add_comm): total width 34820 -> 34806,
FFT cost 49571210 -> 48860647 (-1.43%). All 53 ixvm-suite FFT pins
decreased (-0.19%..-1.43%); parity and claim smokes pass. Pins updated;
crates/ixvm-codegen/src/aiur_ixvm.rs regenerated via `lake exe ix
codegen`.
Two quadratic/constant-factor fixes to check_all_skipping, ported from
jcb/fixes (3763356, John C. Burnham); cherry-pick of 2d83be1 adapted to
post-#457 main:
- The assumption-leaf skip set keys on ptr_val instead of the first 4
address bytes: one tree lookup per constant, no per-lookup address
load, no confirming address_eq. Sound by the build_addr_pos_map
interning invariant (one pointer, one content): a ptr hit implies the
address IS a leaf; a de-interned pointer reads as absent and the
constant just gets checked — fail-closed.
- The iterator walks the addrs list in LOCKSTEP with consts (cur_addrs
suffix) instead of list_lookup(addrs, pos) per constant, which
re-walked the prefix every iteration — a standalone O(closure^2).
Adaptations: kept main's two-arg check_canonical_block_sort call;
addr_key retained (the Inductive.lean block-membership table added on
main after this patch still uses it), comment updated.
Measured (lake exe ix check Nat.add_comm): total width 34806 -> 34781,
FFT cost unchanged (plain checks never take the skip path). Full ixvm
suite green incl. the frontier-assumption claim smoke; all FFT pins
unchanged. crates/ixvm-codegen/src/aiur_ixvm.rs regenerated.
@johnchandlerburnham
johnchandlerburnham merged commit d9313cd into mainJul 21, 2026
10 checks passed
@johnchandlerburnham
johnchandlerburnham deleted the ap/ixvm-kernel-perf branch July 21, 2026 14:44
Sign up for freeto 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.

3 participants

@arthurpaulino@johnchandlerburnham@samuelburnham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal - #505

Merged
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf
Jul 21, 2026
Merged

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal#505
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf

Conversation

@arthurpaulino

Copy link
Copy Markdown
Member

Selective port of the IxVM-side commits from sb/aiur-perf, adapted to
current main (post-#450/#457) and re-measured. Every candidate was
benchmarked before acceptance; patches that regressed FFT cost or bought
too little for their trace-width cost were dropped (details below).

Commits

  1. Drop dead KValNode/KVal/KValEnv (f4d87d0)
    Leftover NbE value-domain types with no remaining references.

  2. Memoized prim_family dispatch + width-safe offset-stuck placement
    (bbd05c4)
    prim_family(addr) classifies a Const-head address into the one
    reducer family that could fire (nat/str/bitvec/native/decidable —
    the address sets are disjoint), memoized per distinct address, so
    whnf_const_head calls at most one family reducer instead of running
    the 5-reducer gauntlet. The symbolic-Nat offset-stuck check moves from
    a delta-arm probe into try_nat_dispatch's miss path (verdict 2 =
    "already stuck, do not re-whnf"), where the whnf'd args already exist.
    Nat-literal majors expose one constructor layer via
    nat_lit_to_ctor_or_self instead of materializing succ chains.

    Adaptations vs the original patch: whnf_nd_const_head (no-delta
    WHNF, added on main after the patch) converted to the same family
    dispatch; main's cold-extracted try_nat_binop_dispatch kept, with
    the symbolic-base case routed to try_nat_offset_dispatch from its
    miss arm.

  3. H-14: ptr_val skip map + lockstep addr cursor (d42865c,
    originally John C. Burnham's jcb/fixes)
    check_all_skipping keys the assumption-leaf skip set on ptr_val
    (sound by the interning invariant; a de-interned pointer reads as
    absent and the constant just gets checked — fail-closed) and walks
    addrs in lockstep with consts instead of list_lookup(addrs, pos)
    per constant, which was a standalone O(closure²). addr_key is
    retained for the Inductive.lean block-membership table.

Measurements

lake exe ix check Nat.add_comm, cumulative vs main:

metricmainthis PRΔ
total trace width34,82034,781−39
FFT cost (add_comm)49,571,21048,860,647−1.43%

All 53 pinned targets in Tests/Ix/IxVM.lean decreased
(−0.19%..−1.43%); pins updated in the same commit as the change. Full
lake test -- --ignored ixvm suite green (kernel checks, codegen/bytecode
parity, claim smokes including the frontier-assumption path, arena).
crates/ixvm-codegen regenerated per commit; clippy clean.

Dropped after measurement

  • 4940b9f (inline lbr guards on expr_inst1_walk App children):
    regressed every pin on current main (+1.1% on the heavy targets). It
    was measured pre-IxVM kernel: unblock UTF-8 decode/encode proof + Nat-layer FFT cuts #450; main's cold-extracted BVar/Let arms and the
    expr_inst1 lbr fast path already capture the saving, so the App-arm
    guards only added per-row width.
  • fbedfc8 (idx-keyed projection-definition classification): +61 total
    width for −0.28% FFT on its best-case constant
    (Int8.instRxcHasSize_eq). Width taxes proof size and recursive
    verification on every proof; the FFT win is workload-dependent. A
    width-neutral variant (keep the proj_def_info_of split, drop the
    is_proj_def caller gate) is worth revisiting if the SInt/UTF-8
    instance class shows up in real workloads.
  • H-12 output caps on pow/shiftLeft (from the Rust-side branch): not
    a soundness gate — capped results stay stuck, which can only reject,
    never wrongly accept. It is prover-side DoS protection, and compute is
    the prover's concern in a zkVM deployment. Note the resulting
    divergence: the Rust kernel caps, IxVM does not, so the Rust kernel
    rejects some huge-arithmetic terms IxVM accepts (benign when Rust is
    used as a conservative preflight).
  • b9827d4 and b86c632 were already on main (IxVM kernel: canonical level normalization + FFT-cost pinning #447, feat: Add SP1 and Zisk kernel proving backends #411/IxVM: native execution pipeline #463).

From ap/kernel 828fb85 (Arthur Paulino): the NbE value domain is defined
but referenced nowhere — the live kernel runs on de-Bruijn KExpr;
vestigial from an abandoned NbE direction. (The closed-term context
normalization from that commit was measured separately and not taken:
the per-call expr_lbr probe cost +2.9% FFT on recursor loops for a 0.5%
record reduction.)
Three coordinated changes to Const-head whnf dispatch (cherry-pick of
130f30b, adapted to post-#450/#457 main):
1. prim_family(addr) classifies a head address into the one reducer
family that could fire on it (nat/str/bitvec/native/decidable; the
sets are disjoint). Keyed on the ADDRESS ALONE it memoizes to one row
per distinct constant address per run, and whnf_const_head calls at
most one family reducer. The previous gauntlet ran every reducer in
sequence for guaranteed misses.
2. The symbolic-Nat offset-stuck check moves from a delta-arm probe into
try_nat_dispatch's miss path as a cold function
(try_nat_offset_dispatch, verdict 2 = "already stuck, do not
re-whnf"), with the offset construction shared via
mk_nat_offset_stuck (also used by the linear-rec collapse).
3. nat_lit_to_ctor_or_self exposes ONE constructor layer
(n -> succ(Lit(n-1))) instead of materializing the full succ chain.
Adaptations vs the original patch:
- whnf_nd_const_head (no-delta WHNF, added on main after the patch)
converted to the same family dispatch.
- Kept main's cold-extracted try_nat_binop_dispatch and routed the
symbolic-base case to try_nat_offset_dispatch from its miss arm.
Measured (lake exe ix check Nat.add_comm): total width 34820 -> 34806,
FFT cost 49571210 -> 48860647 (-1.43%). All 53 ixvm-suite FFT pins
decreased (-0.19%..-1.43%); parity and claim smokes pass. Pins updated;
crates/ixvm-codegen/src/aiur_ixvm.rs regenerated via `lake exe ix
codegen`.
Two quadratic/constant-factor fixes to check_all_skipping, ported from
jcb/fixes (3763356, John C. Burnham); cherry-pick of 2d83be1 adapted to
post-#457 main:
- The assumption-leaf skip set keys on ptr_val instead of the first 4
address bytes: one tree lookup per constant, no per-lookup address
load, no confirming address_eq. Sound by the build_addr_pos_map
interning invariant (one pointer, one content): a ptr hit implies the
address IS a leaf; a de-interned pointer reads as absent and the
constant just gets checked — fail-closed.
- The iterator walks the addrs list in LOCKSTEP with consts (cur_addrs
suffix) instead of list_lookup(addrs, pos) per constant, which
re-walked the prefix every iteration — a standalone O(closure^2).
Adaptations: kept main's two-arg check_canonical_block_sort call;
addr_key retained (the Inductive.lean block-membership table added on
main after this patch still uses it), comment updated.
Measured (lake exe ix check Nat.add_comm): total width 34806 -> 34781,
FFT cost unchanged (plain checks never take the skip path). Full ixvm
suite green incl. the frontier-assumption claim smoke; all FFT pins
unchanged. crates/ixvm-codegen/src/aiur_ixvm.rs regenerated.
@johnchandlerburnham
johnchandlerburnham merged commit d9313cd into mainJul 21, 2026
10 checks passed
@johnchandlerburnham
johnchandlerburnham deleted the ap/ixvm-kernel-perf branch July 21, 2026 14:44
Sign up for freeto 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.

3 participants

@arthurpaulino@johnchandlerburnham@samuelburnham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal - #505

Merged
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf
Jul 21, 2026
Merged

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal#505
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf

Conversation

@arthurpaulino

Copy link
Copy Markdown
Member

Selective port of the IxVM-side commits from sb/aiur-perf, adapted to
current main (post-#450/#457) and re-measured. Every candidate was
benchmarked before acceptance; patches that regressed FFT cost or bought
too little for their trace-width cost were dropped (details below).

Commits

  1. Drop dead KValNode/KVal/KValEnv (f4d87d0)
    Leftover NbE value-domain types with no remaining references.

  2. Memoized prim_family dispatch + width-safe offset-stuck placement
    (bbd05c4)
    prim_family(addr) classifies a Const-head address into the one
    reducer family that could fire (nat/str/bitvec/native/decidable —
    the address sets are disjoint), memoized per distinct address, so
    whnf_const_head calls at most one family reducer instead of running
    the 5-reducer gauntlet. The symbolic-Nat offset-stuck check moves from
    a delta-arm probe into try_nat_dispatch's miss path (verdict 2 =
    "already stuck, do not re-whnf"), where the whnf'd args already exist.
    Nat-literal majors expose one constructor layer via
    nat_lit_to_ctor_or_self instead of materializing succ chains.

    Adaptations vs the original patch: whnf_nd_const_head (no-delta
    WHNF, added on main after the patch) converted to the same family
    dispatch; main's cold-extracted try_nat_binop_dispatch kept, with
    the symbolic-base case routed to try_nat_offset_dispatch from its
    miss arm.

  3. H-14: ptr_val skip map + lockstep addr cursor (d42865c,
    originally John C. Burnham's jcb/fixes)
    check_all_skipping keys the assumption-leaf skip set on ptr_val
    (sound by the interning invariant; a de-interned pointer reads as
    absent and the constant just gets checked — fail-closed) and walks
    addrs in lockstep with consts instead of list_lookup(addrs, pos)
    per constant, which was a standalone O(closure²). addr_key is
    retained for the Inductive.lean block-membership table.

Measurements

lake exe ix check Nat.add_comm, cumulative vs main:

metricmainthis PRΔ
total trace width34,82034,781−39
FFT cost (add_comm)49,571,21048,860,647−1.43%

All 53 pinned targets in Tests/Ix/IxVM.lean decreased
(−0.19%..−1.43%); pins updated in the same commit as the change. Full
lake test -- --ignored ixvm suite green (kernel checks, codegen/bytecode
parity, claim smokes including the frontier-assumption path, arena).
crates/ixvm-codegen regenerated per commit; clippy clean.

Dropped after measurement

  • 4940b9f (inline lbr guards on expr_inst1_walk App children):
    regressed every pin on current main (+1.1% on the heavy targets). It
    was measured pre-IxVM kernel: unblock UTF-8 decode/encode proof + Nat-layer FFT cuts #450; main's cold-extracted BVar/Let arms and the
    expr_inst1 lbr fast path already capture the saving, so the App-arm
    guards only added per-row width.
  • fbedfc8 (idx-keyed projection-definition classification): +61 total
    width for −0.28% FFT on its best-case constant
    (Int8.instRxcHasSize_eq). Width taxes proof size and recursive
    verification on every proof; the FFT win is workload-dependent. A
    width-neutral variant (keep the proj_def_info_of split, drop the
    is_proj_def caller gate) is worth revisiting if the SInt/UTF-8
    instance class shows up in real workloads.
  • H-12 output caps on pow/shiftLeft (from the Rust-side branch): not
    a soundness gate — capped results stay stuck, which can only reject,
    never wrongly accept. It is prover-side DoS protection, and compute is
    the prover's concern in a zkVM deployment. Note the resulting
    divergence: the Rust kernel caps, IxVM does not, so the Rust kernel
    rejects some huge-arithmetic terms IxVM accepts (benign when Rust is
    used as a conservative preflight).
  • b9827d4 and b86c632 were already on main (IxVM kernel: canonical level normalization + FFT-cost pinning #447, feat: Add SP1 and Zisk kernel proving backends #411/IxVM: native execution pipeline #463).

From ap/kernel 828fb85 (Arthur Paulino): the NbE value domain is defined
but referenced nowhere — the live kernel runs on de-Bruijn KExpr;
vestigial from an abandoned NbE direction. (The closed-term context
normalization from that commit was measured separately and not taken:
the per-call expr_lbr probe cost +2.9% FFT on recursor loops for a 0.5%
record reduction.)
Three coordinated changes to Const-head whnf dispatch (cherry-pick of
130f30b, adapted to post-#450/#457 main):
1. prim_family(addr) classifies a head address into the one reducer
family that could fire on it (nat/str/bitvec/native/decidable; the
sets are disjoint). Keyed on the ADDRESS ALONE it memoizes to one row
per distinct constant address per run, and whnf_const_head calls at
most one family reducer. The previous gauntlet ran every reducer in
sequence for guaranteed misses.
2. The symbolic-Nat offset-stuck check moves from a delta-arm probe into
try_nat_dispatch's miss path as a cold function
(try_nat_offset_dispatch, verdict 2 = "already stuck, do not
re-whnf"), with the offset construction shared via
mk_nat_offset_stuck (also used by the linear-rec collapse).
3. nat_lit_to_ctor_or_self exposes ONE constructor layer
(n -> succ(Lit(n-1))) instead of materializing the full succ chain.
Adaptations vs the original patch:
- whnf_nd_const_head (no-delta WHNF, added on main after the patch)
converted to the same family dispatch.
- Kept main's cold-extracted try_nat_binop_dispatch and routed the
symbolic-base case to try_nat_offset_dispatch from its miss arm.
Measured (lake exe ix check Nat.add_comm): total width 34820 -> 34806,
FFT cost 49571210 -> 48860647 (-1.43%). All 53 ixvm-suite FFT pins
decreased (-0.19%..-1.43%); parity and claim smokes pass. Pins updated;
crates/ixvm-codegen/src/aiur_ixvm.rs regenerated via `lake exe ix
codegen`.
Two quadratic/constant-factor fixes to check_all_skipping, ported from
jcb/fixes (3763356, John C. Burnham); cherry-pick of 2d83be1 adapted to
post-#457 main:
- The assumption-leaf skip set keys on ptr_val instead of the first 4
address bytes: one tree lookup per constant, no per-lookup address
load, no confirming address_eq. Sound by the build_addr_pos_map
interning invariant (one pointer, one content): a ptr hit implies the
address IS a leaf; a de-interned pointer reads as absent and the
constant just gets checked — fail-closed.
- The iterator walks the addrs list in LOCKSTEP with consts (cur_addrs
suffix) instead of list_lookup(addrs, pos) per constant, which
re-walked the prefix every iteration — a standalone O(closure^2).
Adaptations: kept main's two-arg check_canonical_block_sort call;
addr_key retained (the Inductive.lean block-membership table added on
main after this patch still uses it), comment updated.
Measured (lake exe ix check Nat.add_comm): total width 34806 -> 34781,
FFT cost unchanged (plain checks never take the skip path). Full ixvm
suite green incl. the frontier-assumption claim smoke; all FFT pins
unchanged. crates/ixvm-codegen/src/aiur_ixvm.rs regenerated.
@johnchandlerburnham
johnchandlerburnham merged commit d9313cd into mainJul 21, 2026
10 checks passed
@johnchandlerburnham
johnchandlerburnham deleted the ap/ixvm-kernel-perf branch July 21, 2026 14:44
Sign up for freeto 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.

3 participants

@arthurpaulino@johnchandlerburnham@samuelburnham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal - #505

Merged
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf
Jul 21, 2026
Merged

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal#505
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf

Conversation

@arthurpaulino

Copy link
Copy Markdown
Member

Selective port of the IxVM-side commits from sb/aiur-perf, adapted to
current main (post-#450/#457) and re-measured. Every candidate was
benchmarked before acceptance; patches that regressed FFT cost or bought
too little for their trace-width cost were dropped (details below).

Commits

  1. Drop dead KValNode/KVal/KValEnv (f4d87d0)
    Leftover NbE value-domain types with no remaining references.

  2. Memoized prim_family dispatch + width-safe offset-stuck placement
    (bbd05c4)
    prim_family(addr) classifies a Const-head address into the one
    reducer family that could fire (nat/str/bitvec/native/decidable —
    the address sets are disjoint), memoized per distinct address, so
    whnf_const_head calls at most one family reducer instead of running
    the 5-reducer gauntlet. The symbolic-Nat offset-stuck check moves from
    a delta-arm probe into try_nat_dispatch's miss path (verdict 2 =
    "already stuck, do not re-whnf"), where the whnf'd args already exist.
    Nat-literal majors expose one constructor layer via
    nat_lit_to_ctor_or_self instead of materializing succ chains.

    Adaptations vs the original patch: whnf_nd_const_head (no-delta
    WHNF, added on main after the patch) converted to the same family
    dispatch; main's cold-extracted try_nat_binop_dispatch kept, with
    the symbolic-base case routed to try_nat_offset_dispatch from its
    miss arm.

  3. H-14: ptr_val skip map + lockstep addr cursor (d42865c,
    originally John C. Burnham's jcb/fixes)
    check_all_skipping keys the assumption-leaf skip set on ptr_val
    (sound by the interning invariant; a de-interned pointer reads as
    absent and the constant just gets checked — fail-closed) and walks
    addrs in lockstep with consts instead of list_lookup(addrs, pos)
    per constant, which was a standalone O(closure²). addr_key is
    retained for the Inductive.lean block-membership table.

Measurements

lake exe ix check Nat.add_comm, cumulative vs main:

metricmainthis PRΔ
total trace width34,82034,781−39
FFT cost (add_comm)49,571,21048,860,647−1.43%

All 53 pinned targets in Tests/Ix/IxVM.lean decreased
(−0.19%..−1.43%); pins updated in the same commit as the change. Full
lake test -- --ignored ixvm suite green (kernel checks, codegen/bytecode
parity, claim smokes including the frontier-assumption path, arena).
crates/ixvm-codegen regenerated per commit; clippy clean.

Dropped after measurement

  • 4940b9f (inline lbr guards on expr_inst1_walk App children):
    regressed every pin on current main (+1.1% on the heavy targets). It
    was measured pre-IxVM kernel: unblock UTF-8 decode/encode proof + Nat-layer FFT cuts #450; main's cold-extracted BVar/Let arms and the
    expr_inst1 lbr fast path already capture the saving, so the App-arm
    guards only added per-row width.
  • fbedfc8 (idx-keyed projection-definition classification): +61 total
    width for −0.28% FFT on its best-case constant
    (Int8.instRxcHasSize_eq). Width taxes proof size and recursive
    verification on every proof; the FFT win is workload-dependent. A
    width-neutral variant (keep the proj_def_info_of split, drop the
    is_proj_def caller gate) is worth revisiting if the SInt/UTF-8
    instance class shows up in real workloads.
  • H-12 output caps on pow/shiftLeft (from the Rust-side branch): not
    a soundness gate — capped results stay stuck, which can only reject,
    never wrongly accept. It is prover-side DoS protection, and compute is
    the prover's concern in a zkVM deployment. Note the resulting
    divergence: the Rust kernel caps, IxVM does not, so the Rust kernel
    rejects some huge-arithmetic terms IxVM accepts (benign when Rust is
    used as a conservative preflight).
  • b9827d4 and b86c632 were already on main (IxVM kernel: canonical level normalization + FFT-cost pinning #447, feat: Add SP1 and Zisk kernel proving backends #411/IxVM: native execution pipeline #463).

From ap/kernel 828fb85 (Arthur Paulino): the NbE value domain is defined
but referenced nowhere — the live kernel runs on de-Bruijn KExpr;
vestigial from an abandoned NbE direction. (The closed-term context
normalization from that commit was measured separately and not taken:
the per-call expr_lbr probe cost +2.9% FFT on recursor loops for a 0.5%
record reduction.)
Three coordinated changes to Const-head whnf dispatch (cherry-pick of
130f30b, adapted to post-#450/#457 main):
1. prim_family(addr) classifies a head address into the one reducer
family that could fire on it (nat/str/bitvec/native/decidable; the
sets are disjoint). Keyed on the ADDRESS ALONE it memoizes to one row
per distinct constant address per run, and whnf_const_head calls at
most one family reducer. The previous gauntlet ran every reducer in
sequence for guaranteed misses.
2. The symbolic-Nat offset-stuck check moves from a delta-arm probe into
try_nat_dispatch's miss path as a cold function
(try_nat_offset_dispatch, verdict 2 = "already stuck, do not
re-whnf"), with the offset construction shared via
mk_nat_offset_stuck (also used by the linear-rec collapse).
3. nat_lit_to_ctor_or_self exposes ONE constructor layer
(n -> succ(Lit(n-1))) instead of materializing the full succ chain.
Adaptations vs the original patch:
- whnf_nd_const_head (no-delta WHNF, added on main after the patch)
converted to the same family dispatch.
- Kept main's cold-extracted try_nat_binop_dispatch and routed the
symbolic-base case to try_nat_offset_dispatch from its miss arm.
Measured (lake exe ix check Nat.add_comm): total width 34820 -> 34806,
FFT cost 49571210 -> 48860647 (-1.43%). All 53 ixvm-suite FFT pins
decreased (-0.19%..-1.43%); parity and claim smokes pass. Pins updated;
crates/ixvm-codegen/src/aiur_ixvm.rs regenerated via `lake exe ix
codegen`.
Two quadratic/constant-factor fixes to check_all_skipping, ported from
jcb/fixes (3763356, John C. Burnham); cherry-pick of 2d83be1 adapted to
post-#457 main:
- The assumption-leaf skip set keys on ptr_val instead of the first 4
address bytes: one tree lookup per constant, no per-lookup address
load, no confirming address_eq. Sound by the build_addr_pos_map
interning invariant (one pointer, one content): a ptr hit implies the
address IS a leaf; a de-interned pointer reads as absent and the
constant just gets checked — fail-closed.
- The iterator walks the addrs list in LOCKSTEP with consts (cur_addrs
suffix) instead of list_lookup(addrs, pos) per constant, which
re-walked the prefix every iteration — a standalone O(closure^2).
Adaptations: kept main's two-arg check_canonical_block_sort call;
addr_key retained (the Inductive.lean block-membership table added on
main after this patch still uses it), comment updated.
Measured (lake exe ix check Nat.add_comm): total width 34806 -> 34781,
FFT cost unchanged (plain checks never take the skip path). Full ixvm
suite green incl. the frontier-assumption claim smoke; all FFT pins
unchanged. crates/ixvm-codegen/src/aiur_ixvm.rs regenerated.
@johnchandlerburnham
johnchandlerburnham merged commit d9313cd into mainJul 21, 2026
10 checks passed
@johnchandlerburnham
johnchandlerburnham deleted the ap/ixvm-kernel-perf branch July 21, 2026 14:44
Sign up for freeto 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.

3 participants

@arthurpaulino@johnchandlerburnham@samuelburnham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal - #505

Merged
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf
Jul 21, 2026
Merged

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal#505
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf

Conversation

@arthurpaulino

Copy link
Copy Markdown
Member

Selective port of the IxVM-side commits from sb/aiur-perf, adapted to
current main (post-#450/#457) and re-measured. Every candidate was
benchmarked before acceptance; patches that regressed FFT cost or bought
too little for their trace-width cost were dropped (details below).

Commits

  1. Drop dead KValNode/KVal/KValEnv (f4d87d0)
    Leftover NbE value-domain types with no remaining references.

  2. Memoized prim_family dispatch + width-safe offset-stuck placement
    (bbd05c4)
    prim_family(addr) classifies a Const-head address into the one
    reducer family that could fire (nat/str/bitvec/native/decidable —
    the address sets are disjoint), memoized per distinct address, so
    whnf_const_head calls at most one family reducer instead of running
    the 5-reducer gauntlet. The symbolic-Nat offset-stuck check moves from
    a delta-arm probe into try_nat_dispatch's miss path (verdict 2 =
    "already stuck, do not re-whnf"), where the whnf'd args already exist.
    Nat-literal majors expose one constructor layer via
    nat_lit_to_ctor_or_self instead of materializing succ chains.

    Adaptations vs the original patch: whnf_nd_const_head (no-delta
    WHNF, added on main after the patch) converted to the same family
    dispatch; main's cold-extracted try_nat_binop_dispatch kept, with
    the symbolic-base case routed to try_nat_offset_dispatch from its
    miss arm.

  3. H-14: ptr_val skip map + lockstep addr cursor (d42865c,
    originally John C. Burnham's jcb/fixes)
    check_all_skipping keys the assumption-leaf skip set on ptr_val
    (sound by the interning invariant; a de-interned pointer reads as
    absent and the constant just gets checked — fail-closed) and walks
    addrs in lockstep with consts instead of list_lookup(addrs, pos)
    per constant, which was a standalone O(closure²). addr_key is
    retained for the Inductive.lean block-membership table.

Measurements

lake exe ix check Nat.add_comm, cumulative vs main:

metricmainthis PRΔ
total trace width34,82034,781−39
FFT cost (add_comm)49,571,21048,860,647−1.43%

All 53 pinned targets in Tests/Ix/IxVM.lean decreased
(−0.19%..−1.43%); pins updated in the same commit as the change. Full
lake test -- --ignored ixvm suite green (kernel checks, codegen/bytecode
parity, claim smokes including the frontier-assumption path, arena).
crates/ixvm-codegen regenerated per commit; clippy clean.

Dropped after measurement

  • 4940b9f (inline lbr guards on expr_inst1_walk App children):
    regressed every pin on current main (+1.1% on the heavy targets). It
    was measured pre-IxVM kernel: unblock UTF-8 decode/encode proof + Nat-layer FFT cuts #450; main's cold-extracted BVar/Let arms and the
    expr_inst1 lbr fast path already capture the saving, so the App-arm
    guards only added per-row width.
  • fbedfc8 (idx-keyed projection-definition classification): +61 total
    width for −0.28% FFT on its best-case constant
    (Int8.instRxcHasSize_eq). Width taxes proof size and recursive
    verification on every proof; the FFT win is workload-dependent. A
    width-neutral variant (keep the proj_def_info_of split, drop the
    is_proj_def caller gate) is worth revisiting if the SInt/UTF-8
    instance class shows up in real workloads.
  • H-12 output caps on pow/shiftLeft (from the Rust-side branch): not
    a soundness gate — capped results stay stuck, which can only reject,
    never wrongly accept. It is prover-side DoS protection, and compute is
    the prover's concern in a zkVM deployment. Note the resulting
    divergence: the Rust kernel caps, IxVM does not, so the Rust kernel
    rejects some huge-arithmetic terms IxVM accepts (benign when Rust is
    used as a conservative preflight).
  • b9827d4 and b86c632 were already on main (IxVM kernel: canonical level normalization + FFT-cost pinning #447, feat: Add SP1 and Zisk kernel proving backends #411/IxVM: native execution pipeline #463).

From ap/kernel 828fb85 (Arthur Paulino): the NbE value domain is defined
but referenced nowhere — the live kernel runs on de-Bruijn KExpr;
vestigial from an abandoned NbE direction. (The closed-term context
normalization from that commit was measured separately and not taken:
the per-call expr_lbr probe cost +2.9% FFT on recursor loops for a 0.5%
record reduction.)
Three coordinated changes to Const-head whnf dispatch (cherry-pick of
130f30b, adapted to post-#450/#457 main):
1. prim_family(addr) classifies a head address into the one reducer
family that could fire on it (nat/str/bitvec/native/decidable; the
sets are disjoint). Keyed on the ADDRESS ALONE it memoizes to one row
per distinct constant address per run, and whnf_const_head calls at
most one family reducer. The previous gauntlet ran every reducer in
sequence for guaranteed misses.
2. The symbolic-Nat offset-stuck check moves from a delta-arm probe into
try_nat_dispatch's miss path as a cold function
(try_nat_offset_dispatch, verdict 2 = "already stuck, do not
re-whnf"), with the offset construction shared via
mk_nat_offset_stuck (also used by the linear-rec collapse).
3. nat_lit_to_ctor_or_self exposes ONE constructor layer
(n -> succ(Lit(n-1))) instead of materializing the full succ chain.
Adaptations vs the original patch:
- whnf_nd_const_head (no-delta WHNF, added on main after the patch)
converted to the same family dispatch.
- Kept main's cold-extracted try_nat_binop_dispatch and routed the
symbolic-base case to try_nat_offset_dispatch from its miss arm.
Measured (lake exe ix check Nat.add_comm): total width 34820 -> 34806,
FFT cost 49571210 -> 48860647 (-1.43%). All 53 ixvm-suite FFT pins
decreased (-0.19%..-1.43%); parity and claim smokes pass. Pins updated;
crates/ixvm-codegen/src/aiur_ixvm.rs regenerated via `lake exe ix
codegen`.
Two quadratic/constant-factor fixes to check_all_skipping, ported from
jcb/fixes (3763356, John C. Burnham); cherry-pick of 2d83be1 adapted to
post-#457 main:
- The assumption-leaf skip set keys on ptr_val instead of the first 4
address bytes: one tree lookup per constant, no per-lookup address
load, no confirming address_eq. Sound by the build_addr_pos_map
interning invariant (one pointer, one content): a ptr hit implies the
address IS a leaf; a de-interned pointer reads as absent and the
constant just gets checked — fail-closed.
- The iterator walks the addrs list in LOCKSTEP with consts (cur_addrs
suffix) instead of list_lookup(addrs, pos) per constant, which
re-walked the prefix every iteration — a standalone O(closure^2).
Adaptations: kept main's two-arg check_canonical_block_sort call;
addr_key retained (the Inductive.lean block-membership table added on
main after this patch still uses it), comment updated.
Measured (lake exe ix check Nat.add_comm): total width 34806 -> 34781,
FFT cost unchanged (plain checks never take the skip path). Full ixvm
suite green incl. the frontier-assumption claim smoke; all FFT pins
unchanged. crates/ixvm-codegen/src/aiur_ixvm.rs regenerated.
@johnchandlerburnham
johnchandlerburnham merged commit d9313cd into mainJul 21, 2026
10 checks passed
@johnchandlerburnham
johnchandlerburnham deleted the ap/ixvm-kernel-perf branch July 21, 2026 14:44
Sign up for freeto 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.

3 participants

@arthurpaulino@johnchandlerburnham@samuelburnham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal - #505

Merged
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf
Jul 21, 2026
Merged

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal#505
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf

Conversation

@arthurpaulino

Copy link
Copy Markdown
Member

Selective port of the IxVM-side commits from sb/aiur-perf, adapted to
current main (post-#450/#457) and re-measured. Every candidate was
benchmarked before acceptance; patches that regressed FFT cost or bought
too little for their trace-width cost were dropped (details below).

Commits

  1. Drop dead KValNode/KVal/KValEnv (f4d87d0)
    Leftover NbE value-domain types with no remaining references.

  2. Memoized prim_family dispatch + width-safe offset-stuck placement
    (bbd05c4)
    prim_family(addr) classifies a Const-head address into the one
    reducer family that could fire (nat/str/bitvec/native/decidable —
    the address sets are disjoint), memoized per distinct address, so
    whnf_const_head calls at most one family reducer instead of running
    the 5-reducer gauntlet. The symbolic-Nat offset-stuck check moves from
    a delta-arm probe into try_nat_dispatch's miss path (verdict 2 =
    "already stuck, do not re-whnf"), where the whnf'd args already exist.
    Nat-literal majors expose one constructor layer via
    nat_lit_to_ctor_or_self instead of materializing succ chains.

    Adaptations vs the original patch: whnf_nd_const_head (no-delta
    WHNF, added on main after the patch) converted to the same family
    dispatch; main's cold-extracted try_nat_binop_dispatch kept, with
    the symbolic-base case routed to try_nat_offset_dispatch from its
    miss arm.

  3. H-14: ptr_val skip map + lockstep addr cursor (d42865c,
    originally John C. Burnham's jcb/fixes)
    check_all_skipping keys the assumption-leaf skip set on ptr_val
    (sound by the interning invariant; a de-interned pointer reads as
    absent and the constant just gets checked — fail-closed) and walks
    addrs in lockstep with consts instead of list_lookup(addrs, pos)
    per constant, which was a standalone O(closure²). addr_key is
    retained for the Inductive.lean block-membership table.

Measurements

lake exe ix check Nat.add_comm, cumulative vs main:

metricmainthis PRΔ
total trace width34,82034,781−39
FFT cost (add_comm)49,571,21048,860,647−1.43%

All 53 pinned targets in Tests/Ix/IxVM.lean decreased
(−0.19%..−1.43%); pins updated in the same commit as the change. Full
lake test -- --ignored ixvm suite green (kernel checks, codegen/bytecode
parity, claim smokes including the frontier-assumption path, arena).
crates/ixvm-codegen regenerated per commit; clippy clean.

Dropped after measurement

  • 4940b9f (inline lbr guards on expr_inst1_walk App children):
    regressed every pin on current main (+1.1% on the heavy targets). It
    was measured pre-IxVM kernel: unblock UTF-8 decode/encode proof + Nat-layer FFT cuts #450; main's cold-extracted BVar/Let arms and the
    expr_inst1 lbr fast path already capture the saving, so the App-arm
    guards only added per-row width.
  • fbedfc8 (idx-keyed projection-definition classification): +61 total
    width for −0.28% FFT on its best-case constant
    (Int8.instRxcHasSize_eq). Width taxes proof size and recursive
    verification on every proof; the FFT win is workload-dependent. A
    width-neutral variant (keep the proj_def_info_of split, drop the
    is_proj_def caller gate) is worth revisiting if the SInt/UTF-8
    instance class shows up in real workloads.
  • H-12 output caps on pow/shiftLeft (from the Rust-side branch): not
    a soundness gate — capped results stay stuck, which can only reject,
    never wrongly accept. It is prover-side DoS protection, and compute is
    the prover's concern in a zkVM deployment. Note the resulting
    divergence: the Rust kernel caps, IxVM does not, so the Rust kernel
    rejects some huge-arithmetic terms IxVM accepts (benign when Rust is
    used as a conservative preflight).
  • b9827d4 and b86c632 were already on main (IxVM kernel: canonical level normalization + FFT-cost pinning #447, feat: Add SP1 and Zisk kernel proving backends #411/IxVM: native execution pipeline #463).

From ap/kernel 828fb85 (Arthur Paulino): the NbE value domain is defined
but referenced nowhere — the live kernel runs on de-Bruijn KExpr;
vestigial from an abandoned NbE direction. (The closed-term context
normalization from that commit was measured separately and not taken:
the per-call expr_lbr probe cost +2.9% FFT on recursor loops for a 0.5%
record reduction.)
Three coordinated changes to Const-head whnf dispatch (cherry-pick of
130f30b, adapted to post-#450/#457 main):
1. prim_family(addr) classifies a head address into the one reducer
family that could fire on it (nat/str/bitvec/native/decidable; the
sets are disjoint). Keyed on the ADDRESS ALONE it memoizes to one row
per distinct constant address per run, and whnf_const_head calls at
most one family reducer. The previous gauntlet ran every reducer in
sequence for guaranteed misses.
2. The symbolic-Nat offset-stuck check moves from a delta-arm probe into
try_nat_dispatch's miss path as a cold function
(try_nat_offset_dispatch, verdict 2 = "already stuck, do not
re-whnf"), with the offset construction shared via
mk_nat_offset_stuck (also used by the linear-rec collapse).
3. nat_lit_to_ctor_or_self exposes ONE constructor layer
(n -> succ(Lit(n-1))) instead of materializing the full succ chain.
Adaptations vs the original patch:
- whnf_nd_const_head (no-delta WHNF, added on main after the patch)
converted to the same family dispatch.
- Kept main's cold-extracted try_nat_binop_dispatch and routed the
symbolic-base case to try_nat_offset_dispatch from its miss arm.
Measured (lake exe ix check Nat.add_comm): total width 34820 -> 34806,
FFT cost 49571210 -> 48860647 (-1.43%). All 53 ixvm-suite FFT pins
decreased (-0.19%..-1.43%); parity and claim smokes pass. Pins updated;
crates/ixvm-codegen/src/aiur_ixvm.rs regenerated via `lake exe ix
codegen`.
Two quadratic/constant-factor fixes to check_all_skipping, ported from
jcb/fixes (3763356, John C. Burnham); cherry-pick of 2d83be1 adapted to
post-#457 main:
- The assumption-leaf skip set keys on ptr_val instead of the first 4
address bytes: one tree lookup per constant, no per-lookup address
load, no confirming address_eq. Sound by the build_addr_pos_map
interning invariant (one pointer, one content): a ptr hit implies the
address IS a leaf; a de-interned pointer reads as absent and the
constant just gets checked — fail-closed.
- The iterator walks the addrs list in LOCKSTEP with consts (cur_addrs
suffix) instead of list_lookup(addrs, pos) per constant, which
re-walked the prefix every iteration — a standalone O(closure^2).
Adaptations: kept main's two-arg check_canonical_block_sort call;
addr_key retained (the Inductive.lean block-membership table added on
main after this patch still uses it), comment updated.
Measured (lake exe ix check Nat.add_comm): total width 34806 -> 34781,
FFT cost unchanged (plain checks never take the skip path). Full ixvm
suite green incl. the frontier-assumption claim smoke; all FFT pins
unchanged. crates/ixvm-codegen/src/aiur_ixvm.rs regenerated.
@johnchandlerburnham
johnchandlerburnham merged commit d9313cd into mainJul 21, 2026
10 checks passed
@johnchandlerburnham
johnchandlerburnham deleted the ap/ixvm-kernel-perf branch July 21, 2026 14:44
Sign up for freeto 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.

3 participants

@arthurpaulino@johnchandlerburnham@samuelburnham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal - #505

Merged
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf
Jul 21, 2026
Merged

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal#505
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf

Conversation

@arthurpaulino

Copy link
Copy Markdown
Member

Selective port of the IxVM-side commits from sb/aiur-perf, adapted to
current main (post-#450/#457) and re-measured. Every candidate was
benchmarked before acceptance; patches that regressed FFT cost or bought
too little for their trace-width cost were dropped (details below).

Commits

  1. Drop dead KValNode/KVal/KValEnv (f4d87d0)
    Leftover NbE value-domain types with no remaining references.

  2. Memoized prim_family dispatch + width-safe offset-stuck placement
    (bbd05c4)
    prim_family(addr) classifies a Const-head address into the one
    reducer family that could fire (nat/str/bitvec/native/decidable —
    the address sets are disjoint), memoized per distinct address, so
    whnf_const_head calls at most one family reducer instead of running
    the 5-reducer gauntlet. The symbolic-Nat offset-stuck check moves from
    a delta-arm probe into try_nat_dispatch's miss path (verdict 2 =
    "already stuck, do not re-whnf"), where the whnf'd args already exist.
    Nat-literal majors expose one constructor layer via
    nat_lit_to_ctor_or_self instead of materializing succ chains.

    Adaptations vs the original patch: whnf_nd_const_head (no-delta
    WHNF, added on main after the patch) converted to the same family
    dispatch; main's cold-extracted try_nat_binop_dispatch kept, with
    the symbolic-base case routed to try_nat_offset_dispatch from its
    miss arm.

  3. H-14: ptr_val skip map + lockstep addr cursor (d42865c,
    originally John C. Burnham's jcb/fixes)
    check_all_skipping keys the assumption-leaf skip set on ptr_val
    (sound by the interning invariant; a de-interned pointer reads as
    absent and the constant just gets checked — fail-closed) and walks
    addrs in lockstep with consts instead of list_lookup(addrs, pos)
    per constant, which was a standalone O(closure²). addr_key is
    retained for the Inductive.lean block-membership table.

Measurements

lake exe ix check Nat.add_comm, cumulative vs main:

metricmainthis PRΔ
total trace width34,82034,781−39
FFT cost (add_comm)49,571,21048,860,647−1.43%

All 53 pinned targets in Tests/Ix/IxVM.lean decreased
(−0.19%..−1.43%); pins updated in the same commit as the change. Full
lake test -- --ignored ixvm suite green (kernel checks, codegen/bytecode
parity, claim smokes including the frontier-assumption path, arena).
crates/ixvm-codegen regenerated per commit; clippy clean.

Dropped after measurement

  • 4940b9f (inline lbr guards on expr_inst1_walk App children):
    regressed every pin on current main (+1.1% on the heavy targets). It
    was measured pre-IxVM kernel: unblock UTF-8 decode/encode proof + Nat-layer FFT cuts #450; main's cold-extracted BVar/Let arms and the
    expr_inst1 lbr fast path already capture the saving, so the App-arm
    guards only added per-row width.
  • fbedfc8 (idx-keyed projection-definition classification): +61 total
    width for −0.28% FFT on its best-case constant
    (Int8.instRxcHasSize_eq). Width taxes proof size and recursive
    verification on every proof; the FFT win is workload-dependent. A
    width-neutral variant (keep the proj_def_info_of split, drop the
    is_proj_def caller gate) is worth revisiting if the SInt/UTF-8
    instance class shows up in real workloads.
  • H-12 output caps on pow/shiftLeft (from the Rust-side branch): not
    a soundness gate — capped results stay stuck, which can only reject,
    never wrongly accept. It is prover-side DoS protection, and compute is
    the prover's concern in a zkVM deployment. Note the resulting
    divergence: the Rust kernel caps, IxVM does not, so the Rust kernel
    rejects some huge-arithmetic terms IxVM accepts (benign when Rust is
    used as a conservative preflight).
  • b9827d4 and b86c632 were already on main (IxVM kernel: canonical level normalization + FFT-cost pinning #447, feat: Add SP1 and Zisk kernel proving backends #411/IxVM: native execution pipeline #463).

From ap/kernel 828fb85 (Arthur Paulino): the NbE value domain is defined
but referenced nowhere — the live kernel runs on de-Bruijn KExpr;
vestigial from an abandoned NbE direction. (The closed-term context
normalization from that commit was measured separately and not taken:
the per-call expr_lbr probe cost +2.9% FFT on recursor loops for a 0.5%
record reduction.)
Three coordinated changes to Const-head whnf dispatch (cherry-pick of
130f30b, adapted to post-#450/#457 main):
1. prim_family(addr) classifies a head address into the one reducer
family that could fire on it (nat/str/bitvec/native/decidable; the
sets are disjoint). Keyed on the ADDRESS ALONE it memoizes to one row
per distinct constant address per run, and whnf_const_head calls at
most one family reducer. The previous gauntlet ran every reducer in
sequence for guaranteed misses.
2. The symbolic-Nat offset-stuck check moves from a delta-arm probe into
try_nat_dispatch's miss path as a cold function
(try_nat_offset_dispatch, verdict 2 = "already stuck, do not
re-whnf"), with the offset construction shared via
mk_nat_offset_stuck (also used by the linear-rec collapse).
3. nat_lit_to_ctor_or_self exposes ONE constructor layer
(n -> succ(Lit(n-1))) instead of materializing the full succ chain.
Adaptations vs the original patch:
- whnf_nd_const_head (no-delta WHNF, added on main after the patch)
converted to the same family dispatch.
- Kept main's cold-extracted try_nat_binop_dispatch and routed the
symbolic-base case to try_nat_offset_dispatch from its miss arm.
Measured (lake exe ix check Nat.add_comm): total width 34820 -> 34806,
FFT cost 49571210 -> 48860647 (-1.43%). All 53 ixvm-suite FFT pins
decreased (-0.19%..-1.43%); parity and claim smokes pass. Pins updated;
crates/ixvm-codegen/src/aiur_ixvm.rs regenerated via `lake exe ix
codegen`.
Two quadratic/constant-factor fixes to check_all_skipping, ported from
jcb/fixes (3763356, John C. Burnham); cherry-pick of 2d83be1 adapted to
post-#457 main:
- The assumption-leaf skip set keys on ptr_val instead of the first 4
address bytes: one tree lookup per constant, no per-lookup address
load, no confirming address_eq. Sound by the build_addr_pos_map
interning invariant (one pointer, one content): a ptr hit implies the
address IS a leaf; a de-interned pointer reads as absent and the
constant just gets checked — fail-closed.
- The iterator walks the addrs list in LOCKSTEP with consts (cur_addrs
suffix) instead of list_lookup(addrs, pos) per constant, which
re-walked the prefix every iteration — a standalone O(closure^2).
Adaptations: kept main's two-arg check_canonical_block_sort call;
addr_key retained (the Inductive.lean block-membership table added on
main after this patch still uses it), comment updated.
Measured (lake exe ix check Nat.add_comm): total width 34806 -> 34781,
FFT cost unchanged (plain checks never take the skip path). Full ixvm
suite green incl. the frontier-assumption claim smoke; all FFT pins
unchanged. crates/ixvm-codegen/src/aiur_ixvm.rs regenerated.
@johnchandlerburnham
johnchandlerburnham merged commit d9313cd into mainJul 21, 2026
10 checks passed
@johnchandlerburnham
johnchandlerburnham deleted the ap/ixvm-kernel-perf branch July 21, 2026 14:44
Sign up for freeto 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.

3 participants

@arthurpaulino@johnchandlerburnham@samuelburnham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal - #505

Merged
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf
Jul 21, 2026
Merged

IxVM kernel: prim_family dispatch, H-14 skip map, dead-code removal#505
johnchandlerburnham merged 3 commits into
mainfrom
ap/ixvm-kernel-perf

Conversation

@arthurpaulino

Copy link
Copy Markdown
Member

Selective port of the IxVM-side commits from sb/aiur-perf, adapted to
current main (post-#450/#457) and re-measured. Every candidate was
benchmarked before acceptance; patches that regressed FFT cost or bought
too little for their trace-width cost were dropped (details below).

Commits

  1. Drop dead KValNode/KVal/KValEnv (f4d87d0)
    Leftover NbE value-domain types with no remaining references.

  2. Memoized prim_family dispatch + width-safe offset-stuck placement
    (bbd05c4)
    prim_family(addr) classifies a Const-head address into the one
    reducer family that could fire (nat/str/bitvec/native/decidable —
    the address sets are disjoint), memoized per distinct address, so
    whnf_const_head calls at most one family reducer instead of running
    the 5-reducer gauntlet. The symbolic-Nat offset-stuck check moves from
    a delta-arm probe into try_nat_dispatch's miss path (verdict 2 =
    "already stuck, do not re-whnf"), where the whnf'd args already exist.
    Nat-literal majors expose one constructor layer via
    nat_lit_to_ctor_or_self instead of materializing succ chains.

    Adaptations vs the original patch: whnf_nd_const_head (no-delta
    WHNF, added on main after the patch) converted to the same family
    dispatch; main's cold-extracted try_nat_binop_dispatch kept, with
    the symbolic-base case routed to try_nat_offset_dispatch from its
    miss arm.

  3. H-14: ptr_val skip map + lockstep addr cursor (d42865c,
    originally John C. Burnham's jcb/fixes)
    check_all_skipping keys the assumption-leaf skip set on ptr_val
    (sound by the interning invariant; a de-interned pointer reads as
    absent and the constant just gets checked — fail-closed) and walks
    addrs in lockstep with consts instead of list_lookup(addrs, pos)
    per constant, which was a standalone O(closure²). addr_key is
    retained for the Inductive.lean block-membership table.

Measurements

lake exe ix check Nat.add_comm, cumulative vs main:

metricmainthis PRΔ
total trace width34,82034,781−39
FFT cost (add_comm)49,571,21048,860,647−1.43%

All 53 pinned targets in Tests/Ix/IxVM.lean decreased
(−0.19%..−1.43%); pins updated in the same commit as the change. Full
lake test -- --ignored ixvm suite green (kernel checks, codegen/bytecode
parity, claim smokes including the frontier-assumption path, arena).
crates/ixvm-codegen regenerated per commit; clippy clean.

Dropped after measurement

  • 4940b9f (inline lbr guards on expr_inst1_walk App children):
    regressed every pin on current main (+1.1% on the heavy targets). It
    was measured pre-IxVM kernel: unblock UTF-8 decode/encode proof + Nat-layer FFT cuts #450; main's cold-extracted BVar/Let arms and the
    expr_inst1 lbr fast path already capture the saving, so the App-arm
    guards only added per-row width.
  • fbedfc8 (idx-keyed projection-definition classification): +61 total
    width for −0.28% FFT on its best-case constant
    (Int8.instRxcHasSize_eq). Width taxes proof size and recursive
    verification on every proof; the FFT win is workload-dependent. A
    width-neutral variant (keep the proj_def_info_of split, drop the
    is_proj_def caller gate) is worth revisiting if the SInt/UTF-8
    instance class shows up in real workloads.
  • H-12 output caps on pow/shiftLeft (from the Rust-side branch): not
    a soundness gate — capped results stay stuck, which can only reject,
    never wrongly accept. It is prover-side DoS protection, and compute is
    the prover's concern in a zkVM deployment. Note the resulting
    divergence: the Rust kernel caps, IxVM does not, so the Rust kernel
    rejects some huge-arithmetic terms IxVM accepts (benign when Rust is
    used as a conservative preflight).
  • b9827d4 and b86c632 were already on main (IxVM kernel: canonical level normalization + FFT-cost pinning #447, feat: Add SP1 and Zisk kernel proving backends #411/IxVM: native execution pipeline #463).

From ap/kernel 828fb85 (Arthur Paulino): the NbE value domain is defined
but referenced nowhere — the live kernel runs on de-Bruijn KExpr;
vestigial from an abandoned NbE direction. (The closed-term context
normalization from that commit was measured separately and not taken:
the per-call expr_lbr probe cost +2.9% FFT on recursor loops for a 0.5%
record reduction.)
Three coordinated changes to Const-head whnf dispatch (cherry-pick of
130f30b, adapted to post-#450/#457 main):
1. prim_family(addr) classifies a head address into the one reducer
family that could fire on it (nat/str/bitvec/native/decidable; the
sets are disjoint). Keyed on the ADDRESS ALONE it memoizes to one row
per distinct constant address per run, and whnf_const_head calls at
most one family reducer. The previous gauntlet ran every reducer in
sequence for guaranteed misses.
2. The symbolic-Nat offset-stuck check moves from a delta-arm probe into
try_nat_dispatch's miss path as a cold function
(try_nat_offset_dispatch, verdict 2 = "already stuck, do not
re-whnf"), with the offset construction shared via
mk_nat_offset_stuck (also used by the linear-rec collapse).
3. nat_lit_to_ctor_or_self exposes ONE constructor layer
(n -> succ(Lit(n-1))) instead of materializing the full succ chain.
Adaptations vs the original patch:
- whnf_nd_const_head (no-delta WHNF, added on main after the patch)
converted to the same family dispatch.
- Kept main's cold-extracted try_nat_binop_dispatch and routed the
symbolic-base case to try_nat_offset_dispatch from its miss arm.
Measured (lake exe ix check Nat.add_comm): total width 34820 -> 34806,
FFT cost 49571210 -> 48860647 (-1.43%). All 53 ixvm-suite FFT pins
decreased (-0.19%..-1.43%); parity and claim smokes pass. Pins updated;
crates/ixvm-codegen/src/aiur_ixvm.rs regenerated via `lake exe ix
codegen`.
Two quadratic/constant-factor fixes to check_all_skipping, ported from
jcb/fixes (3763356, John C. Burnham); cherry-pick of 2d83be1 adapted to
post-#457 main:
- The assumption-leaf skip set keys on ptr_val instead of the first 4
address bytes: one tree lookup per constant, no per-lookup address
load, no confirming address_eq. Sound by the build_addr_pos_map
interning invariant (one pointer, one content): a ptr hit implies the
address IS a leaf; a de-interned pointer reads as absent and the
constant just gets checked — fail-closed.
- The iterator walks the addrs list in LOCKSTEP with consts (cur_addrs
suffix) instead of list_lookup(addrs, pos) per constant, which
re-walked the prefix every iteration — a standalone O(closure^2).
Adaptations: kept main's two-arg check_canonical_block_sort call;
addr_key retained (the Inductive.lean block-membership table added on
main after this patch still uses it), comment updated.
Measured (lake exe ix check Nat.add_comm): total width 34806 -> 34781,
FFT cost unchanged (plain checks never take the skip path). Full ixvm
suite green incl. the frontier-assumption claim smoke; all FFT pins
unchanged. crates/ixvm-codegen/src/aiur_ixvm.rs regenerated.
@johnchandlerburnham
johnchandlerburnham merged commit d9313cd into mainJul 21, 2026
10 checks passed
@johnchandlerburnham
johnchandlerburnham deleted the ap/ixvm-kernel-perf branch July 21, 2026 14:44
Sign up for freeto 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.

3 participants

@arthurpaulino@johnchandlerburnham@samuelburnham