# Phase 15: UnifiedCache FIFO→LIFO (Stack) v1 — Next Instructions 設計: `docs/analysis/PHASE15_UNIFIEDCACHE_LIFO_1_DESIGN.md` --- ## 0. Status / Why now - Phase 14 v1/v2(intrusive tcache)は **NEUTRAL** → freeze(default OFF) - 次の狙いは intrusive を増やさず、既存 `slots[]` を使って **FIFO ring → LIFO stack** に変える(形状で命令数と局所性を取りに行く) --- ## 1. GO 条件 Mixed 10-run(clean env): - **GO**: mean +1.0% 以上 - **NO-GO**: mean -1.0% 以下 - **NEUTRAL**: ±1.0% → research box freeze --- ## 2. Patch 順(小さく積む) ### Patch 1: L0 ENV gate box(戻せる) 新規: - `core/box/tiny_unified_lifo_env_box.{h,c}` ENV: - `HAKMEM_TINY_UNIFIED_LIFO=0/1`(default 0) 要件: - hot path に `getenv()` を置かない(cached) - bench_profile の `putenv()` 同期が必要なら refresh API を用意(ただし mode 切替の整合に注意) ### Patch 2: L1 LIFO 操作箱(副作用ゼロ) 新規(static inline 想定): - `core/box/tiny_unified_lifo_box.h` API: - `unified_cache_try_pop_lifo(int class_idx) -> void* base_or_null` - `unified_cache_try_push_lifo(int class_idx, void* base) -> int handled(1/0)` 実装方針: - `TinyUnifiedCache` の `tail` を “top” とみなす(互換優先) - LIFO enabled のときは head は使わない(または 0 に固定) ### Patch 3: 統合点(入口で 1 回だけ) 統合候補(優先順): 1) `core/box/tiny_front_hot_box.h`(hot alloc/free の実体) 2) `core/front/tiny_unified_cache.h`(広範囲に効かせたい場合) 原則: - “mode 判定” は **関数入口で 1 回だけ** - hot パス中で mode の再判定を散らさない(Phase 11 の反省) ### Patch 4: 可視化(最小) 必要なときだけ: - LIFO hit/miss を TLS カウンタ(atomic 禁止) - ワンショット dump(ENV opt-in) --- ## 3. A/B(同一バイナリ) Baseline: ```sh HAKMEM_TINY_UNIFIED_LIFO=0 scripts/run_mixed_10_cleanenv.sh ``` Optimized: ```sh HAKMEM_TINY_UNIFIED_LIFO=1 scripts/run_mixed_10_cleanenv.sh ``` 追加(局所性が効くか): ```sh HAKMEM_BENCH_C7_ONLY=1 HAKMEM_TINY_UNIFIED_LIFO=0 scripts/run_mixed_10_cleanenv.sh HAKMEM_BENCH_C7_ONLY=1 HAKMEM_TINY_UNIFIED_LIFO=1 scripts/run_mixed_10_cleanenv.sh ``` --- ## 4. 健康診断 ```sh scripts/verify_health_profiles.sh ``` --- ## 5. Rollback - `export HAKMEM_TINY_UNIFIED_LIFO=0`