Ltac solve_tc_val' H :=
rewrite tc_val_tc_val_PM' in H; inv H.

(* Specifications: *)
Lemma tc_val_sem_binarith': forall {CS: compspecs} sem_int sem_long sem_float sem_single t1 t2 t v1 v2 deferr reterr rho m
(TV2: tc_val t2 v2)
(TV1: tc_val t1 v1),
(denote_tc_assert (binarithType' t1 t2 t deferr reterr) rho) m ->
tc_val t
(force_val
(Clight_Cop2.sem_binarith
(fun s n1 n2 => Some (Vint (sem_int s n1 n2)))
(fun s n1 n2 => Some (Vlong (sem_long s n1 n2)))
(fun n1 n2 => Some (Vfloat (sem_float n1 n2)))
(fun n1 n2 => Some (Vsingle (sem_single n1 n2)))
t1 t2 v1 v2)).
Lemma tc_val_sem_cmp_binarith': forall sem_int sem_long sem_float sem_single t1 t2 t v1 v2
(TV2: tc_val t2 v2)
(TV1: tc_val t1 v1),
is_numeric_type t1 = true ->
is_numeric_type t2 = true ->
is_int_type t = true ->
tc_val t
(force_val
(Clight_Cop2.sem_binarith
(fun s n1 n2 => Some (Val.of_bool (sem_int s n1 n2)))
(fun s n1 n2 => Some (Val.of_bool (sem_long s n1 n2)))
(fun n1 n2 => Some (Val.of_bool (sem_float n1 n2)))
(fun n1 n2 => Some (Val.of_bool (sem_single n1 n2)))
t1 t2 v1 v2)).
Lemma negb_true: forall a, negb a = true -> a = false.
Lemma peq_eq_block:
forall a b A (c d: A), is_true (peq a b) ->
(if eq_block a b then c else d) = c.
Lemma typecheck_Osub_sound:
forall {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type)
(IBR: denote_tc_assert (isBinOpResultType Osub e1 e2 t) rho m)
(TV2: tc_val (typeof e2) (eval_expr e2 rho))
(TV1: tc_val (typeof e1) (eval_expr e1 rho)),
tc_val t
(eval_binop Osub (typeof e1) (typeof e2)
(eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Omul_sound:
forall {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type)
(IBR: denote_tc_assert (isBinOpResultType Omul e1 e2 t) rho m)
(TV2: tc_val (typeof e2) (eval_expr e2 rho))
(TV1: tc_val (typeof e1) (eval_expr e1 rho)),
tc_val t
(eval_binop Omul (typeof e1) (typeof e2)
(eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Odiv_sound:
forall {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type)
(IBR: denote_tc_assert (isBinOpResultType Odiv e1 e2 t) rho m)
(TV2: tc_val (typeof e2) (eval_expr e2 rho))
(TV1: tc_val (typeof e1) (eval_expr e1 rho)),
tc_val t
(eval_binop Odiv (typeof e1) (typeof e2)
(eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Omod_sound:
forall {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type)
(IBR: denote_tc_assert (isBinOpResultType Omod e1 e2 t) rho m)
(TV2: tc_val (typeof e2) (eval_expr e2 rho))
(TV1: tc_val (typeof e1) (eval_expr e1 rho)),
tc_val t
(eval_binop Omod (typeof e1) (typeof e2)
(eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Oshift_sound:
forall op {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type)
(IBR: denote_tc_assert (isBinOpResultType op e1 e2 t) rho m)
(TV2: tc_val (typeof e2) (eval_expr e2 rho))
(TV1: tc_val (typeof e1) (eval_expr e1 rho))
(OP: op = Oshl \/ op = Oshr),
tc_val t
(eval_binop op (typeof e1) (typeof e2) (eval_expr e1 rho) (eval_expr e2 rho)).
Lemma typecheck_Obin_sound:
forall op {CS: compspecs} (rho : environ) m (e1 e2 : expr) (t : type)
(IBR: denote_tc_assert (isBinOpResultType op e1 e2 t) rho m)
(TV2: tc_val (typeof e2) (eval_expr e2 rho))
(TV1: tc_val (typeof e1) (eval_expr e1 rho))
(OP: op = Oand \/ op = Oor \/ op = Oxor),
tc_val t
(eval_binop op (typeof e1) (typeof e2) (eval_expr e1 rho) (eval_expr e2 rho)).