Fixed complexity of control optimization
This commit is contained in:
parent
45fbd18fe8
commit
add09fe465
1 changed files with 18 additions and 5 deletions
|
@ -96,7 +96,7 @@ let is_deadcode = function (* TODO Etrange puisque c'est apres la passe de deadc
|
|||
| _ -> false
|
||||
|
||||
let rec joinlist j l =
|
||||
let l = List.filter (fun a -> not (is_deadcode a)) l in
|
||||
let rec join_next l =
|
||||
match l with
|
||||
| [] -> []
|
||||
| [s1] -> [s1]
|
||||
|
@ -104,11 +104,24 @@ let rec joinlist j l =
|
|||
match s1, s2 with
|
||||
| Acase(e1, h1),
|
||||
Acase(e2, h2) when Obc_compare.exp_compare e1 e2 = 0 ->
|
||||
if is_modified_handlers j e1 h1 then
|
||||
s1::(joinlist j (s2::l))
|
||||
let fused_switch = Acase(e1, joinhandlers j h1 h2) in
|
||||
if is_modified_handlers j e2 h1 then
|
||||
fused_switch::(join_first l)
|
||||
else
|
||||
joinlist j ((Acase(e1, joinhandlers j h1 h2))::l)
|
||||
| s1, s2 -> s1::(joinlist j (s2::l))
|
||||
join_next (fused_switch::l)
|
||||
| s1, s2 -> s1::(join_first (s2::l))
|
||||
and join_first l =
|
||||
match l with
|
||||
| [] -> []
|
||||
| (Acase(e1, h1))::l ->
|
||||
if is_modified_handlers j e1 h1 then
|
||||
(Acase(e1, h1))::(join_next l)
|
||||
else
|
||||
join_next ((Acase(e1, h1))::l)
|
||||
| _ -> join_next l
|
||||
in
|
||||
join_first l
|
||||
|
||||
|
||||
and join_block j b =
|
||||
{ b with b_body = joinlist j b.b_body }
|
||||
|
|
Loading…
Reference in a new issue