-
BRUN Lelio authoredBRUN Lelio authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
optimize_machine.ml 48.20 KiB
(********************************************************************)
(* *)
(* The LustreC compiler toolset / The LustreC Development Team *)
(* Copyright 2012 - -- ONERA - CNRS - INPT *)
(* *)
(* LustreC is free software, distributed WITHOUT ANY WARRANTY *)
(* under the terms of the GNU Lesser General Public License *)
(* version 2.1. *)
(* *)
(********************************************************************)
open Utils
open Lustre_types
open Spec_types
open Machine_code_types
open Corelang
open Causality
open Machine_code_common
module Mpfr = Lustrec_mpfr
let pp_no_effect fmt = Format.fprintf fmt ".. no effect.@ "
let pp_elim m fmt elim =
IMap.pp ~comment:"/* elim table: */" (pp_val m) fmt elim
let rec fixpoint f x =
let y, c = f x in
if c then fixpoint f y else y
let eliminate_var_decl elim m v a =
if is_memory m v then a else try IMap.find v.var_id elim with Not_found -> a
let rec eliminate_val m elim expr =
let eliminate_val = eliminate_val m in
match expr.value_desc with
| Var v ->
eliminate_var_decl elim m v expr
| Fun (id, vl) ->
{ expr with value_desc = Fun (id, List.map (eliminate_val elim) vl) }
| Array vl ->
{ expr with value_desc = Array (List.map (eliminate_val elim) vl) }
| Access (v1, v2) ->
{
expr with
value_desc = Access (eliminate_val elim v1, eliminate_val elim v2);
}
| Power (v1, v2) ->
{
expr with
value_desc = Power (eliminate_val elim v1, eliminate_val elim v2);
}
| Cst _ | ResetFlag ->
expr
let rec value_eq v1 v2 =
let values_eq = List.for_all2 value_eq in
match v1.value_desc, v2.value_desc with
| Var v1, Var v2 ->
v1.var_id = v2.var_id
| Fun (f1, vs1), Fun (f2, vs2) ->
f1 = f2 && values_eq vs1 vs2
| Array vs1, Array vs2 ->
values_eq vs1 vs2
| Access (v1, v2), Access (w1, w2) | Power (v1, v2), Power (w1, w2) ->
value_eq v1 w1 && value_eq v2 w2
| v1, v2 ->
v1 = v2
let eliminate_val m elim expr =
let f expr =