|
@@ -31,6 +31,13 @@ let no_side_effect = function
|
|
|
| VarUse _ | Const _ | Var _ -> true
|
|
| VarUse _ | Const _ | Var _ -> true
|
|
|
| _ -> false
|
|
| _ -> false
|
|
|
|
|
|
|
|
|
|
+(* Redefine integer operators within this module since they are only used on
|
|
|
|
|
+ * IntVal values, which have type int32 *)
|
|
|
|
|
+let (+) = Int32.add
|
|
|
|
|
+let (-) = Int32.sub
|
|
|
|
|
+let (/) = Int32.div
|
|
|
|
|
+let ( * ) = Int32.mul
|
|
|
|
|
+
|
|
|
(* Constand folding *)
|
|
(* Constand folding *)
|
|
|
let eval = function
|
|
let eval = function
|
|
|
(* Binop - arithmetic *)
|
|
(* Binop - arithmetic *)
|
|
@@ -49,14 +56,14 @@ let eval = function
|
|
|
| Binop (Mul, Const (FloatVal left, _), Const (FloatVal right, _), ann) ->
|
|
| Binop (Mul, Const (FloatVal left, _), Const (FloatVal right, _), ann) ->
|
|
|
Const (FloatVal (left *. right), ann)
|
|
Const (FloatVal (left *. right), ann)
|
|
|
|
|
|
|
|
- | Binop (Div, Const (IntVal left, _), Const (IntVal right, _), ann) when right != 0 ->
|
|
|
|
|
|
|
+ | Binop (Div, Const (IntVal left, _), Const (IntVal right, _), ann) when right != 0l ->
|
|
|
Const (IntVal (left / right), ann)
|
|
Const (IntVal (left / right), ann)
|
|
|
| Binop (Div, Const (FloatVal left, _), Const (FloatVal right, _), ann) ->
|
|
| Binop (Div, Const (FloatVal left, _), Const (FloatVal right, _), ann) ->
|
|
|
Const (FloatVal (left /. right), ann)
|
|
Const (FloatVal (left /. right), ann)
|
|
|
|
|
|
|
|
- | Binop (Mod, Const (IntVal left, _), Const (IntVal right, _), ann) ->
|
|
|
|
|
|
|
+ (*| Binop (Mod, Const (IntVal left, _), Const (IntVal right, _), ann) ->
|
|
|
Const (IntVal (left mod right), ann)
|
|
Const (IntVal (left mod right), ann)
|
|
|
-
|
|
|
|
|
|
|
+*)
|
|
|
(* Binop - relational *)
|
|
(* Binop - relational *)
|
|
|
| Binop (Eq, Const (IntVal left, _), Const (IntVal right, _), ann) ->
|
|
| Binop (Eq, Const (IntVal left, _), Const (IntVal right, _), ann) ->
|
|
|
Const (BoolVal (left = right), ann)
|
|
Const (BoolVal (left = right), ann)
|
|
@@ -95,23 +102,26 @@ let eval = function
|
|
|
Const (BoolVal (left || right), ann)
|
|
Const (BoolVal (left || right), ann)
|
|
|
|
|
|
|
|
(* Monary operations *)
|
|
(* Monary operations *)
|
|
|
- | Monop (Not, Const (BoolVal value, _), ann) -> Const (BoolVal (not value), ann)
|
|
|
|
|
- | Monop (Neg, Const (IntVal value, _), ann) -> Const (IntVal (-value), ann)
|
|
|
|
|
- | Monop (Neg, Const (FloatVal value, _), ann) -> Const (FloatVal (-.value), ann)
|
|
|
|
|
|
|
+ | Monop (Not, Const (BoolVal value, _), ann) ->
|
|
|
|
|
+ Const (BoolVal (not value), ann)
|
|
|
|
|
+ | Monop (Neg, Const (IntVal value, _), ann) ->
|
|
|
|
|
+ Const (IntVal (Int32.neg value), ann)
|
|
|
|
|
+ | Monop (Neg, Const (FloatVal value, _), ann) ->
|
|
|
|
|
+ Const (FloatVal (-.value), ann)
|
|
|
|
|
|
|
|
(* 0 * a --> 0 *)
|
|
(* 0 * a --> 0 *)
|
|
|
- | Binop (Mul, Const (IntVal 0, _), other, ann)
|
|
|
|
|
- | Binop (Mul, other, Const (IntVal 0, _), ann) when no_side_effect other ->
|
|
|
|
|
- Const (IntVal 0, ann)
|
|
|
|
|
|
|
+ | Binop (Mul, Const (IntVal 0l, _), other, ann)
|
|
|
|
|
+ | Binop (Mul, other, Const (IntVal 0l, _), ann) when no_side_effect other ->
|
|
|
|
|
+ Const (IntVal 0l, ann)
|
|
|
|
|
|
|
|
(* 0 + a --> a *)
|
|
(* 0 + a --> a *)
|
|
|
- | Binop (Add, Const (IntVal 0, _), other, _)
|
|
|
|
|
- | Binop (Add, other, Const (IntVal 0, _), _) ->
|
|
|
|
|
|
|
+ | Binop (Add, Const (IntVal 0l, _), other, _)
|
|
|
|
|
+ | Binop (Add, other, Const (IntVal 0l, _), _) ->
|
|
|
other
|
|
other
|
|
|
|
|
|
|
|
(* 1 * a --> a *)
|
|
(* 1 * a --> a *)
|
|
|
- | Binop (Mul, Const (IntVal 1, _), other, _)
|
|
|
|
|
- | Binop (Mul, other, Const (IntVal 1, _), _) ->
|
|
|
|
|
|
|
+ | Binop (Mul, Const (IntVal 1l, _), other, _)
|
|
|
|
|
+ | Binop (Mul, other, Const (IntVal 1l, _), _) ->
|
|
|
other
|
|
other
|
|
|
|
|
|
|
|
(* true|false ? texp : fexp --> texp|fexp*)
|
|
(* true|false ? texp : fexp --> texp|fexp*)
|
|
@@ -164,13 +174,13 @@ let rec propagate consts node =
|
|
|
let value = propagate value in
|
|
let value = propagate value in
|
|
|
begin match (ctype, value) with
|
|
begin match (ctype, value) with
|
|
|
| (Bool, Const (BoolVal value, _)) -> Const (BoolVal value, ann)
|
|
| (Bool, Const (BoolVal value, _)) -> Const (BoolVal value, ann)
|
|
|
- | (Bool, Const (IntVal value, _)) -> Const (BoolVal (value != 1), ann)
|
|
|
|
|
|
|
+ | (Bool, Const (IntVal value, _)) -> Const (BoolVal (value != 1l), ann)
|
|
|
| (Bool, Const (FloatVal value, _)) -> Const (BoolVal (value != 1.0), ann)
|
|
| (Bool, Const (FloatVal value, _)) -> Const (BoolVal (value != 1.0), ann)
|
|
|
- | (Int, Const (BoolVal value, _)) -> Const (IntVal (if value then 1 else 0), ann)
|
|
|
|
|
|
|
+ | (Int, Const (BoolVal value, _)) -> Const (IntVal (if value then 1l else 0l), ann)
|
|
|
| (Int, Const (IntVal value, _)) -> Const (IntVal value, ann)
|
|
| (Int, Const (IntVal value, _)) -> Const (IntVal value, ann)
|
|
|
- | (Int, Const (FloatVal value, _)) -> Const (IntVal (int_of_float value), ann)
|
|
|
|
|
|
|
+ | (Int, Const (FloatVal value, _)) -> Const (IntVal (Int32.of_float value), ann)
|
|
|
| (Float, Const (BoolVal value, _)) -> Const (FloatVal (if value then 1. else 0.), ann)
|
|
| (Float, Const (BoolVal value, _)) -> Const (FloatVal (if value then 1. else 0.), ann)
|
|
|
- | (Float, Const (IntVal value, _)) -> Const (FloatVal (float_of_int value), ann)
|
|
|
|
|
|
|
+ | (Float, Const (IntVal value, _)) -> Const (FloatVal (Int32.to_float value), ann)
|
|
|
| (Float, Const (FloatVal value, _)) -> Const (FloatVal value, ann)
|
|
| (Float, Const (FloatVal value, _)) -> Const (FloatVal value, ann)
|
|
|
| _ -> TypeCast (ctype, value, ann)
|
|
| _ -> TypeCast (ctype, value, ann)
|
|
|
end
|
|
end
|