let find_dominance_frontier f =
let size = Array.length f in
let child = Array.create size [] in
for i = 0 to size - 1 do
let j = f.(i).immediate_dominator in
if j >= 0 then
child.(j) <- i::child.(j)
done;
(*
print_string ";
for i = 0 to size - 1 do
print_string ((string_of_int i)^"^(string_of_int_list child.(i))^")
done;
*)
let idom i = f.(i).immediate_dominator in
let df_local = Array.create size [] in
for i = 0 to size - 1 do
df_local.(i) <- List.filter (function j -> idom j != i) f.(i).successor
done;
(*
print_string ";
for i = 0 to size - 1 do
print_string ((string_of_int i)^"^(string_of_int_list df_local.(i))^")
done;
*)
let df = Array.copy df_local in
let rec continue x =
List.iter continue child.(x);
let find_up z =
let find y =
if idom y != x && not (List.mem y df.(x)) then
df.(x) <- y::df.(x)
in
List.iter find df.(z)
in
List.iter find_up child.(x)
in
continue 0;
(*
print_string ";
for i = 0 to size - 1 do
print_string ((string_of_int i)^"^(string_of_int_list df.(i))^")
done;
*)
df