diff options
Diffstat (limited to 'src/Compilers/InlineConstAndOpByRewriteInterp.v')
-rw-r--r-- | src/Compilers/InlineConstAndOpByRewriteInterp.v | 136 |
1 files changed, 0 insertions, 136 deletions
diff --git a/src/Compilers/InlineConstAndOpByRewriteInterp.v b/src/Compilers/InlineConstAndOpByRewriteInterp.v deleted file mode 100644 index 33e525ed4..000000000 --- a/src/Compilers/InlineConstAndOpByRewriteInterp.v +++ /dev/null @@ -1,136 +0,0 @@ -(** * Inline: Remove some [Let] expressions, inline constants, interpret constant operations *) -Require Import Crypto.Compilers.Syntax. -Require Import Crypto.Compilers.SmartMap. -Require Import Crypto.Compilers.ExprInversion. -Require Import Crypto.Compilers.Rewriter. -Require Import Crypto.Compilers.RewriterInterp. -Require Import Crypto.Compilers.InlineConstAndOpByRewrite. -Require Import Crypto.Util.Sigma Crypto.Util.Prod Crypto.Util.Option. -Require Import Crypto.Util.Tactics.BreakMatch. - -Module Export Rewrite. - Local Open Scope ctype_scope. - Section language. - Context (base_type_code : Type) - (interp_base_type : base_type_code -> Type) - (op : flat_type base_type_code -> flat_type base_type_code -> Type) - (interp_op : forall src dst, op src dst -> interp_flat_type interp_base_type src -> interp_flat_type interp_base_type dst). - - Local Notation flat_type := (flat_type base_type_code). - Local Notation type := (type base_type_code). - Local Notation interp_type := (interp_type interp_base_type). - Local Notation interp_flat_type := (interp_flat_type interp_base_type). - Local Notation exprf := (@exprf base_type_code op). - Local Notation expr := (@expr base_type_code op). - Local Notation Expr := (@Expr base_type_code op). - - Section with_invert. - Context (invert_Const : forall s d, op s d -> @exprf interp_base_type s -> option (interp_flat_type d)) - (Const : forall t, interp_base_type t -> @exprf interp_base_type (Tbase t)) - (Hinvert_Const - : forall s d opc e v, invert_Const s d opc e = Some v - -> interp_op s d opc (interpf interp_op e) = v) - (interpf_Const : forall t v, interpf interp_op (Const t v) = v). - - Lemma interpf_rewrite_for_const_and_op s d opc args - : interpf interp_op (rewrite_for_const_and_op interp_op invert_Const Const s d opc args) - = interp_op _ _ opc (interpf interp_op args). - Proof using Hinvert_Const interpf_Const. - cbv [rewrite_for_const_and_op]. - repeat first [ break_innermost_match_step - | reflexivity - | progress cbn [interpf exprf_of_inline_directive interpf_step LetIn.Let_In SmartVarVarf fst snd] in * - | rewrite interpf_SmartPairf - | rewrite SmartVarfMap_compose - | rewrite SmartVarfMap_id - | setoid_rewrite interpf_Const - | erewrite interpf_invert_PairsConst by eassumption ]. - Qed. - - Lemma interpf_inline_const_and_op_genf - {t} e - : interpf interp_op (inline_const_and_op_genf (t:=t) interp_op invert_Const Const e) - = interpf interp_op e. - Proof. - unfold inline_const_and_op_genf; - eapply interpf_rewrite_opf; eauto using interpf_rewrite_for_const_and_op. - Qed. - - Lemma interpf_inline_const_and_op_gen - {t} e - : forall x, - interp interp_op (inline_const_and_op_gen (t:=t) interp_op invert_Const Const e) x - = interp interp_op e x. - Proof. - unfold inline_const_and_op_gen; - eapply interp_rewrite_op; eauto using interpf_rewrite_for_const_and_op. - Qed. - End with_invert. - - Section const_unit. - Context (OpConst : forall t, interp_base_type t -> op Unit (Tbase t)) - (interp_op_OpConst : forall t v, interp_op _ _ (OpConst t v) tt = v). - - Lemma interpf_invert_ConstUnit s d opc e v - (H : invert_ConstUnit interp_op opc e = Some v) - : interp_op s d opc (interpf interp_op e) = v. - Proof using Type. - destruct s; simpl in *; inversion_option; subst. - edestruct interpf; reflexivity. - Qed. - - Lemma interpf_Const t v - : interpf interp_op (Const OpConst (t:=t) v) = v. - Proof using interp_op_OpConst. - apply interp_op_OpConst. - Qed. - - Lemma interpf_inline_const_and_opf - {t} e - : interpf interp_op (inline_const_and_opf (t:=t) interp_op OpConst e) - = interpf interp_op e. - Proof. - unfold inline_const_and_opf; - eapply interpf_rewrite_opf; eauto using interpf_rewrite_for_const_and_op, interpf_invert_ConstUnit, interpf_Const. - Qed. - - Lemma interpf_inline_const_and_op - {t} e - : forall x, - interp interp_op (inline_const_and_op (t:=t) interp_op OpConst e) x - = interp interp_op e x. - Proof. - unfold inline_const_and_op; - eapply interp_rewrite_op; eauto using interpf_rewrite_for_const_and_op, interpf_invert_ConstUnit, interpf_Const. - Qed. - End const_unit. - - Lemma InterpInlineConstAndOpGen - (invert_Const : forall var s d, op s d -> @exprf var s -> option (interp_flat_type d)) - (Const : forall var t, interp_base_type t -> @exprf var (Tbase t)) - - {t} (e : Expr t) - (Hinvert_Const - : forall s d opc e v, - invert_Const _ s d opc e = Some v - -> interp_op s d opc (interpf interp_op e) = v) - (interpf_Const : forall t v, interpf interp_op (Const _ t v) = v) - : forall x, Interp interp_op (InlineConstAndOpGen interp_op invert_Const Const e) x = Interp interp_op e x. - Proof using Type. - eapply InterpRewriteOp; - eauto using interpf_rewrite_for_const_and_op, interpf_invert_ConstUnit, interpf_Const. - Qed. - - Lemma InterpInlineConstAndOp - (OpConst : forall t, interp_base_type t -> op Unit (Tbase t)) - {t} (e : Expr t) - (interp_op_OpConst : forall t v, interp_op _ _ (OpConst t v) tt = v) - : forall x, Interp interp_op (InlineConstAndOp interp_op OpConst e) x = Interp interp_op e x. - Proof using Type. - eapply InterpRewriteOp; - eauto using interpf_rewrite_for_const_and_op, interpf_invert_ConstUnit, interpf_Const. - Qed. - End language. - - Hint Rewrite @InterpInlineConstAndOp @InterpInlineConstAndOpGen using assumption : reflective_interp. -End Rewrite. |