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_or tid e1 e2 :=
(Sifthenelse e1
(Sset tid (Econst_int (Int.repr 1) tint))
(Ssequence
(Sset tid (Ecast e2 tbool))
(Sset tid (Ecast (Etempvar tid tint (*tbool*)) tint)))).
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_for_x :
forall Espec {cs: compspecs} Delta Q test body incr PreIncr Post,
bool_type (typeof test) = true ->
local (tc_environ Delta) && Q |-- (tc_expr Delta (Eunop Cop.Onotbool test tint)) ->
local (tc_environ Delta)
&& local (`(typed_false (typeof test)) (eval_expr test))
&& Q |-- RA_normal Post ->
@semax cs Espec Delta (local (`(typed_true (typeof test)) (eval_expr test)) && Q)
body (loop1_ret_assert PreIncr Post) ->
@semax cs Espec Delta PreIncr incr (normal_ret_assert Q) ->
@semax cs Espec Delta Q
(Sloop (Ssequence (Sifthenelse test Sskip Sbreak) body) incr)
Post.