let compute_actions_invariant action_pre action_post =
let changed = ref false in
let merge_binding_opt loc base range1 range2 =
match range1, range2 with
| _, None -> range1
| None, Some _ -> changed:=true; range2
| Some r1, Some r2 ->
let res = Data_for_aorai.merge_range loc base r1 r2 in
if not (Data_for_aorai.Range.equal r1 res) then changed:=true;
Some res
in
let merge_bases loc bindings1 bindings2 =
match bindings1, bindings2 with
| _, None -> bindings1
| None, Some b2 -> changed:=true;
let b1 =
Cil_datatype.Term.Map.add
(Cil.lzero ()) (Fixed 0) Cil_datatype.Term.Map.empty
in
Some (Cil_datatype.Term.Map.merge (merge_binding_opt loc) b1 b2)
| Some b1, Some b2 ->
Some (Cil_datatype.Term.Map.merge (merge_binding_opt loc) b1 b2)
in
let map = Cil_datatype.Term.Map.merge merge_bases action_pre action_post in
!changed, map