(** The [transf_instr_spec] predicate relates one instruction in the initial code with its possible transformations in the optimized code. *)
Inductive transf_instr_spec (f: function): instruction -> instruction -> Prop :=
| transf_instr_tailcall: forall sig ros args res s,
f.(fn_stacksize) = 0 ->
is_return_spec f s res ->
transf_instr_spec f (Icall sig ros args res s) (Itailcall sig ros args)
| transf_instr_default: forall i,
transf_instr_spec f i i.

(* Specifications: *)
Lemma transf_instr_charact:
forall f pc instr,
f.(fn_stacksize) = 0 ->
transf_instr_spec f instr (transf_instr f pc instr).
Lemma transf_instr_lookup:
forall f pc i,
f.(fn_code)!pc = Some i ->
exists i',  (transf_function f).(fn_code)!pc = Some i' /\ transf_instr_spec f i i'.