aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--riscV/ExpansionOracle.ml8
-rw-r--r--riscV/RTLpathSE_simplify.v111
-rw-r--r--scheduling/RTLpathSE_impl.v171
-rw-r--r--scheduling/RTLpathSE_simu_specs.v61
4 files changed, 180 insertions, 171 deletions
diff --git a/riscV/ExpansionOracle.ml b/riscV/ExpansionOracle.ml
index 9a3518c0..d3805738 100644
--- a/riscV/ExpansionOracle.ml
+++ b/riscV/ExpansionOracle.ml
@@ -370,7 +370,7 @@ let rec write_tree exp current code' new_order =
| _ -> failwith "ExpansionOracle.write_tree: inconsistent instruction."
let expanse (sb : superblock) code pm =
- (*debug_flag := true;*)
+ debug_flag := true;
let new_order = ref [] in
let liveins = ref sb.liveins in
let exp = ref [] in
@@ -388,7 +388,7 @@ let expanse (sb : superblock) code pm =
debug "Iop/Ccomp\n";
exp := cond_int32s false c a1 a2 dest succ [];
was_exp := true
- | Iop (Ocmp (Ccompu c), a1 :: a2 :: nil, dest, succ) ->
+ (*| Iop (Ocmp (Ccompu c), a1 :: a2 :: nil, dest, succ) ->
debug "Iop/Ccompu\n";
exp := cond_int32u false c a1 a2 dest succ [];
was_exp := true
@@ -492,7 +492,7 @@ let expanse (sb : superblock) code pm =
debug "Icond/Cnotcompfs\n";
exp := expanse_cbranch_fp true cond_single c f1 f2 info succ1 succ2 [];
was_branch := true;
- was_exp := true
+ was_exp := true*)
| _ -> new_order := n :: !new_order);
if !was_exp then (
node := !node + 1;
@@ -510,7 +510,7 @@ let expanse (sb : superblock) code pm =
sb.instructions;
sb.instructions <- Array.of_list (List.rev !new_order);
sb.liveins <- !liveins;
- (*debug_flag := false;*)
+ debug_flag := false;
(!code', !pm')
let rec find_last_node_reg = function
diff --git a/riscV/RTLpathSE_simplify.v b/riscV/RTLpathSE_simplify.v
index 4fadcfdc..b9fe504e 100644
--- a/riscV/RTLpathSE_simplify.v
+++ b/riscV/RTLpathSE_simplify.v
@@ -1,9 +1,114 @@
+Require Import Integers.
Require Import Op Registers.
Require Import RTLpathSE_theory.
Require Import RTLpathSE_simu_specs.
+(* Useful functions for conditions/branches expansion *)
+
+Definition is_inv_cmp_int (cmp: comparison) : bool :=
+ match cmp with | Cle | Cgt => true | _ => false end.
+
+Definition is_inv_cmp_float (cmp: comparison) : bool :=
+ match cmp with | Cge | Cgt => true | _ => false end.
+
+Definition make_optR0 (is_x0 is_inv: bool) : option bool :=
+ if is_x0 then Some is_inv else None.
+
+(* Functions to manage lists of "fake" values *)
+
+Definition make_lhsv_cmp (is_inv: bool) (hv1 hv2: hsval) : list_hsval :=
+ let (hvfirst, hvsec) := if is_inv then (hv1, hv2) else (hv2, hv1) in
+ let lhsv := fScons hvfirst fSnil in
+ fScons hvsec lhsv.
+
+Definition make_lhsv_single (hvs: hsval) : list_hsval :=
+ fScons hvs fSnil.
+
+(* Expansion functions *)
+
+Definition cond_int32s (cmp: comparison) (lhsv: list_hsval) (optR0: option bool) :=
+ match cmp with
+ | Ceq => fSop (OEseqw optR0) lhsv
+ | Cne => fSop (OEsnew optR0) lhsv
+ | Clt | Cgt => fSop (OEsltw optR0) lhsv
+ | Cle | Cge =>
+ let hvs := (fSop (OEsltw optR0) lhsv) in
+ let hl := make_lhsv_single hvs in
+ fSop (OExoriw Int.one) hl
+ end.
+
+(* Target op simplifications using "fake" values *)
+
Definition target_op_simplify (op: operation) (lr: list reg) (hst: hsistate_local): option hsval :=
- None. (* default implementation *)
+ match op, lr with
+ | Ocmp (Ccomp c), a1 :: a2 :: nil =>
+ let fv1 := fsi_sreg_get hst a1 in
+ let fv2 := fsi_sreg_get hst a2 in
+ let is_inv := is_inv_cmp_int c in
+ let optR0 := make_optR0 false is_inv in
+ let lhsv := make_lhsv_cmp is_inv fv1 fv2 in
+ Some (cond_int32s c lhsv optR0)
+
+ (*| Ocmp (Ccompu c), a1 :: a2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ DO hv2 <~ hsi_sreg_get hst a2;;
+ let is_inv := is_inv_cmp_int c in
+ let optR0 := make_optR0 false is_inv in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ cond_int32u c lhsv optR0
+ | Ocmp (Ccompimm c imm), a1 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ expanse_condimm_int32s c hv1 imm
+ | Ocmp (Ccompuimm c imm), a1 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ expanse_condimm_int32u c hv1 imm
+ | Ocmp (Ccompl c), a1 :: a2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ DO hv2 <~ hsi_sreg_get hst a2;;
+ let is_inv := is_inv_cmp_int c in
+ let optR0 := make_optR0 false is_inv in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ cond_int64s c lhsv optR0
+ | Ocmp (Ccomplu c), a1 :: a2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ DO hv2 <~ hsi_sreg_get hst a2;;
+ let is_inv := is_inv_cmp_int c in
+ let optR0 := make_optR0 false is_inv in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ cond_int64u c lhsv optR0
+ | Ocmp (Ccomplimm c imm), a1 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ expanse_condimm_int64s c hv1 imm
+ | Ocmp (Ccompluimm c imm), a1 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst a1;;
+ expanse_condimm_int64u c hv1 imm
+ | Ocmp (Ccompf c), f1 :: f2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst f1;;
+ DO hv2 <~ hsi_sreg_get hst f2;;
+ let is_inv := is_inv_cmp_float c in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ expanse_cond_fp false cond_float c lhsv
+ | Ocmp (Cnotcompf c), f1 :: f2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst f1;;
+ DO hv2 <~ hsi_sreg_get hst f2;;
+ let is_inv := is_inv_cmp_float c in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ expanse_cond_fp true cond_float c lhsv
+ | Ocmp (Ccompfs c), f1 :: f2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst f1;;
+ DO hv2 <~ hsi_sreg_get hst f2;;
+ let is_inv := is_inv_cmp_float c in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ expanse_cond_fp false cond_single c lhsv
+ | Ocmp (Cnotcompfs c), f1 :: f2 :: nil =>
+ DO hv1 <~ hsi_sreg_get hst f1;;
+ DO hv2 <~ hsi_sreg_get hst f2;;
+ let is_inv := is_inv_cmp_float c in
+ DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
+ expanse_cond_fp true cond_single c lhsv*)
+ | _, _ => None
+ end.
+
Lemma target_op_simplify_correct op lr hst fsv ge sp rs0 m0 st args m: forall
(H: target_op_simplify op lr hst = Some fsv)
@@ -12,8 +117,8 @@ Lemma target_op_simplify_correct op lr hst fsv ge sp rs0 m0 st args m: forall
(OK1: seval_list_sval ge sp (list_sval_inj (map (si_sreg st) lr)) rs0 m0 = Some args)
(OK2: seval_smem ge sp (si_smem st) rs0 m0 = Some m),
seval_sval ge sp (hsval_proj fsv) rs0 m0 = eval_operation ge sp op args m.
-Proof.
+Proof. Admitted. (*
unfold target_op_simplify; simpl. congruence.
-Qed.
+ Qed.*)
Global Opaque target_op_simplify.
diff --git a/scheduling/RTLpathSE_impl.v b/scheduling/RTLpathSE_impl.v
index 9a50b627..f42a3492 100644
--- a/scheduling/RTLpathSE_impl.v
+++ b/scheduling/RTLpathSE_impl.v
@@ -432,63 +432,6 @@ Qed.
Global Opaque hlist_args.
Local Hint Resolve hlist_args_correct: wlp.
-(* BEGIN "fake" hsval without real hash-consing *)
-(* TODO:
- 1) put these definitions elsewhere ? in RTLpathSE_simu_specs.v ?
- 2) reuse these definitions in hSinput, hSop, etc
- in order to factorize proofs ?
-*)
-
-Definition fSinput (r: reg): hsval :=
- HSinput r unknown_hid.
-
-Lemma fSinput_correct r ge sp rs0 m0: (* useless trivial lemma ? *)
- sval_refines ge sp rs0 m0 (fSinput r) (Sinput r).
-Proof.
- auto.
-Qed.
-
-Definition fSop (op:operation) (lhsv: list_hsval): hsval :=
- HSop op lhsv unknown_hid.
-
-Lemma fSop_correct op lhsv ge sp rs0 m0 lsv sm m: forall
- (MEM: seval_smem ge sp sm rs0 m0 = Some m)
- (MVALID: forall b ofs, Mem.valid_pointer m b ofs = Mem.valid_pointer m0 b ofs)
- (LR: list_sval_refines ge sp rs0 m0 lhsv lsv),
- sval_refines ge sp rs0 m0 (fSop op lhsv) (Sop op lsv sm).
-Proof.
- intros; simpl. rewrite <- LR, MEM.
- destruct (seval_list_sval _ _ _ _); try congruence.
- eapply op_valid_pointer_eq; eauto.
-Qed.
-
-Definition fsi_sreg_get (hst: PTree.t hsval) r: hsval :=
- match PTree.get r hst with
- | None => fSinput r
- | Some sv => sv
- end.
-
-Lemma fsi_sreg_get_correct hst r ge sp rs0 m0 (f: reg -> sval): forall
- (RR: forall r, hsi_sreg_eval ge sp hst r rs0 m0 = seval_sval ge sp (f r) rs0 m0),
- sval_refines ge sp rs0 m0 (fsi_sreg_get hst r) (f r).
-Proof.
- unfold hsi_sreg_eval, hsi_sreg_proj, fsi_sreg_get; intros; simpl.
- rewrite <- RR. destruct (hst ! r); simpl; auto.
-Qed.
-
-Definition fSnil: list_hsval :=
- HSnil unknown_hid.
-
-(* TODO: Lemma fSnil_correct *)
-
-Definition fScons (hsv: hsval) (lhsv: list_hsval): list_hsval :=
- HScons hsv lhsv unknown_hid.
-
-(* TODO: Lemma fScons_correct *)
-
-(* END "fake" hsval ... *)
-
-
(** Convert a "fake" hash-consed term into a "real" hash-consed term *)
Fixpoint fsval_proj hsv: ?? hsval :=
@@ -707,15 +650,6 @@ Qed.
(* TODO gourdinl MOVE EXPANSIONS BELOW ELSEWHERE *)
-Definition is_inv_cmp_int (cmp: comparison) : bool :=
- match cmp with | Cle | Cgt => true | _ => false end.
-
-Definition is_inv_cmp_float (cmp: comparison) : bool :=
- match cmp with | Cge | Cgt => true | _ => false end.
-
-Definition make_optR0 (is_x0 is_inv: bool) : option bool :=
- if is_x0 then Some is_inv else None.
-
(* TODO gourdinl IF NEEDED LATER Fixpoint hlist_sval (l: list hsval): ?? list_hsval :=
match l with
| nil => hSnil()
@@ -724,18 +658,7 @@ Definition make_optR0 (is_x0 is_inv: bool) : option bool :=
hScons r lhsv
end.*)
-Definition make_lhsv_cmp (is_inv: bool) (hv1 hv2: hsval) : ?? list_hsval :=
- DO hnil <~ hSnil();;
- let (hvfirst, hvsec) := if is_inv then (hv1, hv2) else (hv2, hv1) in
- DO lhsv <~ hScons hvfirst hnil;;
- DO lhsv <~ hScons hvsec lhsv;;
- RET lhsv.
-
-Definition make_lhsv_single (hvs: hsval) : ?? list_hsval :=
- DO hnil <~ hSnil();;
- DO hl <~ hScons hvs hnil;;
- RET hl.
-
+(*
Definition load_hilo32 (hi lo: int) :=
DO hnil <~ hSnil();;
if Int.eq lo Int.zero then
@@ -805,16 +728,6 @@ Definition xorimm64 (hv1: hsval) (n: int64) := opimm64 hv1 n Oxorl OExoril.
Definition sltimm64 (hv1: hsval) (n: int64) := opimm64 hv1 n (OEsltl None) OEsltil.
Definition sltuimm64 (hv1: hsval) (n: int64) := opimm64 hv1 n (OEsltul None) OEsltiul.
-Definition cond_int32s (cmp: comparison) (lhsv: list_hsval) (optR0: option bool) :=
- match cmp with
- | Ceq => hSop (OEseqw optR0) lhsv
- | Cne => hSop (OEsnew optR0) lhsv
- | Clt | Cgt => hSop (OEsltw optR0) lhsv
- | Cle | Cge =>
- DO hvs <~ (hSop (OEsltw optR0) lhsv);;
- DO hl <~ make_lhsv_single hvs;;
- hSop (OExoriw Int.one) hl
- end.
Definition cond_int32u (cmp: comparison) (lhsv: list_hsval) (optR0: option bool) :=
match cmp with
@@ -954,11 +867,12 @@ Definition expanse_condimm_int64u (cmp: comparison) (hv1: hsval) (n: int64) :=
DO hl <~ make_lhsv_cmp is_inv hv1 hvs;;
cond_int64u cmp hl optR0
end.
+ *)
(** simplify a symbolic value before assignment to a register *)
Definition simplify (rsv: root_sval) (lr: list reg) (hst: hsistate_local): ?? hsval :=
match rsv with
- | Rop (Omove as op) =>
+ | Rop op =>
match is_move_operation op lr with
| Some arg => hsi_sreg_get hst arg (* optimization of Omove *)
| None =>
@@ -969,84 +883,12 @@ Definition simplify (rsv: root_sval) (lr: list reg) (hst: hsistate_local): ?? hs
hSop op lhsv
end
end
- | Rop ((Ocmp cond) as op) =>
- match cond, lr with
- | (Ccomp c), a1 :: a2 :: nil =>
- DO hv1 <~ hsi_sreg_get hst a1;;
- DO hv2 <~ hsi_sreg_get hst a2;;
- let is_inv := is_inv_cmp_int c in
- let optR0 := make_optR0 false is_inv in
- DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
- cond_int32s c lhsv optR0
- | (Ccompu c), a1 :: a2 :: nil =>
- DO hv1 <~ hsi_sreg_get hst a1;;
- DO hv2 <~ hsi_sreg_get hst a2;;
- let is_inv := is_inv_cmp_int c in
- let optR0 := make_optR0 false is_inv in
- DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
- cond_int32u c lhsv optR0
- | (Ccompimm c imm), a1 :: nil =>
- DO hv1 <~ hsi_sreg_get hst a1;;
- expanse_condimm_int32s c hv1 imm
- | (Ccompuimm c imm), a1 :: nil =>
- DO hv1 <~ hsi_sreg_get hst a1;;
- expanse_condimm_int32u c hv1 imm
- | (Ccompl c), a1 :: a2 :: nil =>
- DO hv1 <~ hsi_sreg_get hst a1;;
- DO hv2 <~ hsi_sreg_get hst a2;;
- let is_inv := is_inv_cmp_int c in
- let optR0 := make_optR0 false is_inv in
- DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
- cond_int64s c lhsv optR0
- | (Ccomplu c), a1 :: a2 :: nil =>
- DO hv1 <~ hsi_sreg_get hst a1;;
- DO hv2 <~ hsi_sreg_get hst a2;;
- let is_inv := is_inv_cmp_int c in
- let optR0 := make_optR0 false is_inv in
- DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
- cond_int64u c lhsv optR0
- | (Ccomplimm c imm), a1 :: nil =>
- DO hv1 <~ hsi_sreg_get hst a1;;
- expanse_condimm_int64s c hv1 imm
- | (Ccompluimm c imm), a1 :: nil =>
- DO hv1 <~ hsi_sreg_get hst a1;;
- expanse_condimm_int64u c hv1 imm
- | (Ccompf c), f1 :: f2 :: nil =>
- DO hv1 <~ hsi_sreg_get hst f1;;
- DO hv2 <~ hsi_sreg_get hst f2;;
- let is_inv := is_inv_cmp_float c in
- DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
- expanse_cond_fp false cond_float c lhsv
- | (Cnotcompf c), f1 :: f2 :: nil =>
- DO hv1 <~ hsi_sreg_get hst f1;;
- DO hv2 <~ hsi_sreg_get hst f2;;
- let is_inv := is_inv_cmp_float c in
- DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
- expanse_cond_fp true cond_float c lhsv
- | (Ccompfs c), f1 :: f2 :: nil =>
- DO hv1 <~ hsi_sreg_get hst f1;;
- DO hv2 <~ hsi_sreg_get hst f2;;
- let is_inv := is_inv_cmp_float c in
- DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
- expanse_cond_fp false cond_single c lhsv
- | (Cnotcompfs c), f1 :: f2 :: nil =>
- DO hv1 <~ hsi_sreg_get hst f1;;
- DO hv2 <~ hsi_sreg_get hst f2;;
- let is_inv := is_inv_cmp_float c in
- DO lhsv <~ make_lhsv_cmp is_inv hv1 hv2;;
- expanse_cond_fp true cond_single c lhsv
- | _, _ =>
- DO lhsv <~ hlist_args hst lr;;
- hSop op lhsv
- end
- | Rop op =>
- DO lhsv <~ hlist_args hst lr;;
- hSop op lhsv
| Rload _ chunk addr =>
DO lhsv <~ hlist_args hst lr;;
hSload hst NOTRAP chunk addr lhsv
end.
+(*
Lemma simplify_nothing lr (hst: hsistate_local) op:
WHEN DO lhsv <~ hlist_args hst lr;; hSop op lhsv ~> hv
THEN (forall (ge : RTL.genv) (sp : val) (rs0 : regset)
@@ -1905,7 +1747,7 @@ Proof.
4: replace (Clt) with (swap_comparison Cgt) by auto; rewrite <- Float32.cmp_swap; simpl.
5: replace (Cle) with (swap_comparison Cge) by auto; rewrite <- Float32.cmp_swap; simpl.
all: destruct (Float32.cmp _ _ _); trivial.
-Qed.
+ Qed.*)
Lemma simplify_correct rsv lr hst:
WHEN simplify rsv lr hst ~> hv THEN forall ge sp rs0 m0 st
@@ -2053,6 +1895,7 @@ Definition make_lr_prev_cmp (is_inv: bool) (a1 a2: reg) (prev: hsistate_local) :
if is_inv then
hlist_args prev*)
+(*
Definition transl_cbranch_int32s (cmp: comparison) (optR0: option bool) :=
match cmp with
| Ceq => CEbeqw optR0
@@ -2205,7 +2048,7 @@ Definition cbranch_expanse (prev: hsistate_local) (cond: condition) (args: list
| _, _ =>
DO vargs <~ hlist_args prev args;;
RET (cond, vargs)
- end.
+ end.*)
(** ** Execution of one instruction *)
diff --git a/scheduling/RTLpathSE_simu_specs.v b/scheduling/RTLpathSE_simu_specs.v
index 589cf25f..c6a4d409 100644
--- a/scheduling/RTLpathSE_simu_specs.v
+++ b/scheduling/RTLpathSE_simu_specs.v
@@ -12,6 +12,7 @@ Local Open Scope error_monad_scope.
Local Open Scope option_monad_scope.
Require Export Impure.ImpHCons.
+Import HConsing.
Import ListNotations.
Local Open Scope list_scope.
@@ -304,6 +305,66 @@ Inductive hfinal_refines: hsfval -> sfval -> Prop :=
End HFINAL_REFINES.
+(* TODO gourdinl Leave this here ? *)
+Section FAKE_HSVAL.
+(* BEGIN "fake" hsval without real hash-consing *)
+(* TODO:
+ 1) put these definitions elsewhere ? in RTLpathSE_simu_specs.v ?
+ 2) reuse these definitions in hSinput, hSop, etc
+ in order to factorize proofs ?
+*)
+
+Definition fSinput (r: reg): hsval :=
+ HSinput r unknown_hid.
+
+Lemma fSinput_correct r ge sp rs0 m0: (* useless trivial lemma ? *)
+ sval_refines ge sp rs0 m0 (fSinput r) (Sinput r).
+Proof.
+ auto.
+Qed.
+
+Definition fSop (op:operation) (lhsv: list_hsval): hsval :=
+ HSop op lhsv unknown_hid.
+
+Lemma fSop_correct op lhsv ge sp rs0 m0 lsv sm m: forall
+ (MEM: seval_smem ge sp sm rs0 m0 = Some m)
+ (MVALID: forall b ofs, Mem.valid_pointer m b ofs = Mem.valid_pointer m0 b ofs)
+ (LR: list_sval_refines ge sp rs0 m0 lhsv lsv),
+ sval_refines ge sp rs0 m0 (fSop op lhsv) (Sop op lsv sm).
+Proof.
+ intros; simpl. rewrite <- LR, MEM.
+ destruct (seval_list_sval _ _ _ _); try congruence.
+ eapply op_valid_pointer_eq; eauto.
+Qed.
+
+Definition fsi_sreg_get (hst: PTree.t hsval) r: hsval :=
+ match PTree.get r hst with
+ | None => fSinput r
+ | Some sv => sv
+ end.
+
+Lemma fsi_sreg_get_correct hst r ge sp rs0 m0 (f: reg -> sval): forall
+ (RR: forall r, hsi_sreg_eval ge sp hst r rs0 m0 = seval_sval ge sp (f r) rs0 m0),
+ sval_refines ge sp rs0 m0 (fsi_sreg_get hst r) (f r).
+Proof.
+ unfold hsi_sreg_eval, hsi_sreg_proj, fsi_sreg_get; intros; simpl.
+ rewrite <- RR. destruct (hst ! r); simpl; auto.
+Qed.
+
+Definition fSnil: list_hsval :=
+ HSnil unknown_hid.
+
+(* TODO: Lemma fSnil_correct *)
+
+Definition fScons (hsv: hsval) (lhsv: list_hsval): list_hsval :=
+ HScons hsv lhsv unknown_hid.
+
+(* TODO: Lemma fScons_correct *)
+
+(* END "fake" hsval ... *)
+
+End FAKE_HSVAL.
+
Record hsstate := { hinternal:> hsistate; hfinal: hsfval }.