From 9ef37d07f8ff3cfe6b9187ede7335477268b07d9 Mon Sep 17 00:00:00 2001
From: Ralf Jung <jung@mpi-sws.org>
Date: Fri, 28 Jun 2019 22:12:05 +0200
Subject: [PATCH] bump Iris; adjust for removal of val_for_compare and partial
 EqOp

---
 opam                                          |  2 +-
 theories/logatom/conditional_increment/cinc.v |  2 +-
 theories/logatom/elimination_stack/stack.v    |  9 +--
 theories/logatom/proph_erasure.v              | 75 +++++++++++--------
 theories/logatom/treiber2.v                   |  2 +-
 theories/logrel_heaplang/ltyping.v            |  9 ++-
 6 files changed, 54 insertions(+), 45 deletions(-)

diff --git a/opam b/opam
index 7976e0d3..31209ec9 100644
--- a/opam
+++ b/opam
@@ -9,6 +9,6 @@ build: [make "-j%{jobs}%"]
 install: [make "install"]
 remove: ["rm" "-rf" "%{lib}%/coq/user-contrib/iris_examples"]
 depends: [
-  "coq-iris" { (= "dev.2019-06-27.2.1b53e5dd") | (= "dev") }
+  "coq-iris" { (= "dev.2019-07-01.1.6e79f000") | (= "dev") }
   "coq-autosubst" { = "dev.coq86" }
 ]
diff --git a/theories/logatom/conditional_increment/cinc.v b/theories/logatom/conditional_increment/cinc.v
index 15cf9724..694e4558 100644
--- a/theories/logatom/conditional_increment/cinc.v
+++ b/theories/logatom/conditional_increment/cinc.v
@@ -419,7 +419,7 @@ Section conditional_counter.
       iModIntro. iSplitL "Hc Hrest Hl'". { eauto 10 with iFrame. }
       (* two equal proofs depending on value of b1 *)
       wp_pures.
