open Optimize_local open Opt_tmp open Syntax let remove_case_with_only_default = function Case (s, [], st) -> st | a -> a let rec create_or_cond_from_list s = function [] -> [] | i::il -> (Equals(s, i)::create_or_cond_from_list s il) let rec create_elseif_list_from_arm_list s = function [] -> [] | Arm([],st)::r -> create_elseif_list_from_arm_list s r (* I remove this switch because it cannot be called This should never occur because such arms were already removed *) | Arm(il,st)::r -> (Elseif(Or(create_or_cond_from_list s il), st)::create_elseif_list_from_arm_list s r) let rec remove_useless_arms = function [] -> [] | Arm([], st)::r -> remove_useless_arms r | h::t -> (h::remove_useless_arms t) let rec remove_case_with_many_arm = function | Case (s, [], st) -> st | Case (s, Arm([], st)::al, dst) -> remove_case_with_many_arm (Case(s, al, dst)) (* this switch is removed because it can never be called *) | Case (s, Arm(il,st)::al, dst) -> ( let al' = remove_useless_arms al in let ocst = Case (s, Arm(il,st)::al', dst) in let newst = If(Or (create_or_cond_from_list s il), st, create_elseif_list_from_arm_list s al', dst) in if (Cout.cout_mem_st newst) < (Cout.cout_mem_st ocst) then newst else ocst ) | a -> a