(*From Cminorgenproof*)
Remark val_inject_function_pointer:
  forall v fd j tv,
  Genv.find_funct ge v = Some fd ->
  globalfunction_ptr_inject j ->
  val_inject j v tv ->
  tv = v.(** ** Semantic preservation for the translation of expressions *)

(*LENB: translation of sp. Contrary to selection phase,
  the use of eval_operation (and the existing lemmas about
  eval_operation_inject) here suggests we should
  require sp=Vptr b Int.zero and sp' = Vptr b' Int.zero instead
  of sp=Vptr b i and sp' = Vptr b' i for some arbitrary i.
  Let's see whether this works...*)
Definition sp_preserved (j:meminj) (sp sp':val) :=
    exists b b', sp = Vptr b Int.zero /\ sp' = Vptr b' Int.zero /\
                j b = Some(b',0).

Lemma Efftransl_expr_Econdition_correct: forall (le : letenv) (a: condexpr) (ifso ifnot : expr) (va : bool) (v : val), eval_condexpr ge sp e m le a va -> Efftransl_condexpr_prop le a va -> eval_expr ge sp e m le (if va then ifso else ifnot) v -> Efftransl_expr_prop le (if va then ifso else ifnot) v -> Efftransl_expr_prop le (Econdition a ifso ifnot) v.