Skip to content

mem_ssa: defs + cheated property statements#169

Merged
charles-cooper merged 3 commits intomainfrom
mem-ssa
Mar 4, 2026
Merged

mem_ssa: defs + cheated property statements#169
charles-cooper merged 3 commits intomainfrom
mem-ssa

Conversation

@charles-cooper
Copy link
Contributor

@charles-cooper charles-cooper commented Mar 4, 2026

co-authored by claude opus 4.6

Port of vyper/venom/analysis/mem_ssa.py to HOL4. LLVM-style Memory SSA tracks memory state versions through the program — each store creates a new version (MemDef), each load reads a version (MemUse), join points get MemPhi nodes.

Files

File LOC Content
defs/memSSADefsScript.sml 515 Types, construction (4 phases), queries, instantiations
proofs/memSSAProofsScript.sml 229 7 cheated property proofs + wf sub-predicates
memSSAPropsScript.sml 129 Public API re-exports via ACCEPT_TAC

Definitions

All definitions use mem_ssa_ prefix.

  • Types: mssa_node (MnDef/MnUse/MnPhi), mem_ssa_state (flat map: access_id 0 = LiveOnEntry sentinel)
  • Phase 1: Collect defs/uses via bp_get_read/write_location
  • Phase 2: Insert MemPhi at dominance frontiers (worklist, fuel-based)
  • Phase 3: Connect reaching definitions (backward scan + idom walk)
  • Phase 4: Remove redundant phis (all-same operands)
  • Queries: mem_ssa_get_clobbered (clobber walk), mem_ssa_get_aliased (alias walk)
  • Instantiations: memory_ssa_analyze, storage_ssa_analyze, transient_ssa_analyze

Properties (7 cheats)

Theorem Description
mem_ssa_build_wf Construction produces well-formed state
mem_ssa_reaching_def_exists_and_valid Non-phi accesses have valid reaching defs
mem_ssa_reaching_def_dominates Reaching def's block dominates use's block
mem_ssa_phi_at_frontier Phis placed at dominance frontiers of def blocks
mem_ssa_no_redundant_phis No remaining phi has all-identical operands
mem_ssa_reaching_acyclic Reaching-def chain has no cycles
mem_ssa_clobber_sound Clobber walk structural soundness

Well-formedness decomposed into named sub-predicates: mem_ssa_ids_valid, mem_ssa_edges_valid, mem_ssa_inst_maps_consistent, mem_ssa_reaching_complete.

Dependencies

Ancestors: memAliasDefs, dominatorDefs (defs); dominatorAnalysisProps, cfgAnalysisProps, memAliasProps (proofs).

Consumer

dead_store_elimination pass (future).

Port of vyper/venom/analysis/mem_ssa.py to HOL4.
LLVM-style Memory SSA tracks memory state versions through the program.

Definitions (memSSADefsScript.sml, 515 LOC):
  Types: mssa_node (MnDef/MnUse/MnPhi), mssa_state (flat map representation)
  Phase 1: collect defs/uses via bp_get_read/write_location
  Phase 2: insert MemPhi at dominance frontiers (worklist, fuel-based)
  Phase 3: connect reaching definitions (backward scan + idom walk)
  Phase 4: remove redundant phis (all-same operands)
  Queries: clobber walk (completely_contains check), aliased walk (may_alias)
  Three instantiations: memory/storage/transient via addr_space parameter

Properties (7 cheats):
  wf_mssa (composite: mssa_ids_valid, mssa_edges_valid,
           mssa_inst_maps_consistent, mssa_reaching_complete)
  mssa_build_wf, mssa_reaching_def_exists_and_valid,
  mssa_reaching_def_dominates, mssa_phi_at_frontier,
  mssa_no_redundant_phis, mssa_reaching_acyclic, mssa_clobber_sound
@charles-cooper charles-cooper requested a review from xrchz March 4, 2026 18:15
In Python, the visited set is a mutable OrderedSet shared across all
recursive calls through phi operands. When walking operand A visits
a node, operand B's walk sees it as already visited.

The original HOL port passed the same visited snapshot to each operand
independently — updates from one operand's walk didn't propagate to
siblings. This could produce different clobber results on diamond-shaped
def chains.

Fix: thread (result, updated_visited) through both walks and their
phi collection helpers. mem_ssa_collect_phi_clobbers and
mem_ssa_collect_phi_aliased now accept and return the visited set.
The aliased walk also threads visited between from_here and from_chain
computations within a single node.
@charles-cooper charles-cooper merged commit cc27946 into main Mar 4, 2026
12 checks passed
@charles-cooper charles-cooper deleted the mem-ssa branch March 4, 2026 19:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant