let insert_phi_function f =
    let size = Array.length f in
    let df = find_dominance_frontier f in
    let assignment = find_assignment_node f in
    let phi_target = Array.create size [] in
    let rec insert r t i =
        if not (List.mem_assoc r phi_target.(i)) then
            phi_target.(i) <- ( r, t )::phi_target.(i);
        if not (List.mem_assoc r assignment.(i)) then begin
            assignment.(i) <- ( r, t )::assignment.(i);
            List.iter (insert r t) df.(i)
        end
    in
    for i = 0 to size - 1 do
        List.iter (function r, t -> List.iter (insert r t) df.(i)) assignment.(i)
    done;
    for i = 0 to size - 1 do
        let size = List.length f.(i).predecessor in
        let make( n, t ) = n, t, Array.create size n in
        f.(i).phi_function <- List.map make phi_target.(i)
    done