refactor: single-source reducibility hints in Env::anon_hints - #489

Merged
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints
Jul 13, 2026
Merged

refactor: single-source reducibility hints in Env::anon_hints#489
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints

Conversation

@samuelburnham

Copy link
Copy Markdown
Member

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI constructor slots, and the .ixe named-section encoding). Reducibility hints now live only in the env-level anon_hints map, keyed by constant address.

  • The compiler is the sole producer: compile_definition records each definition's hints per name (CompileState::def_hints), and finalize_hints resolves them through the registered Named entries into env.anon_hints via Env::register_hint once addresses are final. The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints) does the same. Alias collisions merge order-independently (min by (tag, height)), so parallel workers and both mirrors agree byte-for-byte.
  • Writers serialize the map directly; the derive-from-Named fallback is deleted from Env::put / put_file / serialized_size_breakdown and both Lean writers. This removes the serial full-decode of every demoted Named entry that regressed ix compile by 5-14%: the derivation loop called Named::meta() per entry, which re-decodes demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
  • Kernel ingress reads hints from anon_hints in both anon and meta modes; the hints_override parameter threading is gone. Decompile (both languages) and the IxVM claim harness look hints up by address. The lazy check path transports the hints section on RawEnvLazy instead of fabricating per-name Def metas (RawNamedLite.toConstMeta is removed).
  • anon_hints becomes an IxonMap like the other env maps; Env now derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing the manual per-map Clone impl).

Format change (pre-alpha, no compat shims): Def metadata loses its hints byte in the named sections, so every hint is stored once instead of two or three times (hints section + named meta + aux originals) — the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the derivation code), with byte-exact Lean/Rust writer parity at 505,674,085 bytes on the whole-stdlib env.

Behavior note: a hint-only change now reports as a pure hintsChanged row in ix diff; it previously also surfaced as a Def metadata diff.

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

❌ benchmark run failed

Workflow logs

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5c619ba

backends: compile · envs: InitStd,Lean,FLT,Mathlib · set: primary · shard: 0

compile · FLT — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
FLT46.252 s44.438 s-3.9% 🟢11.04K11.49K+4.1% 🟢12.39 GiB12.39 GiB-0.0%1.72 GiB1.72 GiB-0.0%510,687510,687+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · InitStd — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStd4.356 s4.019 s-7.7% (1.08× faster) 🟢24.22K26.25K+8.4% (1.08× faster) 🟢3.67 GiB3.70 GiB+0.7%309.16 MiB309.05 MiB-0.0%105,492105,492+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Lean — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Lean7.539 s7.309 s-3.1% 🟢25.07K25.86K+3.1% 🟢4.90 GiB4.93 GiB+0.6%462.76 MiB462.55 MiB-0.0%188,999188,999+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Mathlib — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Mathlib52.618 s45.647 s-13.2% (1.15× faster) 🟢14.00K16.14K+15.3% (1.15× faster) 🟢18.27 GiB18.44 GiB+0.9%2.99 GiB2.99 GiB-0.0%736,618736,618+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 13, 2026 20:44
@samuelburnham
samuelburnham merged commit 46a7673 into jcb/ixe-improvementsJul 13, 2026
14 of 15 checks passed
@samuelburnham
samuelburnham deleted the sb/anon-hints branch July 13, 2026 21:13
samuelburnham added a commit that referenced this pull request Jul 13, 2026
Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
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.

1 participant

@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

refactor: single-source reducibility hints in Env::anon_hints - #489

Merged
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints
Jul 13, 2026
Merged

refactor: single-source reducibility hints in Env::anon_hints#489
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints

Conversation

@samuelburnham

