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
| ILstmtWrite( ILlvTemp _, _, _ ) -> 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