Switch Reaching analysis to use Finset for more efficiency

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-28 09:46:54 -05:00
parent 86bc33ee26
commit 319fa272ac
3 changed files with 51 additions and 16 deletions

View File

@@ -1,6 +1,5 @@
import Spa.Analysis.Forward
import Spa.Lattice.Bool
import Spa.Lattice.Tuple
import Spa.Lattice.Finset
import Spa.Language.Tagged.Graphs
import Spa.Showable
@@ -8,15 +7,13 @@ namespace Spa
open Forward
instance : Showable Bool := ⟨fun b => if b then "true" else "false"⟩
instance {n : ℕ} {β : Type*} [Showable β] : Showable (Fin n → β) :=
⟨fun f =>
instance {n : ℕ} : Showable (Finset (Fin n)) :=
⟨fun s =>
"{" ++ (List.finRange n).foldr
(fun i rest => show' i ++ " ↦ " ++ show' (f i) ++ ", " ++ rest) ""
(fun i rest => if i ∈ s then show' i ++ ", " ++ rest else rest) ""
++ "}"⟩
abbrev DefSet (prog : Program) : Type := prog.NodeId → Bool
abbrev DefSet (prog : Program) : Type := Finset prog.NodeId
namespace ReachingAnalysis
@@ -24,7 +21,7 @@ variable (prog : Program)
def genSet (s : prog.State) {bs : BasicStmt} (h : prog.code s = some bs) :
DefSet prog :=
Function.update (⊥ : DefSet prog) (prog.nodeIdOfNonempty s h) true
{prog.nodeIdOfNonempty s h}
def eval (s : prog.State) :
(bs : BasicStmt) → prog.code s = some bs →
@@ -65,15 +62,15 @@ instance stateInterp : StateInterp (DefSet prog) prog where
St := fun _ => Run prog
init := Run.nil
interp vs _ run := ∀ (x : String) (assigners : DefSet prog), (x, assigners) ∈ vs →
∀ (n : prog.NodeId), LastAssign prog x run n → assigners n = true
∀ (n : prog.NodeId), LastAssign prog x run n → n ∈ assigners
interp_sup := by
intro vs₁ vs₂ ρ run h x assigners hmem n hla
obtain ⟨a₁, a₂, rfl, h₁, h₂⟩ := FiniteMap.mem_sup hmem
aesop
aesop (add simp Finset.mem_union)
interp_inf := by
intro vs₁ vs₂ ρ run h x assigners hmem n hla
obtain ⟨a₁, a₂, rfl, h₁, h₂⟩ := FiniteMap.mem_inf hmem
aesop
aesop (add simp Finset.mem_inter)
instance validStateEvaluator : ValidStateEvaluator (DefSet prog) prog where
step := by intro s _ _ bs hcode _ rest; exact Run.cons s bs hcode rest
@@ -88,7 +85,7 @@ instance validStateEvaluator : ValidStateEvaluator (DefSet prog) prog where
by_cases hx : k = x
· subst hx
have hd := FiniteMap.generalizedUpdate_mem_eq (List.mem_singleton.mpr rfl) hmem2
aesop (add simp genSet)
aesop (add simp [genSet, Finset.mem_singleton])
· have hmem' := FiniteMap.generalizedUpdate_not_mem_backward
(fun hc => hx (List.mem_singleton.mp hc)) hmem2
aesop