Copy link
Copy Markdown
Member

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI constructor slots, and the .ixe named-section encoding). Reducibility hints now live only in the env-level anon_hints map, keyed by constant address.

  • The compiler is the sole producer: compile_definition records each definition's hints per name (CompileState::def_hints), and finalize_hints resolves them through the registered Named entries into env.anon_hints via Env::register_hint once addresses are final. The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints) does the same. Alias collisions merge order-independently (min by (tag, height)), so parallel workers and both mirrors agree byte-for-byte.
  • Writers serialize the map directly; the derive-from-Named fallback is deleted from Env::put / put_file / serialized_size_breakdown and both Lean writers. This removes the serial full-decode of every demoted Named entry that regressed ix compile by 5-14%: the derivation loop called Named::meta() per entry, which re-decodes demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
  • Kernel ingress reads hints from anon_hints in both anon and meta modes; the hints_override parameter threading is gone. Decompile (both languages) and the IxVM claim harness look hints up by address. The lazy check path transports the hints section on RawEnvLazy instead of fabricating per-name Def metas (RawNamedLite.toConstMeta is removed).
  • anon_hints becomes an IxonMap like the other env maps; Env now derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing the manual per-map Clone impl).

Format change (pre-alpha, no compat shims): Def metadata loses its hints byte in the named sections, so every hint is stored once instead of two or three times (hints section + named meta + aux originals) — the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the derivation code), with byte-exact Lean/Rust writer parity at 505,674,085 bytes on the whole-stdlib env.

Behavior note: a hint-only change now reports as a pure hintsChanged row in ix diff; it previously also surfaced as a Def metadata diff.

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

❌ benchmark run failed

Workflow logs

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5c619ba

backends: compile · envs: InitStd,Lean,FLT,Mathlib · set: primary · shard: 0

compile · FLT — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
FLT46.252 s44.438 s-3.9% 🟢11.04K11.49K+4.1% 🟢12.39 GiB12.39 GiB-0.0%1.72 GiB1.72 GiB-0.0%510,687510,687+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · InitStd — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStd4.356 s4.019 s-7.7% (1.08× faster) 🟢24.22K26.25K+8.4% (1.08× faster) 🟢3.67 GiB3.70 GiB+0.7%309.16 MiB309.05 MiB-0.0%105,492105,492+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Lean — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Lean7.539 s7.309 s-3.1% 🟢25.07K25.86K+3.1% 🟢4.90 GiB4.93 GiB+0.6%462.76 MiB462.55 MiB-0.0%188,999188,999+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Mathlib — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Mathlib52.618 s45.647 s-13.2% (1.15× faster) 🟢14.00K16.14K+15.3% (1.15× faster) 🟢18.27 GiB18.44 GiB+0.9%2.99 GiB2.99 GiB-0.0%736,618736,618+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 13, 2026 20:44
@samuelburnham
samuelburnham merged commit 46a7673 into jcb/ixe-improvementsJul 13, 2026
14 of 15 checks passed
@samuelburnham
samuelburnham deleted the sb/anon-hints branch July 13, 2026 21:13
samuelburnham added a commit that referenced this pull request Jul 13, 2026
Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
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.

1 participant

@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

refactor: single-source reducibility hints in Env::anon_hints - #489

Merged
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints
Jul 13, 2026
Merged

refactor: single-source reducibility hints in Env::anon_hints#489
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints

Conversation

@samuelburnham

Copy link
Copy Markdown
Member

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI constructor slots, and the .ixe named-section encoding). Reducibility hints now live only in the env-level anon_hints map, keyed by constant address.

  • The compiler is the sole producer: compile_definition records each definition's hints per name (CompileState::def_hints), and finalize_hints resolves them through the registered Named entries into env.anon_hints via Env::register_hint once addresses are final. The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints) does the same. Alias collisions merge order-independently (min by (tag, height)), so parallel workers and both mirrors agree byte-for-byte.
  • Writers serialize the map directly; the derive-from-Named fallback is deleted from Env::put / put_file / serialized_size_breakdown and both Lean writers. This removes the serial full-decode of every demoted Named entry that regressed ix compile by 5-14%: the derivation loop called Named::meta() per entry, which re-decodes demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
  • Kernel ingress reads hints from anon_hints in both anon and meta modes; the hints_override parameter threading is gone. Decompile (both languages) and the IxVM claim harness look hints up by address. The lazy check path transports the hints section on RawEnvLazy instead of fabricating per-name Def metas (RawNamedLite.toConstMeta is removed).
  • anon_hints becomes an IxonMap like the other env maps; Env now derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing the manual per-map Clone impl).

Format change (pre-alpha, no compat shims): Def metadata loses its hints byte in the named sections, so every hint is stored once instead of two or three times (hints section + named meta + aux originals) — the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the derivation code), with byte-exact Lean/Rust writer parity at 505,674,085 bytes on the whole-stdlib env.

