let ssa_transform t f parameter_list =
    let f, variable_environment = promote_variable t parameter_list f in
    print_string "\ncheck 1:\n";
    for i = 0 to Array.length f - 1 do
        print_string (" ------------- "^(string_of_int i)^" ------------- \n");
        print_il_basic_block f.(i)
    done;
    find_dominator f;
    insert_phi_function f;
    print_string "\ncheck 2:\n";
    for i = 0 to Array.length f - 1 do
        print_string (" ------------- "^(string_of_int i)^" ------------- \n");
        print_il_basic_block f.(i)
    done;
    let max_variable_number = Array.length variable_environment in
    let f, max_variable_number, variable_environment = 
        make_ssa f max_variable_number variable_environment
    in
    print_string "\ncheck 3:\n";
    for i = 0 to Array.length f - 1 do
        print_string (" ------------- "^(string_of_int i)^" ------------- \n");
        print_il_basic_block f.(i)
    done;
    find_loop f;
    eliminate_redundant_move f max_variable_number;
    eliminate_unused_variable f max_variable_number variable_environment;
    print_string "\ncheck 4:\n";
    for i = 0 to Array.length f - 1 do
        print_string (" ------------- "^(string_of_int i)^" ------------- \n");
        print_il_basic_block f.(i)
    done;
    let max_variable_number, variable_environment =
        make_compact f max_variable_number variable_environment
    in
    print_string "\ncheck 5:\n";
    for i = 0 to Array.length f - 1 do
        print_string (" ------------- "^(string_of_int i)^" ------------- \n");
        print_il_basic_block f.(i)
    done;
    f, max_variable_number, variable_environment