From 80f014fe9d1431733b64003caf06485b7a33df74 Mon Sep 17 00:00:00 2001
From: Jacques-Henri Jourdan <jacques-henri.jourdan@normalesup.org>
Date: Mon, 31 Jul 2017 19:07:20 +0200
Subject: [PATCH] Tactical support for null comparison.

---
 theories/lang/lifting.v   | 31 ++++++++++++++++++-------------
 theories/lang/proofmode.v |  7 ++++++-
 2 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/theories/lang/lifting.v b/theories/lang/lifting.v
index bea9a136..fa19c209 100644
--- a/theories/lang/lifting.v
+++ b/theories/lang/lifting.v
@@ -240,19 +240,6 @@ Proof.
   iApply step_fupd_intro; done.
 Qed.
 
-(* TODO: wp_eq for locations, if needed.
-Lemma wp_bin_op_heap E σ op l1 l2 l' :
-  bin_op_eval σ op l1 l2 l' →
-  {{{ ▷ ownP σ }}} BinOp op (Lit l1) (Lit l2) @ E
-  {{{ l'', RET LitV l''; ⌜bin_op_eval σ op l1 l2 l''⌝ ∗ ownP σ }}}.
-Proof.
-  iIntros (? Φ) "HP HΦ". iApply ownP_lift_atomic_head_step; eauto.
-  iFrame "HP". iNext. iIntros (e2 σ2 efs Hs) "Ho".
-  inv_head_step; rewrite big_sepL_nil right_id.
-  iApply "HΦ". eauto.
-Qed.
-*)
-
 Lemma wp_bin_op_pure E op l1 l2 l' :
   (∀ σ, bin_op_eval σ op l1 l2 l') →
   {{{ True }}} BinOp op (Lit l1) (Lit l2) @ E
@@ -290,6 +277,24 @@ Proof.
   - iNext; iIntros (?? Heval). by inversion_clear Heval; inv_lit.
 Qed.
 
+Lemma wp_eq_loc_0_r E (l : loc) P Φ :
+  (P -∗ ▷ Φ (LitV false)) →
+  P -∗ WP BinOp EqOp (Lit (LitLoc l)) (Lit (LitInt 0)) @ E {{ Φ }}.
+Proof.
+  iIntros (HΦ) "HP". iApply wp_bin_op_pure. by intros; do 2 constructor.
+  rewrite HΦ. iNext. iIntros (?? Heval). by inversion_clear Heval; inv_lit.
+Qed.
+
+Lemma wp_eq_loc_0_l E (l : loc) P Φ :
+  (P -∗ ▷ Φ (LitV false)) →
+  P -∗ WP BinOp EqOp (Lit (LitInt 0)) (Lit (LitLoc l)) @ E {{ Φ }}.
+Proof.
+  iIntros (HΦ) "HP". iApply wp_bin_op_pure. by intros; do 2 constructor.
+  rewrite HΦ. iNext. iIntros (?? Heval). by inversion_clear Heval; inv_lit.
+Qed.
+
+(* TODO: wp_eq for locations, if needed. *)
+
 Lemma wp_offset E l z Φ :
   ▷ Φ (LitV $ LitLoc $ shift_loc l z) -∗
     WP BinOp OffsetOp (Lit $ LitLoc l) (Lit $ LitInt z) @ E {{ Φ }}.
diff --git a/theories/lang/proofmode.v b/theories/lang/proofmode.v
index 2b47b30c..cae47f51 100644
--- a/theories/lang/proofmode.v
+++ b/theories/lang/proofmode.v
@@ -92,7 +92,12 @@ Tactic Notation "wp_op" :=
   | |- _ ⊢ wp ?E ?e ?Q => reshape_expr e ltac:(fun K e' =>
     match eval hnf in e' with
     | BinOp LeOp _ _ => wp_bind_core K; apply wp_le; wp_finish
-    | BinOp EqOp _ _ => wp_bind_core K; apply wp_eq_int; wp_finish
+    | BinOp EqOp (Lit (LitInt _)) (Lit (LitInt _)) =>
+      wp_bind_core K; apply wp_eq_int; wp_finish
+    | BinOp EqOp (Lit (LitLoc _)) (Lit (LitInt 0)) =>
+      wp_bind_core K; apply wp_eq_loc_0_r; wp_finish
+    | BinOp EqOp (Lit (LitInt 0)) (Lit (LitLoc _)) =>
+      wp_bind_core K; apply wp_eq_loc_0_l; wp_finish
     | BinOp OffsetOp _ _ =>
        wp_bind_core K; etrans; [|eapply wp_offset; try fast_done]; wp_finish
     | BinOp PlusOp _ _ =>
-- 
GitLab