Ltac destruct_cjoin phi HH :=
  match goal with
   |   |- context [@proj1_sig rmap _ ?X] => destruct X as [phi HH]; simpl
   |  H: context [@proj1_sig rmap _ ?X] |- _ => destruct X as [phi HH]; simpl in H
  end.

(* Specifications: *)
Lemma split_top_neq: fst (Share.split Share.top) <> Share.top.
Lemma dec_pure: forall r, {exists k, exists pp, r = PURE k pp}+{core r = NO Share.bot bot_unreadable}.
Lemma store_init_data_list_lem: forall F V (ge: Genv.t F V) m b lo d m', Genv.store_init_data_list ge m b lo d = Some m' -> (* b > 0 -> *) forall w IOK IOK' P sh (wsh: writable_share sh), ((P * VALspec_range (init_data_list_size d) sh (b,lo))%pred (m_phi (initial_mem m w IOK))) -> ((P * VALspec_range (init_data_list_size d) sh (b,lo))%pred (m_phi (initial_mem m' w IOK'))).
Lemma fold_right_rev_left: forall (A B: Type) (f: A -> B -> A) (l: list B) (i: A), fold_left f l i = fold_right (fun x y => f y x) i (rev l).