aboutsummaryrefslogtreecommitdiff
path: root/src/Compilers/CommonSubexpressionEliminationInterp.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compilers/CommonSubexpressionEliminationInterp.v')
-rw-r--r--src/Compilers/CommonSubexpressionEliminationInterp.v218
1 files changed, 0 insertions, 218 deletions
diff --git a/src/Compilers/CommonSubexpressionEliminationInterp.v b/src/Compilers/CommonSubexpressionEliminationInterp.v
deleted file mode 100644
index 2152b5466..000000000
--- a/src/Compilers/CommonSubexpressionEliminationInterp.v
+++ /dev/null
@@ -1,218 +0,0 @@
-(** * Common Subexpression Elimination for PHOAS Syntax *)
-Require Import Coq.Lists.List.
-Require Import Crypto.Compilers.Named.Context.
-Require Import Crypto.Compilers.Named.AListContext.
-Require Import Crypto.Compilers.Named.ContextDefinitions.
-Require Import Crypto.Compilers.Named.ContextProperties.
-Require Import Crypto.Compilers.Syntax.
-Require Import Crypto.Compilers.Equality.
-Require Import Crypto.Compilers.WfInversion.
-Require Import Crypto.Compilers.ExprInversion.
-Require Import Crypto.Compilers.Wf.
-Require Import Crypto.Compilers.WfProofs.
-Require Import Crypto.Compilers.SmartMap.
-Require Import Crypto.Compilers.CommonSubexpressionElimination.
-Require Import Crypto.Compilers.CommonSubexpressionEliminationDenote.
-Require Import Crypto.Compilers.CommonSubexpressionEliminationWf.
-Require Import Crypto.Util.Bool.
-Require Import Crypto.Util.Tactics.RewriteHyp.
-Require Import Crypto.Util.Tactics.BreakMatch.
-Require Import Crypto.Util.Tactics.DestructHead.
-Require Import Crypto.Util.Tactics.SplitInContext.
-Require Import Crypto.Util.Tactics.SpecializeBy.
-Require Import Crypto.Util.Prod.
-Require Import Crypto.Util.Option.
-Require Import Crypto.Util.Sigma.
-Require Import Crypto.Util.Decidable.
-
-Section symbolic.
- Context (base_type_code : Type)
- (op_code : Type)
- (base_type_code_beq : base_type_code -> base_type_code -> bool)
- (op_code_beq : op_code -> op_code -> bool)
- (base_type_code_bl : forall x y, base_type_code_beq x y = true -> x = y)
- (base_type_code_lb : forall x y, x = y -> base_type_code_beq x y = true)
- (op_code_bl : forall x y, op_code_beq x y = true -> x = y)
- (op_code_lb : forall x y, x = y -> op_code_beq x y = true)
- (interp_base_type : base_type_code -> Type)
- (op : flat_type base_type_code -> flat_type base_type_code -> Type)
- (interp_op : forall s d (opc : op s d), interp_flat_type interp_base_type s -> interp_flat_type interp_base_type d)
- (symbolize_op : forall s d, op s d -> op_code)
- (denote_op : forall s d, op_code -> option (op s d)).
- Local Notation symbolic_expr := (symbolic_expr base_type_code op_code).
- Context (normalize_symbolic_op_arguments : op_code -> symbolic_expr -> symbolic_expr)
- (inline_symbolic_expr_in_lookup : bool).
-
- Local Notation symbolic_expr_beq := (@symbolic_expr_beq base_type_code op_code base_type_code_beq op_code_beq).
- Local Notation symbolic_expr_lb := (@internal_symbolic_expr_dec_lb base_type_code op_code base_type_code_beq op_code_beq base_type_code_lb op_code_lb).
- Local Notation symbolic_expr_bl := (@internal_symbolic_expr_dec_bl base_type_code op_code base_type_code_beq op_code_beq base_type_code_bl op_code_bl).
-
- 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_gen := interp_flat_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).
-
- Local Notation symbolicify_smart_var := (@symbolicify_smart_var base_type_code op_code).
- Local Notation symbolize_exprf := (@symbolize_exprf base_type_code op_code op symbolize_op).
- Local Notation csef := (@csef base_type_code op_code base_type_code_beq op_code_beq base_type_code_bl op symbolize_op normalize_symbolic_op_arguments inline_symbolic_expr_in_lookup).
- Local Notation cse := (@cse base_type_code op_code base_type_code_beq op_code_beq base_type_code_bl op symbolize_op normalize_symbolic_op_arguments inline_symbolic_expr_in_lookup).
- Local Notation CSE := (@CSE base_type_code op_code base_type_code_beq op_code_beq base_type_code_bl op symbolize_op normalize_symbolic_op_arguments inline_symbolic_expr_in_lookup).
- Local Notation SymbolicExprContext := (@SymbolicExprContext base_type_code op_code base_type_code_beq op_code_beq base_type_code_bl).
- Local Notation SymbolicExprContextOk := (@SymbolicExprContextOk base_type_code op_code base_type_code_beq op_code_beq base_type_code_bl base_type_code_lb op_code_bl op_code_lb).
- Local Notation prepend_prefix := (@prepend_prefix base_type_code op).
-
- Local Notation denote_symbolic_expr := (@denote_symbolic_expr base_type_code op_code base_type_code_beq op_code_beq base_type_code_bl op denote_op interp_base_type interp_op).
-
- Local Instance base_type_code_dec : DecidableRel (@eq base_type_code)
- := dec_rel_of_bool_dec_rel base_type_code_beq base_type_code_bl base_type_code_lb.
- Local Instance op_code_dec : DecidableRel (@eq op_code)
- := dec_rel_of_bool_dec_rel op_code_beq op_code_bl op_code_lb.
-
- Lemma interpf_flatten_binding_list T t x y v s
- (H : List.In (existT _ t (x, y)) (flatten_binding_list (var2:=interp_base_type) (t:=T) (symbolicify_smart_var v s) v))
- : fst x = y.
- Proof.
- revert dependent s; induction T;
- repeat first [ progress simpl in *
- | reflexivity
- | tauto
- | progress destruct_head or
- | progress inversion_sigma
- | progress inversion_prod
- | progress subst
- | rewrite List.in_app_iff in *
- | progress intros
- | solve [ eauto ] ].
- Qed.
-
- (*Lemma interpf_symbolize_exprf_injective
- s
- : forall G0 G1 t e0 e1 e0' e1'
- (HG0 : forall t x y, In (existT _ t (x, y)) G0 -> fst x = y)
- (HG1 : forall t x y, In (existT _ t (x, y)) G1 -> fst x = y)
- (Hwf0 : wff G0 (t:=t) e0 e0')
- (Hwf1 : wff G1 (t:=t) e1 e1')
- (Hs0 : symbolize_exprf e0 = Some s)
- (Hs1 : symbolize_exprf e1 = Some s),
- interpf interp_op e0' = interpf interp_op e1'.
- Proof.
- induction s; intros;
- destruct Hwf0;
- try (invert_one_expr e1; break_innermost_match; try exact I; intros);
- try (invert_one_expr e1'; break_innermost_match; try exact I; intros);
- try solve [ repeat first [ reflexivity
- | progress subst
- | progress destruct_head'_sig
- | progress destruct_head'_and
- | progress destruct_head'_prod
- | progress inversion_option
- | congruence
- | progress simpl in *
- | progress unfold option_map in *
- | progress inversion_wf_constr
- | break_innermost_match_hyps_step
- | match goal with
- | [ HG : forall t x y, In _ ?G -> fst x = y, H : In _ ?G |- _ ]
- => pose proof (HG _ _ _ H); progress subst
- end ] ].
- Focus 3.
- { simpl in *.
- Focus 3.
- try reflexivity;
- simpl in *.
- inversion_expr.
- .
- inversion_wf.
- move s at top; reverse.
- ->
-
-*)
-
-
-
- Local Arguments lookupb : simpl never.
- Local Arguments extendb : simpl never.
- Lemma interpf_csef G t e1 e2
- (HG : forall t x y, In (existT _ t (x, y)) G -> fst x = y)
- (m : @SymbolicExprContext (interp_flat_type_gen _))
- (HGm : forall t s v,
- lookupb m s = Some v
- -> forall k,
- List.In k (flatten_binding_list (@symbolicify_smart_var interp_base_type t v s) v)
- -> List.In k G)
- (Hm : forall t sv v,
- lookupb m sv = Some v
- -> denote_symbolic_expr m t sv = Some v)
- (Hwf : wff G e1 e2)
- : interpf interp_op (@csef interp_base_type t e1 m) = interpf interp_op e2.
- Proof.
- cbv beta in *.
- revert dependent m;
- induction Hwf; simpl; cbv [LetIn.Let_In symbolize_var]; intros; eauto;
- rewrite_hyp ?* by eauto; try reflexivity; eauto.
- (*{ break_match; break_match_hyps; try congruence; inversion_prod; inversion_option; subst;
- simpl; unfold LetIn.Let_In;
- [ match goal with
- | [ Hm : forall t e1 e2 s v, symbolize_exprf _ = _ -> _, H' : symbolize_exprf _ = _ |- _ ]
- => erewrite (Hm _ _ _ _ _ H') by eassumption
- end
- | rewrite_hyp !* by eauto
- | rewrite_hyp !* by eauto ];
- match goal with
- | [ H : context[interpf interp_op (csef _ _)] |- _ ] => erewrite H; [ reflexivity | | eauto | eauto ]
- end;
- intros *;
- try solve [ repeat first [ rewrite !(fun var => @lookupb_extendb_full flat_type _ symbolic_expr _ var _ SymbolicExprContextOk)
- | setoid_rewrite in_app_iff
- | progress break_innermost_match
- | progress subst
- | progress simpl in *
- | progress inversion_prod
- | progress inversion_option
- | progress destruct_head or
- | solve [ eauto using interpf_flatten_binding_list ]
- | progress intros ] ].
- admit.
- admit.
- admit. }*)
- Admitted.
-
- Lemma interpf_prepend_prefix t e prefix
- : interpf interp_op (@prepend_prefix _ t e prefix) = interpf interp_op e.
- Proof.
- induction prefix; simpl; [ reflexivity | unfold LetIn.Let_In; assumption ].
- Qed.
-
- Lemma interp_cse prefix t e1 e2
- (Hwf : wf e1 e2)
- : forall x, interp interp_op (@cse interp_base_type prefix t e1 empty) x = interp interp_op e2 x.
- Proof.
- destruct Hwf; simpl; intros.
- etransitivity; [ | eapply interpf_prepend_prefix ].
- eapply interpf_csef; eauto;
- [ ..
- | eapply wff_prepend_prefix; [ .. | solve [ eauto ] ] ].
- { intros; eapply interpf_flatten_binding_list; eassumption. }
- { admit. }
- { admit. }
- Admitted.
-
- Lemma InterpCSE t (e : Expr t)
- (prefix : forall var, list (sigT (fun t : flat_type => @exprf var t)))
- (*(Hlen : forall var1 var2, length (prefix var1) = length (prefix var2))
- (Hprefix : forall var1 var2 n t1 t2 e1 e2,
- nth_error (prefix var1) n = Some (existT _ t1 e1)
- -> nth_error (prefix var2) n = Some (existT _ t2 e2)
- -> exists pf : t1 = t2, wff nil (eq_rect _ exprf e1 _ pf) e2)*)
- (Hwf : Wf e)
- : forall x, Interp interp_op (@CSE t e prefix) x = Interp interp_op e x.
- Proof.
- apply interp_cse; auto.
- Qed.
-End symbolic.
-
-Hint Rewrite @InterpCSE using solve_wf_side_condition : reflective_interp.