jolt/test/integration
Yogthos c4be5d8a0e perf: hint-driven keyword-lookup guard elimination (^:struct)
A constant-keyword lookup (:k m) currently emits a guarded form,
(if (get m :jolt/type) (core-get m k) (get m k)), to tell a plain struct
(raw get is correct) from a phm/sorted/transient (needs core-get). On a
struct that guard is a second get, so the lookup costs ~36ns where a bare
get is ~20ns. Profiling the ray tracer (jolt-dad) showed keyword lookups are
~50% of a render and the guard is the only avoidable part, but dropping it
needs to know statically that the subject is a plain struct.

Type hints are exactly that information, and jolt already parses them and
otherwise ignores them. This wires one through: a local hinted ^:struct
asserts a plain struct/record map, so a (:k local) lookup on it skips the
guard and emits a bare get. The hint rides on the binding symbol into the
analyzer, which records it per-local and attaches it to :local IR nodes; the
back end reads it on the lookup subject. It also propagates through inlining:
when the inliner let-binds a non-trivial arg to a fresh local, it carries the
called fn's param hint onto that local, so lookups inside the spliced body
keep the bare path. This is a programmer assertion, like a Clojure type hint
(an inaccurate hint just makes the raw get return the wrong value, the same
contract as a wrong ^String), so it stays opt-in and off by default.

On the ray tracer (with inlining on) this is 13.3s to 10.9s, 1.22x, taking it
to 7.8x JVM from 9.4x after the inline pass. The unhinted path emits identical
code (the fast arm is just factored out), so nothing changes without hints.

Verified: a seeded full render produces an identical checksum hinted vs
unhinted; conformance 335/335 in all three modes and the full jpm test pass;
new test/integration/struct-hint-test.janet pins the guard removal, the
inline propagation, and that an accurate hint is correctness-preserving.
2026-06-12 17:45:18 -04:00
..
aot-test.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
api-test.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
bootstrap-fixpoint-test.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
cli-test.janet errors: reader errors carry file:line:col (jolt-2o7.5) 2026-06-12 10:55:42 -04:00
clojure-stdlib-suite-test.janet edn: fix strict-map? regression in edn->value; apply EDN built-in tags 2026-06-10 12:25:45 -04:00
clojure-test-suite-test.janet core: zero?/pos?/every? to 00-syntax, char? to the overlay; fix rest/next over sets and maps 2026-06-11 13:24:51 -04:00
compile-mode-test.janet errors: unresolved symbols error with Clojure's message (jolt-2o7.3) 2026-06-12 10:07:48 -04:00
config-lib-test.janet core: java shims for yogthos/config + three conformance fixes 2026-06-11 00:11:04 -04:00
conformance-test.janet core: three bug fixes — ifn?, prefer-method dispatch, reader comments in map values 2026-06-10 21:03:14 -04:00
ctx-image-test.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
deps-aliases-test.janet deps: aliases, user config merge, tools.deps conflict semantics 2026-06-10 23:13:46 -04:00
deps-conflicts-test.janet deps: aliases, user config merge, tools.deps conflict semantics 2026-06-10 23:13:46 -04:00
deps-conformance-test.janet regex: \p{...} property classes; interop: the String method surface (cuerdas is green) 2026-06-10 21:29:22 -04:00
deps-loader-test.janet test: fall back to /tmp when TMPDIR is unset (Linux CI) 2026-06-05 23:07:20 -04:00
deps-resolve-test.janet deps: :jpm/module coordinates; the janet.* bridge autoloads jpm modules 2026-06-11 20:58:43 -04:00
deps-tasks-test.janet deps: global gitlibs-style clone cache + :tasks runner 2026-06-10 23:22:36 -04:00
direct-linking-test.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
dispatch-cache-test.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
embedded-stdlib-test.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
fallback-zero-test.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
features-test.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
inline-sra-test.janet perf: AOT escape analysis (IR inlining + scalar replacement) 2026-06-12 15:58:50 -04:00
ir-passes-test.janet errors: unresolved symbols error with Clojure's message (jolt-2o7.3) 2026-06-12 10:07:48 -04:00
jank-conformance-test.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
lazy-infinite-test.janet core: staged recompile for early defns; keys/vals/empty? leave the seed (jolt-4j3) 2026-06-10 16:16:23 -04:00
macro-expansion-test.janet core: staged recompile for early defns; keys/vals/empty? leave the seed (jolt-4j3) 2026-06-10 16:16:23 -04:00
namespace-test.janet core: close the compile-path gaps that broke uberscripting Selmer + config 2026-06-11 01:31:50 -04:00
nrepl-test.janet ci: fix the one red test on CI runners; document the gate + porting gotchas 2026-06-10 16:59:12 -04:00
sci-bootstrap-test.janet core: close the compile-path gaps that broke uberscripting Selmer + config 2026-06-11 01:31:50 -04:00
sci-runtime-test.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
self-host-test.janet core: staged recompile for early defns; keys/vals/empty? leave the seed (jolt-4j3) 2026-06-10 16:16:23 -04:00
selmer-test.janet core: java.time + java.io shims — Selmer renders end to end (jolt-ea7) 2026-06-10 22:29:53 -04:00
staged-bootstrap-test.janet Compiler research (#10) 2026-06-09 07:30:25 +08:00
struct-hint-test.janet perf: hint-driven keyword-lookup guard elimination (^:struct) 2026-06-12 17:45:18 -04:00
suite-worker.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
systematic-coverage-test.janet core: AOT context image — init-cached recovers the bootstrap cost across processes 2026-06-10 13:57:37 -04:00
uberscript-test.janet deps phases 3-4: uberscript bundling + conformance harness 2026-06-05 23:36:40 -04:00