Local Open Scope logic.
(*new*) Genv.find_symbol ge id = Some b -> (*new*) Genv.find_funct_ptr ge b = Some (External ef argsig retsig cc) -> semax_func V G ge fs G' -> semax_func V G ge ((id, External ef argsig retsig cc) :: fs) ((id, vacuous_funspec (External ef argsig retsig cc)) :: G').  Lemma int_eq_false_e: forall i j, Int.eq i j = false -> i <> j.   Lemma semax_ifthenelse_PQR' : forall Espec {cs: compspecs} (v: val) Delta P Q R (b: expr) c d Post, bool_type (typeof b) = true -> ENTAIL Delta, PROPx P (LOCALx Q (SEPx R)) |-- (tc_expr Delta (Eunop Cop.Onotbool b tint))  -> ENTAIL Delta, PROPx P (LOCALx Q (SEPx R)) |-- local (`(eq v) (eval_expr b)) -> @semax cs Espec Delta (PROPx (typed_true (typeof b) v :: P) (LOCALx Q (SEPx R))) c Post -> @semax cs Espec Delta (PROPx (typed_false (typeof b) v :: P) (LOCALx Q (SEPx R))) d Post -> @semax cs Espec Delta (PROPx P (LOCALx Q (SEPx R))) (Sifthenelse b c d) Post.  Definition logical_and_result v1 t1 v2 t2 := match (strict_bool_val t1 v1) with | Some b1 => if b1 then match (strict_bool_val t2 v2) with | Some b2 => if b2 then  Vint Int.one else Vint Int.zero | None => Vundef end else Vint Int.zero | None => Vundef end.  Definition logical_or_result v1 t1 v2 t2 := match (strict_bool_val t1 v1) with | Some b1 => if b1 then Vint Int.one else match (strict_bool_val t2 v2) with | Some b2 => if b2 then  Vint Int.one else Vint Int.zero | None => Vundef end | None => Vundef end.  (* NOTE: In both logical_or and logical_and, compcert (up to 2.4) has (Etempvar tid tbool) where I conjecture that it should have (Etempvar tid tint). That means our lemmas here are incompatible with compcert, at the moment. *)
Definition logical_and tid e1 e2 :=
(Sifthenelse e1
(Ssequence
(Sset tid (Ecast e2 tbool))
(Sset tid (Ecast (Etempvar tid tint (*tbool*)) tint)))
(Sset tid (Econst_int (Int.repr 0) tint))).

Lemma semax_pre_flipped :
forall (P' : environ -> mpred) (Espec : OracleKind) {cs: compspecs}
(Delta : tycontext) (P1 : list Prop) (P2 : list localdef)
(P3 : list mpred) (c : statement)
(R : ret_assert),
semax Delta P' c R ->
ENTAIL Delta, PROPx P1 (LOCALx P2 (SEPx P3)) |-- P' ->
semax Delta (PROPx P1 (LOCALx P2 (SEPx P3))) c R.