diff options
author | Bernhard Schommer <bernhardschommer@gmail.com> | 2023-02-13 11:59:41 +0100 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2023-02-20 09:43:38 +0100 |
commit | 9d06ed97f493f89ab41f1dc3962840eadacd3865 (patch) | |
tree | 5d4c5df92b19de4400d0dae39b2e7a79a7c5bf42 | |
parent | 243c0f7ce4e8b6c22ddd930bd470ab74187e5256 (diff) | |
download | compcert-9d06ed97f493f89ab41f1dc3962840eadacd3865.tar.gz compcert-9d06ed97f493f89ab41f1dc3962840eadacd3865.zip |
Ignore self assign in if-conversion
A self assign `x = x` can be classified as a skip in `classify_stmt`.
This helps with the if-conversion of some code that the previous passes
generates, e.g. for nested C conditional expressions.
Closes: #466
-rw-r--r-- | backend/Selection.v | 6 | ||||
-rw-r--r-- | backend/Selectionproof.v | 17 |
2 files changed, 19 insertions, 4 deletions
diff --git a/backend/Selection.v b/backend/Selection.v index ca1f1619..e4be867f 100644 --- a/backend/Selection.v +++ b/backend/Selection.v @@ -348,7 +348,11 @@ Inductive stmt_class : Type := Fixpoint classify_stmt (s: Cminor.stmt) : stmt_class := match s with | Cminor.Sskip => SCskip - | Cminor.Sassign id a => SCassign id a + | Cminor.Sassign id a => + match a with + | Cminor.Evar id2 => if ident_eq id id2 then SCskip else SCassign id a + | _ => SCassign id a + end | Cminor.Sbuiltin None (EF_debug _ _ _) _ => SCskip | Cminor.Sseq s1 s2 => match classify_stmt s1, classify_stmt s2 with diff --git a/backend/Selectionproof.v b/backend/Selectionproof.v index 5aeceb6b..acd7b7a4 100644 --- a/backend/Selectionproof.v +++ b/backend/Selectionproof.v @@ -918,8 +918,19 @@ Proof. - (* skip *) exists O; intros. constructor; auto. - (* assign *) - exists 1%nat; intros. apply eventually_step; intros. inv H0. - assert (v0 = v) by eauto using eval_expr_determ. subst v0. + assert (BASE: + exists n : nat, + forall (f : Cminor.function) (k : Cminor.cont) (sp : val) (e0 : env) (m : mem) (v : val), + Cminor.eval_expr ge sp e0 m e v -> + eventually n (Cminor.State f (Cminor.Sassign i e) k sp e0 m) (eq (Cminor.State f Cminor.Sskip k sp (PTree.set i v e0) m))). + { + exists 1%nat; intros. apply eventually_step; intros. inv H0. + assert (v0 = v) by eauto using eval_expr_determ. subst v0. + split; auto. apply eventually_now. auto. + } + destruct e; try destruct (ident_eq i i0); auto. + exists 1%nat. intros. apply eventually_step; intros. inv H. + rewrite PTree.gsident by (inv H9; auto). split; auto. apply eventually_now. auto. - (* builtin *) destruct o; auto. destruct e; auto. @@ -950,7 +961,7 @@ Lemma classify_stmt_wt: wt_expr env a (env id). Proof. induction s; simpl; intros CL WT; try discriminate. -- inv CL; inv WT; auto. +- destruct e; try destruct (ident_eq i i0); inv CL; inv WT; auto. - destruct o; try discriminate. destruct e; discriminate. - inv WT. destruct (classify_stmt s1), (classify_stmt s2); try discriminate; eauto. Qed. |