Quellcode durchsuchen

Added typecast to constant propagation

Taddeus Kroes vor 12 Jahren
Ursprung
Commit
931bf16fdc
1 geänderte Dateien mit 16 neuen und 1 gelöschten Zeilen
  1. 16 1
      phases/constant_propagation.ml

+ 16 - 1
phases/constant_propagation.ml

@@ -131,7 +131,22 @@ let rec propagate consts node =
         | _ -> 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
     | VarDec (ctype, name, init, loc) when Hashtbl.mem consts name -> Block []