aboutsummaryrefslogtreecommitdiffstats
path: root/scheduling/RTLpathSE_theory.v
diff options
context:
space:
mode:
Diffstat (limited to 'scheduling/RTLpathSE_theory.v')
-rw-r--r--scheduling/RTLpathSE_theory.v168
1 files changed, 51 insertions, 117 deletions
diff --git a/scheduling/RTLpathSE_theory.v b/scheduling/RTLpathSE_theory.v
index 74f90b0e..2a791feb 100644
--- a/scheduling/RTLpathSE_theory.v
+++ b/scheduling/RTLpathSE_theory.v
@@ -126,11 +126,6 @@ Definition ssem_local (ge: RTL.genv) (sp:val) (st: sistate_local) (rs0: regset)
/\ seval_smem ge sp st.(si_smem) rs0 m0 = Some m
/\ forall (r:reg), seval_sval ge sp (st.(si_sreg) r) rs0 m0 = Some (rs#r).
-Definition seval_condition ge sp (cond: condition) (lsv: list_sval) (sm: smem) rs0 m0 : option bool :=
- SOME args <- seval_list_sval ge sp lsv rs0 m0 IN
- SOME m <- seval_smem ge sp sm rs0 m0 IN
- eval_condition cond args m.
-
Definition sabort_local (ge: RTL.genv) (sp:val) (st: sistate_local) (rs0: regset) (m0: mem): Prop :=
~(st.(si_pre) ge sp rs0 m0)
\/ seval_smem ge sp st.(si_smem) rs0 m0 = None
@@ -140,7 +135,10 @@ Definition sabort_local (ge: RTL.genv) (sp:val) (st: sistate_local) (rs0: regset
Record sistate_exit := mk_sistate_exit
{ si_cond: condition; si_scondargs: list_sval; si_elocal: sistate_local; si_ifso: node }.
-
+Definition seval_condition ge sp (cond: condition) (lsv: list_sval) (sm: smem) rs0 m0 : option bool :=
+ SOME args <- seval_list_sval ge sp lsv rs0 m0 IN
+ SOME m <- seval_smem ge sp sm rs0 m0 IN
+ eval_condition cond args m.
Definition all_fallthrough ge sp (lx: list sistate_exit) rs0 m0: Prop :=
forall ext, List.In ext lx ->
@@ -459,11 +457,6 @@ Definition slocal_store st chunk addr args src : sistate_local :=
let sm := Sstore (si_smem st) chunk addr args src
in slocal_set_smem st sm.
-Definition slocal_eval_cond (st:sistate_local) (cond : condition) (args : list_sval) :=
- {| si_pre:=(fun ge sp rs m => seval_condition ge sp cond args st.(si_smem) rs m <> None /\ (st.(si_pre) ge sp rs m));
- si_sreg:=st.(si_sreg);
- si_smem:= st.(si_smem) |}.
-
Definition siexec_inst (i: instruction) (st: sistate): option sistate :=
match i with
| Inop pc' =>
@@ -481,15 +474,11 @@ Definition siexec_inst (i: instruction) (st: sistate): option sistate :=
| Istore chunk addr args src pc' =>
let next := slocal_store st.(si_local) chunk addr args src in
Some (sist_set_local st pc' next)
- | Icond cond args ifso ifnot _ =>
+ | Icond cond args ifso ifnot _ =>
let prev := st.(si_local) in
let vargs := list_sval_inj (List.map prev.(si_sreg) args) in
- let next := slocal_eval_cond prev cond vargs in
- if Pos.eq_dec ifso ifnot then
- Some (sist_set_local st ifnot next)
- else
- let ex := {| si_cond:=cond; si_scondargs:=vargs; si_elocal := next; si_ifso := ifso |} in
- Some {| si_pc := ifnot; si_exits := ex::st.(si_exits); si_local := next |}
+ let ex := {| si_cond:=cond; si_scondargs:=vargs; si_elocal := prev; si_ifso := ifso |} in
+ Some {| si_pc := ifnot; si_exits := ex::st.(si_exits); si_local := prev |}
| _ => None
end.
@@ -521,13 +510,6 @@ Proof.
unfold sabort_local. simpl; intuition.
Qed.
-Lemma slocal_eval_cond_preserves_sabort_local ge sp st rs0 m0 cond args:
- sabort_local ge sp st rs0 m0 ->
- sabort_local ge sp (slocal_eval_cond st cond args) rs0 m0.
-Proof.
- unfold sabort_local. simpl; intuition.
-Qed.
-
Lemma all_fallthrough_upto_exit_cons ge sp ext lx ext' exits rs m:
all_fallthrough_upto_exit ge sp ext lx exits rs m ->
all_fallthrough_upto_exit ge sp ext lx (ext'::exits) rs m.
@@ -567,46 +549,35 @@ Proof.
- left. constructor; eauto. eapply slocal_set_smem_preserves_sabort_local; eauto.
- right. exists ext0, lx0. constructor; eauto.
(* COND *)
- * destruct Pos.eq_dec; simpl in *.
- { (* "Useless if" (two identical successors) *)
- destruct ABORT as [(ALLF & ABORTL) | (ext0 & lx0 & ALLFU & ABORTE)].
- - left; constructor; try_simplify_someHyps;
- apply slocal_eval_cond_preserves_sabort_local; auto.
- - right; exists ext0, lx0; try_simplify_someHyps. }
- { (* Normal Icond *)
- remember ({| si_cond := _; si_scondargs := _; si_elocal := _; si_ifso := _ |}) as ext.
- destruct ABORT as [(ALLF & ABORTL) | (ext0 & lx0 & ALLFU & ABORTE)].
- { destruct (seval_condition ge sp (si_cond ext) (si_scondargs ext)
+ * remember ({| si_cond := _; si_scondargs := _; si_elocal := _; si_ifso := _ |}) as ext.
+ destruct ABORT as [(ALLF & ABORTL) | (ext0 & lx0 & ALLFU & ABORTE)].
+ - destruct (seval_condition ge sp (si_cond ext) (si_scondargs ext)
(si_smem (si_elocal ext)) rs m) eqn:SEVAL; [destruct b|].
- (* case true *)
- - right. exists ext, (si_exits st).
- split.
- + constructor; auto; inversion H0; constructor.
- + unfold sabort_exit; right; constructor; auto.
- subst; simpl in *; auto.
- apply slocal_eval_cond_preserves_sabort_local; assumption.
- (* case false *)
- - left. constructor; eauto; inversion H0; simpl.
- + apply all_fallthrough_cons; auto.
- + apply slocal_eval_cond_preserves_sabort_local; auto.
- (* case None *)
- - right. exists ext, (si_exits st). constructor.
- + constructor; auto; inversion H0; constructor.
- + unfold sabort_exit; intuition. }
- { right. exists ext0, lx0. constructor; eauto.
- inversion H0; simpl. eapply all_fallthrough_upto_exit_cons; eauto. } }
+ (* case true *)
+ + right. exists ext, (si_exits st).
+ constructor.
+ ++ constructor. econstructor; eauto. eauto.
+ ++ unfold sabort_exit. right. constructor; eauto.
+ subst. simpl. eauto.
+ (* case false *)
+ + left. constructor; eauto. eapply all_fallthrough_cons; eauto.
+ (* case None *)
+ + right. exists ext, (si_exits st). constructor.
+ ++ constructor. econstructor; eauto. eauto.
+ ++ unfold sabort_exit. left. eauto.
+ - right. exists ext0, lx0. constructor; eauto. eapply all_fallthrough_upto_exit_cons; eauto.
Qed.
Lemma siexec_inst_WF i st:
siexec_inst i st = None -> default_succ i = None.
Proof.
- destruct i; simpl; try destruct Pos.eq_dec; unfold sist_set_local; simpl; congruence.
+ destruct i; simpl; unfold sist_set_local; simpl; congruence.
Qed.
Lemma siexec_inst_default_succ i st st':
siexec_inst i st = Some st' -> default_succ i = Some (st'.(si_pc)).
Proof.
- destruct i; simpl; try destruct Pos.eq_dec; unfold sist_set_local; simpl; try congruence;
+ destruct i; simpl; unfold sist_set_local; simpl; try congruence;
intro H; inversion_clear H; simpl; auto.
Qed.
@@ -623,7 +594,7 @@ Proof.
assert (forall r : reg, In r l -> seval_sval ge sp (si_sreg st r) rs0 m0 = None -> False).
{ intros r INR. eapply ALLR. right. assumption. }
intro SVALLIST. intro. eapply IHl; eauto.
- + intros. exploit (ALLR a); simpl; eauto.
+ + intros. exploit (ALLR a); simpl; eauto.
Qed.
Lemma siexec_inst_correct ge sp i st rs0 m0 rs m:
@@ -632,7 +603,7 @@ Lemma siexec_inst_correct ge sp i st rs0 m0 rs m:
ssem_internal_opt2 ge sp (siexec_inst i st) rs0 m0 (istep ge i sp rs m).
Proof.
intros (PRE & MEM & REG) NYE.
- destruct i eqn:INST; simpl; auto.
+ destruct i; simpl; auto.
+ (* Nop *)
constructor; [|constructor]; simpl; auto.
constructor; auto.
@@ -714,55 +685,25 @@ Proof.
+ (* COND *)
Local Hint Resolve is_tail_refl: core.
Local Hint Unfold ssem_local: core.
- destruct Pos.eq_dec.
- { (* Useless if *)
- subst; destruct eval_condition eqn:EV_COND.
- - constructor; simpl; intuition. 2: { destruct b; auto. } constructor; intuition.
- unfold slocal_eval_cond; try_simplify_someHyps.
- unfold seval_condition; erewrite seval_list_sval_inj; simpl; auto.
- inversion_SOME m'; intros; assert (m' = m) by congruence; subst.
- rewrite EV_COND; intuition; discriminate.
- - simpl; unfold sabort; simpl; left; intuition.
- unfold sabort_local; simpl; unfold seval_condition.
+ inversion_SOME b; intros COND.
+ { destruct b; simpl; unfold ssem_internal, ssem_local; simpl.
+ - remember (mk_sistate_exit _ _ _ _) as ext. exists ext, (si_exits st).
+ constructor; constructor; subst; simpl; auto.
+ unfold seval_condition. subst; simpl.
erewrite seval_list_sval_inj; simpl; auto.
- try_simplify_someHyps; intuition. }
- { (* Normal Icond *)
- inversion_SOME b; intros COND.
- { (* eval_condition did not fail *)
- destruct b; simpl; unfold ssem_internal, ssem_local; simpl.
- - (* Case true *)
- remember (mk_sistate_exit _ _ _ _) as ext. exists ext, (si_exits st).
- split. 2: { constructor; auto. }
- constructor.
- 2: { constructor; subst; simpl; auto.
- constructor; auto. unfold slocal_eval_cond; simpl.
- constructor; auto.
- unfold seval_condition.
- erewrite seval_list_sval_inj; auto.
- rewrite MEM; congruence. }
- unfold seval_condition.
- subst; simpl.
- erewrite seval_list_sval_inj; simpl; auto.
- rewrite MEM. assumption.
- - (* Case false *)
- intuition.
- + unfold all_fallthrough in * |- *.
- try_simplify_someHyps.
- unfold seval_condition; erewrite seval_list_sval_inj; simpl; auto.
- try_simplify_someHyps; discriminate.
- + unfold all_fallthrough in * |- *. simpl.
- intuition. subst. simpl.
- unfold seval_condition.
- erewrite seval_list_sval_inj; simpl; auto.
- try_simplify_someHyps. }
- { (* Case None (eval_condition failed) *)
- unfold sabort. simpl. right.
- remember (mk_sistate_exit _ _ _ _) as ext. exists ext, (si_exits st).
- constructor; [constructor; subst; simpl; auto|].
- left. subst; simpl; auto.
+ try_simplify_someHyps.
+ - intuition. unfold all_fallthrough in * |- *. simpl.
+ intuition. subst. simpl.
unfold seval_condition.
erewrite seval_list_sval_inj; simpl; auto.
- try_simplify_someHyps. } }
+ try_simplify_someHyps. }
+ { unfold sabort. simpl. right.
+ remember (mk_sistate_exit _ _ _ _) as ext. exists ext, (si_exits st).
+ constructor; [constructor; subst; simpl; auto|].
+ left. subst; simpl; auto.
+ unfold seval_condition.
+ erewrite seval_list_sval_inj; simpl; auto.
+ try_simplify_someHyps. }
Qed.
@@ -772,8 +713,7 @@ Lemma siexec_inst_correct_None ge sp i st rs0 m0 rs m:
istep ge i sp rs m = None.
Proof.
intros (PRE & MEM & REG).
- destruct i; simpl; unfold sist_set_local, ssem_internal, ssem_local; simpl;
- try destruct Pos.eq_dec; try_simplify_someHyps.
+ destruct i; simpl; unfold sist_set_local, ssem_internal, ssem_local; simpl; try_simplify_someHyps.
Qed.
(** * Symbolic execution of the internal steps of a path *)
@@ -790,8 +730,7 @@ Lemma siexec_inst_add_exits i st st':
siexec_inst i st = Some st' ->
( si_exits st' = si_exits st \/ exists ext, si_exits st' = ext :: si_exits st ).
Proof.
- destruct i; simpl; intro SISTEP; inversion SISTEP; unfold siexec_inst; simpl;
- try destruct Pos.eq_dec; try_simplify_someHyps.
+ destruct i; simpl; intro SISTEP; inversion_clear SISTEP; unfold siexec_inst; simpl; (discriminate || eauto).
Qed.
Lemma siexec_inst_preserves_allfu ge sp ext lx rs0 m0 st st' i:
@@ -801,8 +740,7 @@ Lemma siexec_inst_preserves_allfu ge sp ext lx rs0 m0 st st' i:
Proof.
intros ALLFU SISTEP. destruct ALLFU as (ISTAIL & ALLF).
constructor; eauto.
- destruct i; simpl in SISTEP; inversion SISTEP; simpl;
- try destruct Pos.eq_dec; try_simplify_someHyps.
+ destruct i; simpl in SISTEP; inversion_clear SISTEP; simpl; (discriminate || eauto).
Qed.
Lemma siexec_path_correct_false ge sp f rs0 m0 st' is:
@@ -881,9 +819,6 @@ Proof.
(* icontinue is0 = true *)
intros; eapply IHpath; eauto.
destruct i; simpl in * |- *; unfold sist_set_local in * |- *; try_simplify_someHyps.
- { destruct Pos.eq_dec; simpl.
- { intros. inversion Hst1. simpl; auto. }
- { intros. inversion Hst1. simpl; auto. } }
(* icontinue is0 = false -> EARLY EXIT *)
destruct (siexec_path path f st1) as [st2|] eqn: Hst2; simpl; eauto.
destruct WF. erewrite siexec_inst_default_succ; eauto.
@@ -1144,7 +1079,7 @@ Lemma sexec_final_correct pge ge sp i (f:function) pc st stack rs0 m0 t rs m s:
ssem_final pge ge sp pc stack f rs0 m0 (sexec_final i (si_local st)) rs m t s.
Proof.
intros PC1 PC2 (PRE&MEM&REG) LAST. destruct LAST; subst; try_simplify_someHyps; simpl.
- + (* Snone *) intro Hi; destruct i; simpl in Hi |- *; try destruct Pos.eq_dec in *; unfold sist_set_local in Hi; try congruence.
+ + (* Snone *) intro Hi; destruct i; simpl in Hi |- *; unfold sist_set_local in Hi; try congruence.
+ (* Icall *) intros; eapply exec_Scall; auto.
- destruct ros; simpl in * |- *; auto.
rewrite REG; auto.
@@ -1191,13 +1126,11 @@ Proof.
+ (* Ibuiltin *) intros HPC SMEM.
eapply exec_Ibuiltin; eauto.
eapply seval_builtin_args_complete; eauto.
- + (* Icond *) intros HPC SMEM.
- destruct Pos.eq_dec in HPC; try discriminate.
+ (* Ijumptable *) intros HPC SMEM.
- eapply exec_Ijumptable; eauto; congruence.
+ eapply exec_Ijumptable; eauto.
+ congruence.
+ (* Ireturn *)
- intros; subst.
- enough (v=regmap_optget or Vundef rs) as ->.
+ intros; subst. enough (v=regmap_optget or Vundef rs) as ->.
* eapply exec_Ireturn; eauto.
* intros; destruct or; simpl; congruence.
Qed.
@@ -1531,6 +1464,7 @@ Proof.
destruct (icontinue is) eqn:ICONT.
{ destruct SEM as (SEML & SIPC & ALLF).
exploit siexec_inst_early_exit_absurd; eauto. contradiction. }
+
eexists. econstructor 1.
*** eapply exec_early_exit; eauto.
*** destruct ISTEPS as (ext & lx & SSEME & ALLFU). destruct SEM as (ext' & lx' & SSEME' & ALLFU').