Behavior note: a hint-only change now reports as a pure hintsChanged row in ix diff; it previously also surfaced as a Def metadata diff.

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

❌ benchmark run failed

Workflow logs

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5c619ba

backends: compile · envs: InitStd,Lean,FLT,Mathlib · set: primary · shard: 0

compile · FLT — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
FLT46.252 s44.438 s-3.9% 🟢11.04K11.49K+4.1% 🟢12.39 GiB12.39 GiB-0.0%1.72 GiB1.72 GiB-0.0%510,687510,687+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · InitStd — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStd4.356 s4.019 s-7.7% (1.08× faster) 🟢24.22K26.25K+8.4% (1.08× faster) 🟢3.67 GiB3.70 GiB+0.7%309.16 MiB309.05 MiB-0.0%105,492105,492+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Lean — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Lean7.539 s7.309 s-3.1% 🟢25.07K25.86K+3.1% 🟢4.90 GiB4.93 GiB+0.6%462.76 MiB462.55 MiB-0.0%188,999188,999+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Mathlib — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Mathlib52.618 s45.647 s-13.2% (1.15× faster) 🟢14.00K16.14K+15.3% (1.15× faster) 🟢18.27 GiB18.44 GiB+0.9%2.99 GiB2.99 GiB-0.0%736,618736,618+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 13, 2026 20:44
@samuelburnham
samuelburnham merged commit 46a7673 into jcb/ixe-improvementsJul 13, 2026
14 of 15 checks passed
@samuelburnham
samuelburnham deleted the sb/anon-hints branch July 13, 2026 21:13
samuelburnham added a commit that referenced this pull request Jul 13, 2026
Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
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.

1 participant

@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

refactor: single-source reducibility hints in Env::anon_hints - #489

Merged
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints
Jul 13, 2026
Merged

refactor: single-source reducibility hints in Env::anon_hints#489
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints

Conversation

@samuelburnham

Copy link
Copy Markdown
Member

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI constructor slots, and the .ixe named-section encoding). Reducibility hints now live only in the env-level anon_hints map, keyed by constant address.

  • The compiler is the sole producer: compile_definition records each definition's hints per name (CompileState::def_hints), and finalize_hints resolves them through the registered Named entries into env.anon_hints via Env::register_hint once addresses are final. The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints) does the same. Alias collisions merge order-independently (min by (tag, height)), so parallel workers and both mirrors agree byte-for-byte.
  • Writers serialize the map directly; the derive-from-Named fallback is deleted from Env::put / put_file / serialized_size_breakdown and both Lean writers. This removes the serial full-decode of every demoted Named entry that regressed ix compile by 5-14%: the derivation loop called Named::meta() per entry, which re-decodes demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
  • Kernel ingress reads hints from anon_hints in both anon and meta modes; the hints_override parameter threading is gone. Decompile (both languages) and the IxVM claim harness look hints up by address. The lazy check path transports the hints section on RawEnvLazy instead of fabricating per-name Def metas (RawNamedLite.toConstMeta is removed).
  • anon_hints becomes an IxonMap like the other env maps; Env now derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing the manual per-map Clone impl).

Format change (pre-alpha, no compat shims): Def metadata loses its hints byte in the named sections, so every hint is stored once instead of two or three times (hints section + named meta + aux originals) — the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the derivation code), with byte-exact Lean/Rust writer parity at 505,674,085 bytes on the whole-stdlib env.

Behavior note: a hint-only change now reports as a pure hintsChanged row in ix diff; it previously also surfaced as a Def metadata diff.

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

❌ benchmark run failed

Workflow logs

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5c619ba

backends: compile · envs: InitStd,Lean,FLT,Mathlib · set: primary · shard: 0

