Lvc.Spilling.RepairSpillIdem
Require Import RepairSpill RLiveMin RLiveSound LiveMin SpillMaxKill.
Require Import SpillSound Annotation Liveness.Liveness RenamedApart.
Require Import List Map IL Take TakeSet OneOrEmpty AllInRel PickLK.
Require Import RepairSpillInv RegLive PartialOrder.
Set Implicit Arguments.
Require Import SpillSound Annotation Liveness.Liveness RenamedApart.
Require Import List Map IL Take TakeSet OneOrEmpty AllInRel PickLK.
Require Import RepairSpillInv RegLive PartialOrder.
Set Implicit Arguments.
Corollary repair_spill_idem k ZL Λ Λ' s lv sl R M G ra VD
: let rlv := reg_live ZL (fst ⊝ Λ) G s sl in
renamedApart s ra
→ R ∪ M ⊆ fst (getAnn ra)
→ getAnn rlv ⊆ R
→ live_sound Imperative ZL (merge ⊝ Λ) s lv
→ live_min k ZL Λ G s sl lv
→ spill_sound k ZL Λ (R,M) s sl
→ (∀ Rf Mf n, get Λ n (Rf,Mf) → cardinal Rf ≤ k)
→ ann_R (fun x (y : ⦃var⦄ × ⦃var⦄) ⇒ (list_union (merge ⊝ snd x)) ⊆ fst y) sl ra
→ spill_live VD sl lv
→ poEq Λ Λ'
→ sl === repair_spill k ZL Λ' R M s rlv lv sl
.
Proof.
intros rlv rena RM_sub inclR lvSnd lvMin spillSnd rmf_card sl_ra spilli Λeq.
eapply repair_spill_inv; eauto.
- eapply reg_live_rlive_min; eauto.
eapply reg_live_anno; eauto.
- eapply reg_live_sound; eauto.
Qed.