Lvc.Spilling.RepairSpillIdem

Idempotence of repair_spill with reg_live


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.