compile · FLT — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
FLT46.252 s44.438 s-3.9% 🟢11.04K11.49K+4.1% 🟢12.39 GiB12.39 GiB-0.0%1.72 GiB1.72 GiB-0.0%510,687510,687+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · InitStd — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStd4.356 s4.019 s-7.7% (1.08× faster) 🟢24.22K26.25K+8.4% (1.08× faster) 🟢3.67 GiB3.70 GiB+0.7%309.16 MiB309.05 MiB-0.0%105,492105,492+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Lean — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Lean7.539 s7.309 s-3.1% 🟢25.07K25.86K+3.1% 🟢4.90 GiB4.93 GiB+0.6%462.76 MiB462.55 MiB-0.0%188,999188,999+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Mathlib — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Mathlib52.618 s45.647 s-13.2% (1.15× faster) 🟢14.00K16.14K+15.3% (1.15× faster) 🟢18.27 GiB18.44 GiB+0.9%2.99 GiB2.99 GiB-0.0%736,618736,618+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 13, 2026 20:44
@samuelburnham
samuelburnham merged commit 46a7673 into jcb/ixe-improvementsJul 13, 2026
14 of 15 checks passed
@samuelburnham
samuelburnham deleted the sb/anon-hints branch July 13, 2026 21:13
samuelburnham added a commit that referenced this pull request Jul 13, 2026
Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
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.

1 participant

@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

refactor: single-source reducibility hints in Env::anon_hints - #489

Merged
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints
Jul 13, 2026
Merged

refactor: single-source reducibility hints in Env::anon_hints#489
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints

Conversation

@samuelburnham

Copy link
Copy Markdown
Member

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI constructor slots, and the .ixe named-section encoding). Reducibility hints now live only in the env-level anon_hints map, keyed by constant address.

  • The compiler is the sole producer: compile_definition records each definition's hints per name (CompileState::def_hints), and finalize_hints resolves them through the registered Named entries into env.anon_hints via Env::register_hint once addresses are final. The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints) does the same. Alias collisions merge order-independently (min by (tag, height)), so parallel workers and both mirrors agree byte-for-byte.
  • Writers serialize the map directly; the derive-from-Named fallback is deleted from Env::put / put_file / serialized_size_breakdown and both Lean writers. This removes the serial full-decode of every demoted Named entry that regressed ix compile by 5-14%: the derivation loop called Named::meta() per entry, which re-decodes demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
  • Kernel ingress reads hints from anon_hints in both anon and meta modes; the hints_override parameter threading is gone. Decompile (both languages) and the IxVM claim harness look hints up by address. The lazy check path transports the hints section on RawEnvLazy instead of fabricating per-name Def metas (RawNamedLite.toConstMeta is removed).
  • anon_hints becomes an IxonMap like the other env maps; Env now derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing the manual per-map Clone impl).

Format change (pre-alpha, no compat shims): Def metadata loses its hints byte in the named sections, so every hint is stored once instead of two or three times (hints section + named meta + aux originals) — the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the derivation code), with byte-exact Lean/Rust writer parity at 505,674,085 bytes on the whole-stdlib env.

Behavior note: a hint-only change now reports as a pure hintsChanged row in ix diff; it previously also surfaced as a Def metadata diff.

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

❌ benchmark run failed

Workflow logs

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5c619ba

backends: compile · envs: InitStd,Lean,FLT,Mathlib · set: primary · shard: 0

compile · FLT — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
FLT46.252 s44.438 s-3.9% 🟢11.04K11.49K+4.1% 🟢12.39 GiB12.39 GiB-0.0%1.72 GiB1.72 GiB-0.0%510,687510,687+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · InitStd — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStd4.356 s4.019 s-7.7% (1.08× faster) 🟢24.22K26.25K+8.4% (1.08× faster) 🟢3.67 GiB3.70 GiB+0.7%309.16 MiB309.05 MiB-0.0%105,492105,492+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Lean — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Lean7.539 s7.309 s-3.1% 🟢25.07K25.86K+3.1% 🟢4.90 GiB4.93 GiB+0.6%462.76 MiB462.55 MiB-0.0%188,999188,999+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Mathlib — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Mathlib52.618 s45.647 s-13.2% (1.15× faster) 🟢14.00K16.14K+15.3% (1.15× faster) 🟢18.27 GiB18.44 GiB+0.9%2.99 GiB2.99 GiB-0.0%736,618736,618+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 13, 2026 20:44
@samuelburnham
samuelburnham merged commit 46a7673 into jcb/ixe-improvementsJul 13, 2026
14 of 15 checks passed
@samuelburnham
samuelburnham deleted the sb/anon-hints branch July 13, 2026 21:13
samuelburnham added a commit that referenced this pull request Jul 13, 2026
Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
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.

