live fact
nanofil
In Fil-C FilPizlonator removes checks it finds redundant (compiler)
A live fact liveQ, P, Lo, Hi, Rights, Align is the validator's record that the proof Q came from a check of P over [Lo, Hi) that still holds: no safepoint since, and neither Q nor P redefined. A later raw access through Q that the fact covers needs no check of its own.
ir.pl: each check-like op adds one in
ir:checked_inst_rest/7;ir:evidence_after/3keeps them across anir:evidence_preserving/1instruction andir:evidence_kill/3drops those naming a redefined name; any other instruction ends them all. Validate.v:fact,evidence_after,kill.Its meaning is
fact_holds(Evidence.v): Q holds a pointer word, P evaluates to the same word, and the access check of that pointer passes in the current memory. A check reads only regions, so a step that changes no region keeps it.The evidence invariant proves facts hold along runs; its
live_domadds that each fact's pointer has a single definition dominating the point, which hull coverage needs.
The subtlety: a check_ahead that dooms its frame leaves a fact that does not hold; the evidence invariant therefore excludes doomed frames.
See rocq.md, The evidence invariant, instruction by instruction.
Linked from
- Chain.v: hull_access_not_unchecked
- Chain.v: hull_span_passes
- Evidence.v: fact_holds
- Evidence.v: lookup_put_same
- How Fil-C works: Safepoints
- How Fil-C works: What makes it fast enough
- Validate.v: after_check
- Validate.v: checked_inst_rest
- Validate.v: checked_insts
- Validate.v: evidence_after
- Validate.v: fact
- Validate.v: fact_of
- Validate.v: hull_covered
- Validate.v: repeated_getters
- Validate.v: reusing_access
- Walk.v: entry_live
- alloc
- cas
- check
- evidence
- evidence invariant
- evidence pass
- exit facts
- getter
- parked
- phi
- poll
- proof
- renew_hull
- repeated getter
- reuse