Section CORRECTNESS.
Variable prog: CminorSel.program.
Variable tprog: RTL.program.
Hypothesis TRANSL: transl_program prog = OK tprog.
Let ge : CminorSel.genv := Genv.globalenv prog.
Let tge : RTL.genv := Genv.globalenv tprog.
(** Relationship between the global environments for the original CminorSel program and the generated RTL program. *)
Proof
(Genv.find_symbol_transf_partial transl_fundef _ TRANSL).
Proof
(Genv.find_funct_ptr_transf_partial transl_fundef _ TRANSL).
Proof
(Genv.find_funct_transf_partial transl_fundef _ TRANSL).
Proof
(Genv.find_var_info_transf_partial transl_fundef _ TRANSL).
(*LENB: GFP as in selectionproofEFF*)
Definition globalfunction_ptr_inject (j:meminj):=
forall b f, Genv.find_funct_ptr ge b = Some f ->
j b = Some(b,0) /\ isGlobalBlock ge b = true.
(*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.
(** Correctness of the code generated by [add_move]. *)
(** Correctness of the translation of [switch] statements *)
(** ** 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 shift_stack_addressing_zero: forall addr,
shift_stack_addressing (Int.repr 0) addr = addr.