1 participant

@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

refactor: single-source reducibility hints in Env::anon_hints - #489

Merged
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints
Jul 13, 2026
Merged

refactor: single-source reducibility hints in Env::anon_hints#489
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints

Conversation

@samuelburnham

Copy link
Copy Markdown
Member

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI constructor slots, and the .ixe named-section encoding). Reducibility hints now live only in the env-level anon_hints map, keyed by constant address.

  • The compiler is the sole producer: compile_definition records each definition's hints per name (CompileState::def_hints), and finalize_hints resolves them through the registered Named entries into env.anon_hints via Env::register_hint once addresses are final. The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints) does the same. Alias collisions merge order-independently (min by (tag, height)), so parallel workers and both mirrors agree byte-for-byte.
  • Writers serialize the map directly; the derive-from-Named fallback is deleted from Env::put / put_file / serialized_size_breakdown and both Lean writers. This removes the serial full-decode of every demoted Named entry that regressed ix compile by 5-14%: the derivation loop called Named::meta() per entry, which re-decodes demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
  • Kernel ingress reads hints from anon_hints in both anon and meta modes; the hints_override parameter threading is gone. Decompile (both languages) and the IxVM claim harness look hints up by address. The lazy check path transports the hints section on RawEnvLazy instead of fabricating per-name Def metas (RawNamedLite.toConstMeta is removed).
  • anon_hints becomes an IxonMap like the other env maps; Env now derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing the manual per-map Clone impl).

Format change (pre-alpha, no compat shims): Def metadata loses its hints byte in the named sections, so every hint is stored once instead of two or three times (hints section + named meta + aux originals) — the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the derivation code), with byte-exact Lean/Rust writer parity at 505,674,085 bytes on the whole-stdlib env.

Behavior note: a hint-only change now reports as a pure hintsChanged row in ix diff; it previously also surfaced as a Def metadata diff.

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

❌ benchmark run failed

Workflow logs

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5c619ba

backends: compile · envs: InitStd,Lean,FLT,Mathlib · set: primary · shard: 0

compile · FLT — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
FLT46.252 s44.438 s-3.9% 🟢11.04K11.49K+4.1% 🟢12.39 GiB12.39 GiB-0.0%1.72 GiB1.72 GiB-0.0%510,687510,687+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · InitStd — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStd4.356 s4.019 s-7.7% (1.08× faster) 🟢24.22K26.25K+8.4% (1.08× faster) 🟢3.67 GiB3.70 GiB+0.7%309.16 MiB309.05 MiB-0.0%105,492105,492+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Lean — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Lean7.539 s7.309 s-3.1% 🟢25.07K25.86K+3.1% 🟢4.90 GiB4.93 GiB+0.6%462.76 MiB462.55 MiB-0.0%188,999188,999+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Mathlib — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Mathlib52.618 s45.647 s-13.2% (1.15× faster) 🟢14.00K16.14K+15.3% (1.15× faster) 🟢18.27 GiB18.44 GiB+0.9%2.99 GiB2.99 GiB-0.0%736,618736,618+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 13, 2026 20:44
@samuelburnham
samuelburnham merged commit 46a7673 into jcb/ixe-improvementsJul 13, 2026
14 of 15 checks passed
@samuelburnham
samuelburnham deleted the sb/anon-hints branch July 13, 2026 21:13
samuelburnham added a commit that referenced this pull request Jul 13, 2026
Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
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.

1 participant

@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

refactor: single-source reducibility hints in Env::anon_hints - #489

Merged
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints
Jul 13, 2026
Merged

refactor: single-source reducibility hints in Env::anon_hints#489
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints

Conversation

@samuelburnham