-      destruct (bool_decide (val_for_compare b = #true));
+      destruct (bool_decide (b = #true));
       wp_alloc Hl_new as "Hl_new"; wp_pures;
         iApply (complete_failing_thread
                   with "InvC InvS HQ Hl_new"); done.
diff --git a/theories/logatom/elimination_stack/stack.v b/theories/logatom/elimination_stack/stack.v
index 5b824184..1df2057c 100644
--- a/theories/logatom/elimination_stack/stack.v
+++ b/theories/logatom/elimination_stack/stack.v
@@ -106,10 +106,6 @@ Section stack.
   Local Instance stack_elem_to_val_inj : Inj (=) (=) stack_elem_to_val.
   Proof. rewrite /Inj /stack_elem_to_val=>??. repeat case_match; congruence. Qed.
 
-  Lemma stack_elem_to_val_for_compare rep :
-    val_for_compare (stack_elem_to_val rep) = stack_elem_to_val rep.
-  Proof. destruct rep; done. Qed.
-
   Fixpoint list_inv (l : list val) (rep : option loc) : iProp :=
     match l with
     | nil => ⌜rep = None⌝
@@ -207,7 +203,7 @@ Section stack.
     awp_apply cas_spec; [by destruct stack_rep|].
     iInv stackN as (stack_rep' offer_rep l) "(>Hs● & >H↦ & Hlist & Hoffer)".
     iAaccIntro with "H↦"; first by eauto 10 with iFrame.
-    iIntros "H↦". rewrite !stack_elem_to_val_for_compare.
+    iIntros "H↦".
     destruct (decide (stack_elem_to_val stack_rep' = stack_elem_to_val stack_rep)) as
       [->%stack_elem_to_val_inj|_].
     - (* The CAS succeeded. Update everything accordingly. *)
@@ -303,7 +299,6 @@ Section stack.
       iInv stackN as (stack_rep offer_rep l) "(>Hs● & >H↦ & Hlist & Hrem)".
       iAaccIntro with "H↦"; first by eauto 10 with iFrame.
       iIntros "H↦". change (InjRV #tail) with (stack_elem_to_val (Some tail)).
-      rewrite !stack_elem_to_val_for_compare.
       destruct (decide (stack_elem_to_val stack_rep = stack_elem_to_val (Some tail))) as
         [->%stack_elem_to_val_inj|_].
       + (* CAS succeeded! It must still be the same head element in the list,
@@ -338,7 +333,7 @@ Section stack.
         iDestruct "Hoff" as (Poff Qoff γo) "[#Hoinv #AUoff]".
         iInv offerN as (offer_st) "[>Hoff↦ Hoff]".
         iAaccIntro with "Hoff↦"; first by eauto 10 with iFrame.
-        iIntros "Hoff↦". simpl.
+        iIntros "Hoff↦".
         destruct (decide (#(offer_state_rep offer_st) = #0)) as [Heq|_]; last first.
         { (* CAS failed, we don't do a thing. *)
           iSplitR "AU"; first by eauto 10 with iFrame.
diff --git a/theories/logatom/proph_erasure.v b/theories/logatom/proph_erasure.v
index 93670cb0..a46bc708 100644
--- a/theories/logatom/proph_erasure.v
+++ b/theories/logatom/proph_erasure.v
@@ -29,7 +29,7 @@ Fixpoint erase_expr (e : expr) : expr :=
   | Store e1 e2 => Store (erase_expr e1) (erase_expr e2)
   | CmpXchg e0 e1 e2 => CmpXchg (erase_expr e0) (erase_expr e1) (erase_expr e2)
   | FAA e1 e2 => FAA (erase_expr e1) (erase_expr e2)
-  | NewProph => Skip
+  | NewProph => ((λ: <>, #LitErased)%V #())
   | Resolve e0 e1 e2 => Fst (Fst (erase_expr e0, erase_expr e1, erase_expr e2))
   end
 with
@@ -38,7 +38,7 @@ erase_val (v : val) : val :=
   | LitV l =>
     LitV
       match l with
-      | LitProphecy p => LitUnit
+      | LitProphecy p => LitErased
       | _ => l
       end
   | RecV f x e => RecV f x (erase_expr e)
@@ -185,24 +185,29 @@ Proof. rewrite /is_safe /reducible /=. eauto 10 using head_prim_step. Qed.
 Lemma prim_step_safe e σ κ e' σ' efs : prim_step e σ κ e' σ' efs → is_safe e σ.
 Proof. rewrite /is_safe /reducible /=. eauto 10. Qed.
 
-Lemma val_for_compare_erase v1 v2 :
-   val_for_compare v1 = val_for_compare v2 ↔
-   val_for_compare (erase_val v1) = val_for_compare (erase_val v2).
+Lemma val_is_unboxed_erased v :
+  val_is_unboxed (erase_val v) ↔ val_is_unboxed v.
 Proof.
-  revert v2; induction v1; induction v2; split; intros Ho; simpl in *;
-    repeat case_match; simpl in *; simplify_eq; eauto; firstorder.
+  destruct v; rewrite /= /lit_is_unboxed; repeat (done || simpl; case_match).
 Qed.
-
-Lemma val_for_compare_erase_bdec v1 v2 :
-  bool_decide (val_for_compare v1 = val_for_compare v2) =
-  bool_decide (val_for_compare (erase_val v1) = val_for_compare (erase_val v2)).
-Proof. by apply bool_decide_iff; rewrite val_for_compare_erase. Qed.
-
-Lemma vals_cmpxchg_compare_safe_erase v1 v2 :
-  vals_cmpxchg_compare_safe (erase_val v1) (erase_val v2) ↔
-  vals_cmpxchg_compare_safe v1 v2.
+Lemma vals_compare_safe_erase v1 v2 :
+  vals_compare_safe (erase_val v1) (erase_val v2) ↔
+  vals_compare_safe v1 v2.
+Proof. rewrite /vals_compare_safe !val_is_unboxed_erased. done. Qed.
+Lemma vals_compare v1 v2 :
+  vals_compare_safe v1 v2 →
+  (v1 = v2) ↔ (erase_val v1 = erase_val v2).
+Proof.
+  destruct v1, v2; rewrite /= /lit_is_unboxed;
+    repeat (done || (by intros [[] | []]) || simpl; case_match).
+Qed.
+(* Rewrite with [vals_compare] does not work, so derive a version
+that wraps it in [bool_decide], that can be rewritten. *)
+Lemma vals_compare_bdec v1 v2 :
+  vals_compare_safe v1 v2 →
+  bool_decide (v1 = v2) = bool_decide (erase_val v1 = erase_val v2).
 Proof.
-  by destruct v1; destruct v2; repeat (done || simpl; case_match).
+  intros ?. eapply bool_decide_iff. apply vals_compare. done.
 Qed.
 
 (** if un_op_eval succeeds on erased value,
@@ -228,10 +233,14 @@ Proof.
     simplify_eq; simpl in *; simplify_eq; eauto.
   - eexists _; split; eauto; simpl.
     erewrite bool_decide_iff; first by eauto.
-    by rewrite val_for_compare_erase.
+    apply vals_compare. done.
   - repeat f_equal.
     erewrite bool_decide_iff; first by eauto.
-    by rewrite -val_for_compare_erase.
+    symmetry. apply vals_compare. done.
+  - exfalso. match goal with H: ¬_ |- _ => apply H end.
+    eapply vals_compare_safe_erase. done.
+  - exfalso. match goal with H: ¬_ |- _ => apply H end.
+    eapply vals_compare_safe_erase. done.
 Qed.
 
 Lemma erase_heap_lookup h l : (erase_heap h) !! l = None ↔ h !! l = None.
@@ -332,7 +341,7 @@ Proof.
            first match goal with
                  | |- head_step NewProph _ _ _ _ _ => by apply new_proph_id_fresh
                  | _ => by econstructor;
-                       eauto using erase_heap_lookup, val_for_compare_erase
+                       eauto using erase_heap_lookup
                  end;
            try rewrite -val_for_compare_erase;
            rewrite ?erase_expr_subst' /erase_state ?erase_heap_insert /=;
@@ -344,21 +353,21 @@ Proof.
       rewrite ?erase_heap_insert /=; eauto using erase_state_init.
   - (* case of CmpXchg succeeding *)
     match goal with
-    | H : bool_decide (val_for_compare (erase_val _)
-                        = val_for_compare (erase_val _)) = _ |- _ =>
-      rename H into Hvfc; rewrite -val_for_compare_erase_bdec in Hvfc
+    | H : bool_decide (erase_val _ = erase_val _) = _ |- _ =>
+      rename H into Hvfc
     end.
+    rewrite -vals_compare_bdec in Hvfc; last by eapply vals_compare_safe_erase.
     eexists _, _, _, _; simpl; split.
-    { econstructor; first rewrite -vals_cmpxchg_compare_safe_erase; eauto. }
+    { econstructor; eauto. rewrite -vals_compare_safe_erase //. }
     rewrite Hvfc /erase_state ?erase_heap_insert /=; eauto.
   - (* case of CmpXchg failing *)
     match goal with
-    | H : bool_decide (val_for_compare (erase_val _)
-                        = val_for_compare (erase_val _)) = _ |- _ =>
-      rename H into Hvfc; rewrite -val_for_compare_erase_bdec in Hvfc
+    | H : bool_decide (erase_val _ = erase_val _) = _ |- _ =>
+      rename H into Hvfc
     end.
+    rewrite -vals_compare_bdec in Hvfc; last by eapply vals_compare_safe_erase.
     eexists _, _, _, _; simpl; split.
-    { econstructor; first rewrite -vals_cmpxchg_compare_safe_erase; eauto. }
+    { econstructor; eauto. rewrite -vals_compare_safe_erase //. }
     rewrite Hvfc; eauto.
 Qed.
 
@@ -655,21 +664,21 @@ Proof.
     match goal with | H : is_Some _ |- _ => inversion H end.
     do 3 eexists; apply head_prim_step; econstructor.
     by rewrite /erase_state /state_upd_heap /= erase_heap_lookup' H0; eauto.
-  - (* CAS-fail *)
+  - (* CmpXchg *)
     match goal with
-    | H : vals_cmpxchg_compare_safe ?A ?B |- _ =>
-      destruct (bool_decide (val_for_compare A = val_for_compare B)) eqn:Heqvls
+    | H : vals_compare_safe ?A ?B |- _ =>
+      destruct (bool_decide (A = B)) eqn:Heqvls
     end.
     + do 3 eexists; apply head_prim_step;
         econstructor; last (by eauto);
-          first (by apply vals_cmpxchg_compare_safe_erase); [].
+          last (by apply vals_compare_safe_erase); [].
       match goal with
       | H : heap _ !! _ = _ |- _ =>
           by rewrite /erase_state /state_upd_heap /= erase_heap_lookup' H
       end.
     + do 3 eexists; apply head_prim_step;
         econstructor; last (by eauto);
-          first (by apply vals_cmpxchg_compare_safe_erase); [].
+          last (by apply vals_compare_safe_erase); [].
       match goal with
       | H : heap _ !! _ = _ |- _ =>
           by rewrite /erase_state /state_upd_heap /= erase_heap_lookup' H
diff --git a/theories/logatom/treiber2.v b/theories/logatom/treiber2.v
index 50a2d615..50af9322 100644
--- a/theories/logatom/treiber2.v
+++ b/theories/logatom/treiber2.v
@@ -280,7 +280,7 @@ Proof.
     (* And conclude the proof easily, after some computation steps. *)
     wp_pures. iExact "H".
   - (* The CAS failed. *)
-    wp_cmpxchg_fail. { case u, w; simpl; congruence. }
+    wp_cmpxchg_fail. { exact: not_inj.  }
     { case u, w; simpl; eauto. (* Administrative stuff. *) }
     (* We can eliminate the modality. *)
     iModIntro. iSplitL "Hγ● Hl HPhys"; first by eauto 10 with iFrame.
diff --git a/theories/logrel_heaplang/ltyping.v b/theories/logrel_heaplang/ltyping.v
index a442e293..621b62ec 100644
--- a/theories/logrel_heaplang/ltyping.v
+++ b/theories/logrel_heaplang/ltyping.v
@@ -160,8 +160,13 @@ Section types_properties.
   Proof. iIntros (v). by iDestruct 1 as (i ->) "?". Qed.
 
   (* Operator typing *)
-  Global Instance lty_bin_op_eq A : LTyBinOp EqOp A A lty_bool.
-  Proof. iIntros (v1 v2) "_ _". rewrite /bin_op_eval /lty_car /=. eauto. Qed.
+  Global Instance lty_bin_op_eq A : LTyUnboxed A → LTyBinOp EqOp A A lty_bool.
+  Proof.
+    iIntros (? v1 v2) "A1 _". rewrite /bin_op_eval /lty_car /=.
+    iDestruct (lty_unboxed with "A1") as %Hunb.
+    rewrite decide_True; last solve_vals_compare_safe.
+    eauto.
+  Qed.
   Global Instance lty_bin_op_arith op :
     TCElemOf op [PlusOp; MinusOp; MultOp; QuotOp; RemOp;
                  AndOp; OrOp; XorOp; ShiftLOp; ShiftROp] →
-- 
GitLab