Lvc.Spilling.InVD

Require Import List Map Envs AllInRel Exp AppExpFree RenamedApart.
Require Import IL Annotation AutoIndTac.
Require Import Liveness.Liveness LabelsDefined.

Set Implicit Arguments.

InVD


Lemma x_VD (x : var) (VD D Ds D' : var)
      (H9 : D' [=] {x; Ds})
      (ra_VD : D D' VD)
  : x VD.
Proof.
  rewrite H9 in ra_VD.
  rewrite <- incl_right in ra_VD.
  apply add_incl in ra_VD as [x_VD _].
  eauto.
Qed.

Lemma Rx_VD (x : var) (R M VD : var)
      (R_VD : R VD) (M_VD : M VD)
      (Sp L K Kx : var)
      (H13 : Sp R) (H16 : L Sp M) (x_VD : x VD)
  : {x; (R \ K L) \ Kx} VD.
Proof.
  apply incl_add_eq.
  split; eauto.
  rewrite H16.
  rewrite H13.
  cset_tac.
Qed.

Lemma R'_VD (R M VD : var) (R_VD : R VD) (M_VD : M VD)
      (Sp L K : var) (H16 : Sp R) (H19 : L Sp M)
  : R \ K L VD.
Proof.
  rewrite H19.
  rewrite H16.
  cset_tac.
Qed.

Lemma M'_VD (R M VD : var) (R_VD : R VD) (M_VD : M VD)
      (Sp : var) (H13 : Sp R)
  : Sp M VD.
Proof.
  cset_tac.
Qed.

Lemma Rf_VD (R M VD : var) (R_VD : R VD) (M_VD : M VD)
      (Sp L K R_f : var) (Z0 : params) (H11 : Sp R) (H12 : L Sp M)
      (H18 : R_f \ of_list Z0 R \ K L)
      (Z_VD : of_list Z0 VD)
  : R_f VD.
Proof.
  assert (R_f R \ K L of_list Z0) as H18'.
  {
    rewrite <- H18.
    clear; cset_tac.
  }
  rewrite H18'.
  rewrite H12.
  rewrite H11.
  cset_tac.
Qed.

Lemma Mf_VD (R M VD : var) (R_VD : R VD) (M_VD : M VD)
      (Sp M_f : var) (Z0 : params) (H11 : Sp R)
      (H19 : M_f \ of_list Z0 Sp M)
      (Z_VD : of_list Z0 VD)
  : M_f VD.
Proof.
  assert (M_f Sp M of_list Z0) as H19'.
  {
    rewrite <- H19.
    clear; cset_tac.
  }
  rewrite H19'.
  rewrite H11.
  clear - R_VD M_VD Z_VD; cset_tac.
Qed.

Lemma disj_empty_cut (s t : var) (slot : var var)
  : t s
     disj s (map slot s)
     s map slot t [=] .
Proof.
  intros sub disj.
  apply disj_intersection.
  eapply disj_2_incl; eauto with cset.
Qed.