diff --git a/simplifier.ml b/simplifier.ml index 2ca9282..3822d60 100644 --- a/simplifier.ml +++ b/simplifier.ml @@ -1,15 +1,21 @@ open Ast +open Baselib let collect_constant_strings code = let counter = ref 0 in + let env = ref Env.empty in let ccs_value = function | V1.Void -> V2.Void, [] | V1.Bool b -> V2.Bool b, [] | V1.Int n -> V2.Int n, [] | V1.Str s -> - incr counter; - let lbl = "str" ^ string_of_int !counter in - V2.Data lbl, [ lbl, Mips.Asciiz s ] + (match Env.find_opt s !env with + | Some lbl -> V2.Data lbl, [ lbl, Mips.Asciiz s ] + | None -> + incr counter; + let lbl = "str" ^ string_of_int !counter in + env := Env.add s lbl !env; + V2.Data lbl, [ lbl, Mips.Asciiz s ]) in let rec ccs_expr = function | IR1.Val v -> @@ -17,8 +23,8 @@ let collect_constant_strings code = IR2.Val v2, cs | IR1.Var v -> IR2.Var v, [] | IR1.Call (fn, args) -> - let a2 = List.map ccs_expr args in - IR2.Call (fn, List.map fst a2), List.flatten (List.map snd a2) + let args2 = List.map ccs_expr args in + IR2.Call (fn, List.map fst args2), List.flatten (List.map snd args2) in let ccs_instr = function | IR1.Decl v -> IR2.Decl v, [] @@ -43,7 +49,11 @@ let collect_constant_strings code = IR2.Func (name, args, body2), cs in let code2 = List.map ccs_def code in - List.map fst code2, List.flatten (List.map snd code2) + ( List.map fst code2 + , List.fold_left + (fun list el -> if List.mem el list then list else el :: list) + [] + (List.flatten (List.map snd code2)) ) ;; let simplify ir = collect_constant_strings ir