let make_dominance_tree f =
    let size = Array.length f in
    let children = Array.create size [] in
    let root = ref [] in
    for i = 0 to size - 1 do
        let dominator = f.(i).immediate_dominator in
        if dominator != -1 then
            children.(dominator) <- i::children.(dominator)
        else
            root := i::!root
    done;
    for i = 0 to size - 1 do
        children.(i) <- List.rev children.(i)
    done;
    List.rev !root, children