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
      | NoneSome _ -> 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
      | NoneSome 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