Copy link
Copy Markdown
Member

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI constructor slots, and the .ixe named-section encoding). Reducibility hints now live only in the env-level anon_hints map, keyed by constant address.

  • The compiler is the sole producer: compile_definition records each definition's hints per name (CompileState::def_hints), and finalize_hints resolves them through the registered Named entries into env.anon_hints via Env::register_hint once addresses are final. The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints) does the same. Alias collisions merge order-independently (min by (tag, height)), so parallel workers and both mirrors agree byte-for-byte.
  • Writers serialize the map directly; the derive-from-Named fallback is deleted from Env::put / put_file / serialized_size_breakdown and both Lean writers. This removes the serial full-decode of every demoted Named entry that regressed ix compile by 5-14%: the derivation loop called Named::meta() per entry, which re-decodes demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
  • Kernel ingress reads hints from anon_hints in both anon and meta modes; the hints_override parameter threading is gone. Decompile (both languages) and the IxVM claim harness look hints up by address. The lazy check path transports the hints section on RawEnvLazy instead of fabricating per-name Def metas (RawNamedLite.toConstMeta is removed).
  • anon_hints becomes an IxonMap like the other env maps; Env now derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing the manual per-map Clone impl).

Format change (pre-alpha, no compat shims): Def metadata loses its hints byte in the named sections, so every hint is stored once instead of two or three times (hints section + named meta + aux originals) — the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the derivation code), with byte-exact Lean/Rust writer parity at 505,674,085 bytes on the whole-stdlib env.

Behavior note: a hint-only change now reports as a pure hintsChanged row in ix diff; it previously also surfaced as a Def metadata diff.

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

❌ benchmark run failed

Workflow logs

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5c619ba

backends: compile · envs: InitStd,Lean,FLT,Mathlib · set: primary · shard: 0

compile · FLT — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
FLT46.252 s44.438 s-3.9% 🟢11.04K11.49K+4.1% 🟢12.39 GiB12.39 GiB-0.0%1.72 GiB1.72 GiB-0.0%510,687510,687+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · InitStd — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStd4.356 s4.019 s-7.7% (1.08× faster) 🟢24.22K26.25K+8.4% (1.08× faster) 🟢3.67 GiB3.70 GiB+0.7%309.16 MiB309.05 MiB-0.0%105,492105,492+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Lean — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Lean7.539 s7.309 s-3.1% 🟢25.07K25.86K+3.1% 🟢4.90 GiB4.93 GiB+0.6%462.76 MiB462.55 MiB-0.0%188,999188,999+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Mathlib — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Mathlib52.618 s45.647 s-13.2% (1.15× faster) 🟢14.00K16.14K+15.3% (1.15× faster) 🟢18.27 GiB18.44 GiB+0.9%2.99 GiB2.99 GiB-0.0%736,618736,618+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 13, 2026 20:44
@samuelburnham
samuelburnham merged commit 46a7673 into jcb/ixe-improvementsJul 13, 2026
14 of 15 checks passed
@samuelburnham
samuelburnham deleted the sb/anon-hints branch July 13, 2026 21:13
samuelburnham added a commit that referenced this pull request Jul 13, 2026
Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
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.

1 participant

@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

refactor: single-source reducibility hints in Env::anon_hints - #489

Merged
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints
Jul 13, 2026
Merged

refactor: single-source reducibility hints in Env::anon_hints#489
samuelburnham merged 1 commit into
jcb/ixe-improvementsfrom
sb/anon-hints

Conversation

@samuelburnham

Copy link
Copy Markdown
Member

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI constructor slots, and the .ixe named-section encoding). Reducibility hints now live only in the env-level anon_hints map, keyed by constant address.

  • The compiler is the sole producer: compile_definition records each definition's hints per name (CompileState::def_hints), and finalize_hints resolves them through the registered Named entries into env.anon_hints via Env::register_hint once addresses are final. The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints) does the same. Alias collisions merge order-independently (min by (tag, height)), so parallel workers and both mirrors agree byte-for-byte.
  • Writers serialize the map directly; the derive-from-Named fallback is deleted from Env::put / put_file / serialized_size_breakdown and both Lean writers. This removes the serial full-decode of every demoted Named entry that regressed ix compile by 5-14%: the derivation loop called Named::meta() per entry, which re-decodes demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
  • Kernel ingress reads hints from anon_hints in both anon and meta modes; the hints_override parameter threading is gone. Decompile (both languages) and the IxVM claim harness look hints up by address. The lazy check path transports the hints section on RawEnvLazy instead of fabricating per-name Def metas (RawNamedLite.toConstMeta is removed).
  • anon_hints becomes an IxonMap like the other env maps; Env now derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing the manual per-map Clone impl).

