|
@@ -131,7 +131,22 @@ let rec propagate consts node =
|
|
|
| _ -> Cond (cond, texp, fexp, loc)
|
|
| _ -> Cond (cond, texp, fexp, loc)
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
- | node -> transform_children propagate node
|
|
|
|
|
|
|
+ | TypeCast (ctype, value, loc) ->
|
|
|
|
|
+ let value = propagate value in
|
|
|
|
|
+ (match (ctype, value) with
|
|
|
|
|
+ | (Bool, BoolConst (value, _)) -> BoolConst (value, loc)
|
|
|
|
|
+ | (Bool, IntConst (value, _)) -> BoolConst (value != 1, loc)
|
|
|
|
|
+ | (Bool, FloatConst (value, _)) -> BoolConst (value != 1.0, loc)
|
|
|
|
|
+ | (Int, BoolConst (value, _)) -> IntConst ((if value then 1 else 0), loc)
|
|
|
|
|
+ | (Int, IntConst (value, _)) -> IntConst (value, loc)
|
|
|
|
|
+ | (Int, FloatConst (value, _)) -> IntConst (int_of_float value, loc)
|
|
|
|
|
+ | (Float, BoolConst (value, _)) -> FloatConst ((if value then 1. else 0.), loc)
|
|
|
|
|
+ | (Float, IntConst (value, _)) -> FloatConst (float_of_int value, loc)
|
|
|
|
|
+ | (Float, FloatConst (value, _)) -> FloatConst (value, loc)
|
|
|
|
|
+ | _ -> TypeCast (ctype, value, loc)
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ | _ -> transform_children propagate node
|
|
|
|
|
|
|
|
let rec prune_vardecs consts = function
|
|
let rec prune_vardecs consts = function
|
|
|
| VarDec (ctype, name, init, loc) when Hashtbl.mem consts name -> Block []
|
|
| VarDec (ctype, name, init, loc) when Hashtbl.mem consts name -> Block []
|