diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2013-04-20 07:54:52 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2013-04-20 07:54:52 +0000 |
commit | 255cee09b71255051c2b40eae0c88bffce1f6f32 (patch) | |
tree | 7951b1b13e8fd5e525b9223e8be0580e83550f55 /backend/Reloadtyping.v | |
parent | 6e5041958df01c56762e90770abd704b95a36e5d (diff) | |
download | compcert-255cee09b71255051c2b40eae0c88bffce1f6f32.tar.gz compcert-255cee09b71255051c2b40eae0c88bffce1f6f32.zip |
Big merge of the newregalloc-int64 branch. Lots of changes in two directions:
1- new register allocator (+ live range splitting, spilling&reloading, etc)
based on a posteriori validation using the Rideau-Leroy algorithm
2- support for 64-bit integer arithmetic (type "long long").
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2200 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'backend/Reloadtyping.v')
-rw-r--r-- | backend/Reloadtyping.v | 353 |
1 files changed, 0 insertions, 353 deletions
diff --git a/backend/Reloadtyping.v b/backend/Reloadtyping.v deleted file mode 100644 index 70d79bcb..00000000 --- a/backend/Reloadtyping.v +++ /dev/null @@ -1,353 +0,0 @@ -(* *********************************************************************) -(* *) -(* The Compcert verified compiler *) -(* *) -(* Xavier Leroy, INRIA Paris-Rocquencourt *) -(* *) -(* Copyright Institut National de Recherche en Informatique et en *) -(* Automatique. All rights reserved. This file is distributed *) -(* under the terms of the INRIA Non-Commercial License Agreement. *) -(* *) -(* *********************************************************************) - -(** Proof of type preservation for Reload and of - correctness of computation of stack bounds for Linear. *) - -Require Import Coqlib. -Require Import AST. -Require Import Op. -Require Import Locations. -Require Import LTLin. -Require Import LTLintyping. -Require Import Linear. -Require Import Lineartyping. -Require Import Conventions. -Require Import Parallelmove. -Require Import Reload. -Require Import Reloadproof. - -(** * Typing Linear constructors *) - -(** We show that the Linear constructor functions defined in [Reload] - generate well-typed instruction sequences, - given sufficient typing and well-formedness hypotheses over the locations involved. *) - -Hint Constructors wt_instr: reloadty. - -Remark wt_code_cons: - forall f i c, wt_instr f i -> wt_code f c -> wt_code f (i :: c). -Proof. - intros; red; simpl; intros. elim H1; intro. - subst i; auto. auto. -Qed. - -Hint Resolve wt_code_cons: reloadty. - -Definition loc_valid (f: function) (l: loc) := - match l with R _ => True | S s => slot_valid f s end. - -Lemma loc_acceptable_valid: - forall f l, loc_acceptable l -> loc_valid f l. -Proof. - destruct l; simpl; intro. auto. - destruct s; simpl. omega. tauto. tauto. -Qed. - -Definition loc_writable (l: loc) := - match l with R _ => True | S s => slot_writable s end. - -Lemma loc_acceptable_writable: - forall l, loc_acceptable l -> loc_writable l. -Proof. - destruct l; simpl; intro. auto. - destruct s; simpl; tauto. -Qed. - -Hint Resolve loc_acceptable_valid loc_acceptable_writable: reloadty. - -Definition locs_valid (f: function) (ll: list loc) := - forall l, In l ll -> loc_valid f l. -Definition locs_writable (ll: list loc) := - forall l, In l ll -> loc_writable l. - -Lemma locs_acceptable_valid: - forall f ll, locs_acceptable ll -> locs_valid f ll. -Proof. - unfold locs_acceptable, locs_valid. auto with reloadty. -Qed. - -Lemma locs_acceptable_writable: - forall ll, locs_acceptable ll -> locs_writable ll. -Proof. - unfold locs_acceptable, locs_writable. auto with reloadty. -Qed. - -Hint Resolve locs_acceptable_valid locs_acceptable_writable: reloadty. - -Lemma wt_add_reload: - forall f src dst k, - loc_valid f src -> Loc.type src = mreg_type dst -> - wt_code f k -> wt_code f (add_reload src dst k). -Proof. - intros; unfold add_reload. - destruct src; eauto with reloadty. - destruct (mreg_eq m dst); eauto with reloadty. -Qed. - -Hint Resolve wt_add_reload: reloadty. - -Lemma wt_add_reloads: - forall f srcs dsts k, - locs_valid f srcs -> map Loc.type srcs = map mreg_type dsts -> - wt_code f k -> wt_code f (add_reloads srcs dsts k). -Proof. - induction srcs; destruct dsts; simpl; intros; try congruence. - auto. inv H0. apply wt_add_reload; auto with coqlib reloadty. - apply IHsrcs; auto. red; intros; auto with coqlib. -Qed. - -Hint Resolve wt_add_reloads: reloadty. - -Lemma wt_add_spill: - forall f src dst k, - loc_valid f dst -> loc_writable dst -> Loc.type dst = mreg_type src -> - wt_code f k -> wt_code f (add_spill src dst k). -Proof. - intros; unfold add_spill. - destruct dst; eauto with reloadty. - destruct (mreg_eq src m); eauto with reloadty. -Qed. - -Hint Resolve wt_add_spill: reloadty. - -Lemma wt_add_move: - forall f src dst k, - loc_valid f src -> loc_valid f dst -> loc_writable dst -> - Loc.type dst = Loc.type src -> - wt_code f k -> wt_code f (add_move src dst k). -Proof. - intros. unfold add_move. - destruct (Loc.eq src dst); auto. - destruct src; auto with reloadty. - destruct dst; auto with reloadty. - set (tmp := match slot_type s with - | Tint => IT1 - | Tfloat => FT1 - end). - assert (mreg_type tmp = Loc.type (S s)). - simpl. destruct (slot_type s); reflexivity. - apply wt_add_reload; auto with reloadty. - apply wt_add_spill; auto. congruence. -Qed. - -Hint Resolve wt_add_move: reloadty. - -Lemma wt_add_moves: - forall f b moves, - (forall s d, In (s, d) moves -> - loc_valid f s /\ loc_valid f d /\ loc_writable d /\ Loc.type s = Loc.type d) -> - wt_code f b -> - wt_code f - (List.fold_right (fun p k => add_move (fst p) (snd p) k) b moves). -Proof. - induction moves; simpl; intros. - auto. - destruct a as [s d]. simpl. - destruct (H s d) as [A [B [C D]]]. auto. - auto with reloadty. -Qed. - -Theorem wt_parallel_move: - forall f srcs dsts b, - List.map Loc.type srcs = List.map Loc.type dsts -> - locs_valid f srcs -> locs_valid f dsts -> locs_writable dsts -> - wt_code f b -> wt_code f (parallel_move srcs dsts b). -Proof. - intros. unfold parallel_move. apply wt_add_moves; auto. - intros. - elim (parmove_prop_2 _ _ _ _ H4); intros A B. - split. destruct A as [C|[C|C]]; auto; subst s; exact I. - split. destruct B as [C|[C|C]]; auto; subst d; exact I. - split. destruct B as [C|[C|C]]; auto; subst d; exact I. - eapply parmove_prop_3; eauto. -Qed. -Hint Resolve wt_parallel_move: reloadty. - -Lemma wt_reg_for: - forall l, mreg_type (reg_for l) = Loc.type l. -Proof. - intros. destruct l; simpl. auto. - case (slot_type s); reflexivity. -Qed. -Hint Resolve wt_reg_for: reloadty. - -Lemma wt_regs_for_rec: - forall locs itmps ftmps, - enough_temporaries_rec locs itmps ftmps = true -> - (forall r, In r itmps -> mreg_type r = Tint) -> - (forall r, In r ftmps -> mreg_type r = Tfloat) -> - List.map mreg_type (regs_for_rec locs itmps ftmps) = List.map Loc.type locs. -Proof. - induction locs; intros. - simpl. auto. - simpl in H. simpl. - destruct a. - simpl. decEq. eauto. - caseEq (slot_type s); intro SLOTTYPE; rewrite SLOTTYPE in H. - destruct itmps. discriminate. - simpl. decEq. - rewrite SLOTTYPE. auto with coqlib. - apply IHlocs; auto with coqlib. - destruct ftmps. discriminate. simpl. decEq. - rewrite SLOTTYPE. auto with coqlib. - apply IHlocs; auto with coqlib. -Qed. - -Lemma wt_regs_for: - forall locs, - enough_temporaries locs = true -> - List.map mreg_type (regs_for locs) = List.map Loc.type locs. -Proof. - intros. unfold regs_for. apply wt_regs_for_rec. - auto. - simpl; intros; intuition; subst r; reflexivity. - simpl; intros; intuition; subst r; reflexivity. -Qed. -Hint Resolve wt_regs_for: reloadty. - -Hint Resolve enough_temporaries_op_args enough_temporaries_cond enough_temporaries_addr: reloadty. - -Hint Extern 4 (_ = _) => congruence : reloadty. - -Lemma wt_transf_instr: - forall f instr k, - LTLintyping.wt_instr (LTLin.fn_sig f) instr -> - wt_code (transf_function f) k -> - wt_code (transf_function f) (transf_instr f instr k). -Proof. - Opaque reg_for regs_for. - intros. inv H; simpl; auto with reloadty. - caseEq (is_move_operation op args); intros. - destruct (is_move_operation_correct _ _ H). congruence. - assert (map mreg_type (regs_for args) = map Loc.type args). - eauto with reloadty. - assert (mreg_type (reg_for res) = Loc.type res). eauto with reloadty. - auto with reloadty. - - assert (map mreg_type (regs_for args) = map Loc.type args). - eauto with reloadty. - assert (mreg_type (reg_for dst) = Loc.type dst). eauto with reloadty. - auto with reloadty. - - caseEq (enough_temporaries (src :: args)); intro ENOUGH. - caseEq (regs_for (src :: args)); intros. auto. - assert (map mreg_type (regs_for (src :: args)) = map Loc.type (src :: args)). - apply wt_regs_for. auto. - rewrite H in H5. injection H5; intros. - auto with reloadty. - apply wt_add_reloads; auto with reloadty. - symmetry. apply wt_regs_for. eauto with reloadty. - assert (op_for_binary_addressing addr <> Omove). - unfold op_for_binary_addressing; destruct addr; congruence. - assert (type_of_operation (op_for_binary_addressing addr) = (type_of_addressing addr, Tint)). - apply type_op_for_binary_addressing. - rewrite <- H1. rewrite list_length_map. - eapply not_enough_temporaries_length; eauto. - apply wt_code_cons. - constructor; auto. rewrite H5. decEq. rewrite <- H1. eauto with reloadty. - apply wt_add_reload; auto with reloadty. - apply wt_code_cons; auto. constructor. reflexivity. - rewrite <- H2. eauto with reloadty. - - assert (locs_valid (transf_function f) (loc_arguments sig)). - red; intros. generalize (loc_arguments_acceptable sig l H). - destruct l; simpl; auto. destruct s; simpl; intuition. - assert (locs_writable (loc_arguments sig)). - red; intros. generalize (loc_arguments_acceptable sig l H6). - destruct l; simpl; auto. destruct s; simpl; intuition. - assert (map Loc.type args = map Loc.type (loc_arguments sig)). - rewrite loc_arguments_type; auto. - assert (Loc.type res = mreg_type (loc_result sig)). - rewrite H2. unfold loc_result. unfold proj_sig_res. - destruct (sig_res sig); auto. destruct t; auto. - destruct ros. - destruct H3 as [A [B C]]. - apply wt_parallel_move; eauto with reloadty. - apply wt_add_reload; eauto with reloadty. - apply wt_code_cons; eauto with reloadty. - constructor. rewrite <- A. auto with reloadty. - auto with reloadty. - - assert (locs_valid (transf_function f) (loc_arguments sig)). - red; intros. generalize (loc_arguments_acceptable sig l H). - destruct l; simpl; auto. destruct s; simpl; intuition. - assert (locs_writable (loc_arguments sig)). - red; intros. generalize (loc_arguments_acceptable sig l H6). - destruct l; simpl; auto. destruct s; simpl; intuition. - assert (map Loc.type args = map Loc.type (loc_arguments sig)). - rewrite loc_arguments_type; auto. - destruct ros. destruct H2 as [A [B C]]. auto 10 with reloadty. - auto 10 with reloadty. - destruct (ef_reloads ef) eqn:?. - assert (arity_ok (sig_args (ef_sig ef)) = true) by intuition congruence. - assert (map mreg_type (regs_for args) = map Loc.type args). - apply wt_regs_for. apply arity_ok_enough. congruence. - assert (mreg_type (reg_for res) = Loc.type res). eauto with reloadty. - auto 10 with reloadty. - auto with reloadty. - - assert (map mreg_type (regs_for args) = map Loc.type args). - eauto with reloadty. - auto with reloadty. - - assert (mreg_type (reg_for arg) = Loc.type arg). - eauto with reloadty. - auto with reloadty. - - destruct optres; simpl in *; auto with reloadty. - apply wt_add_reload; auto with reloadty. - unfold loc_result. rewrite <- H1. - destruct (Loc.type l); reflexivity. -Qed. - -Lemma wt_transf_code: - forall f c, - LTLintyping.wt_code (LTLin.fn_sig f) c -> - Lineartyping.wt_code (transf_function f) (transf_code f c). -Proof. - induction c; simpl; intros. - red; simpl; tauto. - rewrite transf_code_cons. - apply wt_transf_instr; auto with coqlib. - apply IHc. red; auto with coqlib. -Qed. - -Lemma wt_transf_fundef: - forall fd, - LTLintyping.wt_fundef fd -> - Lineartyping.wt_fundef (transf_fundef fd). -Proof. - intros. destruct fd; simpl. - inv H. inv H1. constructor. unfold wt_function. simpl. - apply wt_parallel_move; auto with reloadty. - rewrite loc_parameters_type. auto. - red; intros. - destruct (list_in_map_inv _ _ _ H) as [r [A B]]. - generalize (loc_arguments_acceptable _ _ B). - destruct r; intro. - rewrite A. simpl. auto. - red in H0. destruct s; try tauto. - simpl in A. subst l. simpl. auto. - apply wt_transf_code; auto. - constructor. -Qed. - -Lemma program_typing_preserved: - forall p, - LTLintyping.wt_program p -> - Lineartyping.wt_program (transf_program p). -Proof. - intros; red; intros. - destruct (transform_program_function _ _ _ _ H0) as [f0 [A B]]. - subst f; apply wt_transf_fundef. eauto. -Qed. |