(* Lemma match_env_empty: match_env Clight.empty_env Csharpminor.empty_env. *)
(** The following lemmas establish the [match_env] invariant at the beginning of a function invocation, after allocation of local variables and initialization of the parameters. *)

Lemma match_env_alloc_variables:
forall vars e1 m1 e2 m2,
Clight.alloc_variables e1 m1 vars e2 m2 ->
forall mu te1 tm1,
match_env (restrict (as_inj mu) (vis mu)) e1 te1 ->
Mem.inject (as_inj mu) m1 tm1 ->
SM_wd mu -> sm_valid mu m1 tm1 ->
exists te2 tm2 mu',
Csharpminor.alloc_variables te1 tm1 (map transl_var vars) te2 tm2
/\ match_env (restrict (as_inj mu') (vis mu')) e2 te2 /\ Mem.inject (as_inj mu') m2 tm2
/\ intern_incr mu mu'
/\ sm_inject_separated mu mu' m1 tm1
/\ sm_locally_allocated mu mu' m1 tm1 m2 tm2
/\ SM_wd mu' /\ sm_valid mu' m2 tm2
/\ (REACH_closed m1 (vis mu) -> REACH_closed m2 (vis mu')).