method vfunc f =
currentFuncName:=f.svar.vname;
let starting_pre = (Data_for_aorai.get_func_pre f.svar.vname) in
let starting_post = (Data_for_aorai.get_func_post_bycase f.svar.vname) in
Hashtbl.clear labelled_stmts_pre;
Hashtbl.clear stmts_to_compute_one_more_time;
propagation_result := (mk_empty_pre_or_post_bycase ());
let cur_pre = Aorai_utils.mk_pre_or_post_bycase_from_pre_or_post (Data_for_aorai.get_func_pre f.svar.vname) in
let _ = propagates_pre f.sbody.bstmts cur_pre in
let cur_post_st = ref (fst !propagation_result) in
while (Hashtbl.length stmts_to_compute_one_more_time) > 0 do
let _ = propagates_pre f.sbody.bstmts cur_pre in
cur_post_st := fst (!propagation_result)
done;
let post = Aorai_utils.get_next_bycase f.svar.vname Promelaast.Return !cur_post_st in
let old_post = (Data_for_aorai.get_func_post_bycase f.svar.vname) in
let post = double_bool_array_and_bycase post old_post in
Data_for_aorai.set_func_post_bycase f.svar.vname post;
let cur_post = (Data_for_aorai.get_func_post_bycase f.svar.vname) in
let cur_post = Aorai_utils.get_prev_bycase f.svar.vname Promelaast.Return cur_post in
Hashtbl.clear labelled_stmts_pre;
Hashtbl.clear status_of_labelled_stmts;
Hashtbl.clear old_observed_labelled_stmts_pre;
second_computation_needed:=false;
let cur_pre = ref (propagates_post f.sbody.bstmts cur_post) in
while !second_computation_needed do
Hashtbl.clear status_of_labelled_stmts;
second_computation_needed:=false;
cur_pre := propagates_post f.sbody.bstmts cur_post
done;
let cur_pre = pre_flattening !cur_pre in
let old_pre = Data_for_aorai.get_func_pre f.svar.vname in
let pre = double_bool_array_and cur_pre old_pre in
Data_for_aorai.set_func_pre f.svar.vname pre;
Aorai_option.debug "After pass 2 for function %s" f.svar.vname;
Aorai_utils.debug_display_func_status f.svar.vname;
let merge tbl1 tbl2 get set =
Hashtbl.iter
(fun key value ->
let v1 = double_bool_array_and_bycase value (Hashtbl.find tbl2 key) in
let v2 = get key in
if not( double_bool_array_eq_bycase v2 v1 ) then begin
set key ( double_bool_array_and_bycase v2 v1 );
spec_modified:=true
end
)
tbl1
in
merge loop_fwd_ext_pre loop_bwd_ext_pre Data_for_aorai.get_loop_ext_pre_bycase Data_for_aorai.set_loop_ext_pre_bycase;
merge loop_fwd_int_pre loop_bwd_int_pre Data_for_aorai.get_loop_int_pre_bycase Data_for_aorai.set_loop_int_pre_bycase;
merge loop_fwd_int_post loop_bwd_int_post Data_for_aorai.get_loop_int_post_bycase Data_for_aorai.set_loop_int_post_bycase;
let ending_pre = (Data_for_aorai.get_func_pre f.svar.vname) in
let ending_post = (Data_for_aorai.get_func_post_bycase f.svar.vname) in
if (not (double_bool_array_eq starting_pre ending_pre ) )
then begin spec_modified:=true; end;
if (not (double_bool_array_eq_bycase starting_post ending_post) )
then begin spec_modified:=true; end;
DoChildren