Parent: #62 Measured rejections: #68, #69, zig-utils/zig-gc#9
Problem
The post-#67 profile attributes most remaining time to runChunk itself. Every load_local currently re-scans following bytecodes for call-loop and array-loop quickening, even though the chunk is immutable and most sites can never match. Object-churn loop heads are checked millions of times and structurally reject both plans on every iteration. The ordinary numeric-property quickener also does not cache unsupported plans, so array index patterns repeatedly attempt to decode a property assignment trace.
Scope
- precompute immutable per-instruction call-loop/array-loop candidate bits when a Chunk is finalized;
- make runChunk consult those bits instead of rescanning up to eleven opcodes at every load_local;
- preserve the existing full plan compilers and runtime type/shape/step guards for actual candidates;
- cache unsupported isolated numeric-property plans with an explicit sentinel so immutable misses decode once;
- let known-negative property sites bypass repeated frame/object/plan work without disabling the independent multi-property kernel;
- preserve atomic publication in shared mode and all exact step/checkpoint semantics;
- measure a clean pinned object_churn A/B with exact checksum equality.
Acceptance criteria
- Non-candidate load_local sites do no call/array structural rescanning.
- Actual call, array, polymorphic-property, and four-property kernels still select and preserve exact step counts.
- Unsupported property traces decode once and remain ordinary bytecode.
- Shared-mode plan publication remains race-safe.
- Focused quickening, VM fallback, and semantic tests pass.
- Clean pinned object_churn A/B improves at checksum 1030552128.
- Commit references this issue and evidence is added to #62.