Format change (pre-alpha, no compat shims): Def metadata loses its hints byte in the named sections, so every hint is stored once instead of two or three times (hints section + named meta + aux originals) — the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the derivation code), with byte-exact Lean/Rust writer parity at 505,674,085 bytes on the whole-stdlib env.

Behavior note: a hint-only change now reports as a pure hintsChanged row in ix diff; it previously also surfaced as a Def metadata diff.

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

❌ benchmark run failed

Workflow logs

Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!benchmark compile BENCH_ENVS=InitStd,Lean,FLT,Mathlib

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5c619ba

backends: compile · envs: InitStd,Lean,FLT,Mathlib · set: primary · shard: 0

compile · FLT — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
FLT46.252 s44.438 s-3.9% 🟢11.04K11.49K+4.1% 🟢12.39 GiB12.39 GiB-0.0%1.72 GiB1.72 GiB-0.0%510,687510,687+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · InitStd — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStd4.356 s4.019 s-7.7% (1.08× faster) 🟢24.22K26.25K+8.4% (1.08× faster) 🟢3.67 GiB3.70 GiB+0.7%309.16 MiB309.05 MiB-0.0%105,492105,492+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Lean — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Lean7.539 s7.309 s-3.1% 🟢25.07K25.86K+3.1% 🟢4.90 GiB4.93 GiB+0.6%462.76 MiB462.55 MiB-0.0%188,999188,999+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

compile · Mathlib — main from: base run @ 83867c8 (not on bencher)

envcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
Mathlib52.618 s45.647 s-13.2% (1.15× faster) 🟢14.00K16.14K+15.3% (1.15× faster) 🟢18.27 GiB18.44 GiB+0.9%2.99 GiB2.99 GiB-0.0%736,618736,618+0.0%

1 env · 0 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 13, 2026 20:44
@samuelburnham
samuelburnham merged commit 46a7673 into jcb/ixe-improvementsJul 13, 2026
14 of 15 checks passed
@samuelburnham
samuelburnham deleted the sb/anon-hints branch July 13, 2026 21:13
samuelburnham added a commit that referenced this pull request Jul 13, 2026
Remove the hints field from ConstantMeta::Def (Rust, Lean, the FFI
constructor slots, and the .ixe named-section encoding). Reducibility
hints now live only in the env-level anon_hints map, keyed by constant
address.
- The compiler is the sole producer: compile_definition records each
definition's hints per name (CompileState::def_hints), and
finalize_hints resolves them through the registered Named entries
into env.anon_hints via Env::register_hint once addresses are final.
The Lean compiler mirror (BlockState.defHints + Ixon.mergeHints)
does the same. Alias collisions merge order-independently (min by
(tag, height)), so parallel workers and both mirrors agree
byte-for-byte.
- Writers serialize the map directly; the derive-from-Named fallback
is deleted from Env::put / put_file / serialized_size_breakdown and
both Lean writers. This removes the serial full-decode of every
demoted Named entry that regressed ix compile by 5-14%: the
derivation loop called Named::meta() per entry, which re-decodes
demoted metadata (the IX_COMPILE_DEMOTE default) on every call.
- Kernel ingress reads hints from anon_hints in both anon and meta
modes; the hints_override parameter threading is gone. Decompile
(both languages) and the IxVM claim harness look hints up by
address. The lazy check path transports the hints section on
RawEnvLazy instead of fabricating per-name Def metas
(RawNamedLite.toConstMeta is removed).
- anon_hints becomes an IxonMap like the other env maps; Env now
derives Clone (the riscv64 IxonMap wrapper gained Clone, replacing
the manual per-map Clone impl).
Format change (pre-alpha, no compat shims): Def metadata loses its
hints byte in the named sections, so every hint is stored once instead
of two or three times (hints section + named meta + aux originals) —
the whole-stdlib env shrinks by ~232 KB. InitStd compile-time returns
to its pre-hints-section cost (median 7.3s -> 5.7s locally vs the
derivation code), with byte-exact Lean/Rust writer parity at
505,674,085 bytes on the whole-stdlib env.
Behavior note: a hint-only change now reports as a pure hintsChanged
row in ix diff; it previously also surfaced as a Def metadata diff.
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.

1 participant

@samuelburnham