Files
hakorune/docs/reference/mir/phi_policy.md

30 lines
2.2 KiB
Markdown
Raw Normal View History

## MIR PHI Policy (Phase15)
Status
- Default: PHIon. MIR builders always emit SSA `Phi` nodes at merge heads, and verifiers run with full dominance checks.
- Legacy fallback: Set `NYASH_MIR_NO_PHI=1` to enforce the former edgecopy mode (PHIoff) for targeted debug sessions.
- LLVM: The llvmlite harness still validates and, when necessary, rewires PHIs, but it no longer compensates for missing SSA form in the input.
Rationale
- Break/continue correctness: PHIoff exposed MIR generation bugs around loop exits; keeping PHIs generated in the core builder avoids silent value reuse mistakes.
- ChatGPT Pro design review: external audit recommended shipping Phase15 with PHI enabled by default to minimize backend divergence and simplify documentation.
- Maintained parity: PyVM and LLVM continue to share the same MIR stream; PHI nodes remain the single source of truth for join semantics.
Operational Rules (PHIon)
- Merge blocks place PHIs first, with one incoming per predecessor, covering loop latches, break/continue exits, and structured control flow.
- `verify_allow_no_phi()` mirrors `NYASH_MIR_NO_PHI`; with PHIon it stays strict and fails if SSA form is missing.
- Use `NYASH_LLVM_TRACE_PHI=1` to inspect wiring; traces now confirm the builders SSA layout instead of synthesizing it from edge copies.
Fallback Mode (PHIoff)
- Toggle: `NYASH_MIR_NO_PHI=1` (optionally pair with `NYASH_VERIFY_ALLOW_NO_PHI=1`).
- Behavior: MIR builders revert to edge copies per predecessor and skip PHI emission. This path is retained only for diagnosing older JSON dumps.
- Guardrails: tooling should mark PHIoff runs as legacy; new smokes and CI stay on PHIon unless explicitly overridden.
Backends
- LLVM harness consumes the PHIrich MIR stream and validates incoming edges; no extra synthesis is performed unless legacy mode is forced.
- Cranelift/JIT paths operate on the same MIR14 form; Phase15 keeps them secondary but expects PHIs to be present.
Acceptance
- Default smokes/CI run with PHIon.
- Legacy PHIoff runs must document the reason in `CURRENT_TASK.md` (e.g., reproducing historical MIR13 bugs) and avoid committing the override into shared scripts.