Inductive match_frames: RTL.stackframe -> RTL.stackframe -> Prop :=
| match_frames_intro: forall res f sp pc rs
(REACH: reach f pc),
match_frames (Stackframe res f sp pc rs)
(Stackframe res (transf_function f) sp (renum_pc (pnum f) pc) rs).
Inductive match_states: RTL.state -> RTL.state -> Prop :=
| match_regular_states: forall stk f sp pc rs m stk'
(STACKS: list_forall2 match_frames stk stk')
(REACH: reach f pc),
match_states (State stk f sp pc rs m)
(State stk' (transf_function f) sp (renum_pc (pnum f) pc) rs m)
| match_callstates: forall stk f args m stk'
(STACKS: list_forall2 match_frames stk stk'),
match_states (Callstate stk f args m)
(Callstate stk' (transf_fundef f) args m)
| match_returnstates: forall stk v m stk'
(STACKS: list_forall2 match_frames stk stk'),
match_states (Returnstate stk v m)
(Returnstate stk' v m).

Theorem transf_program_correct:
forward_simulation (RTL.semantics prog) (RTL.semantics tprog).