let eliminate_unused_variable f max_variable_number variable_environment =
    let used = Array.create max_variable_number false in
    let mark n = used.(n) <- true in
    Array.iter (function b -> List.iter (function i -> iter_read_il mark i) b.code) f;
    let dirty = ref true in
    let diffuse( n, _, a ) =
        let mark_phi_function n =
            if not used.(n) then begin
                mark n;
                dirty := true
            end
        in
        if used.(n) then 
            Array.iter mark_phi_function a
    in
    while !dirty do
        dirty := false;
        for i = 0 to Array.length f - 1 do
            List.iter diffuse f.(i).phi_function
        done
    done;
    let used_phi_function( n, _, _ ) = used.(n) in
    let rec remove_unused_insn = function
        [] -> []
      |        i::l ->
          match i with
              ILstmtIf _ -> i::remove_unused_insn l
            | ILstmtSwitch _ -> i::remove_unused_insn l
            | ILstmtGoto _ -> i::remove_unused_insn l
            | ILstmtReturn _ -> i::remove_unused_insn l
            | ILstmtAssign( _, _, ILexpInvoke _ ) -> i::remove_unused_insn l
            | ILstmtAssign( n, _, _ ) ->
                if used.(n) then i::remove_unused_insn l else remove_unused_insn l
            | ILstmtRead( n, _, _, _ ) ->
                if used.(n) then i::remove_unused_insn l else remove_unused_insn l
            | ILstmtWriteILlvTemp _, _, _ ) -> assert false
            | ILstmtWrite _ -> i::remove_unused_insn l
            | ILstmtInitialize _ -> i::remove_unused_insn l
            | ILstmtSequence insn_list ->
                begin
                    match remove_unused_insn insn_list with
                        [] -> remove_unused_insn l
                      |        insn_list -> ILstmtSequence insn_list::remove_unused_insn l
                end
            | ILstmtParallel insn_list ->
                begin
                    match remove_unused_insn insn_list with
                        [] -> remove_unused_insn l
                      |        insn_list -> ILstmtParallel insn_list::remove_unused_insn l
                end
    in
    for i = 0 to Array.length f - 1 do
        f.(i).phi_function <- List.filter used_phi_function f.(i).phi_function;
        f.(i).code <- remove_unused_insn f.(i).code
    done