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