let combine ~old m =
match old, m with
| T.Spare, T.Spare -> (false, old)
| T.Cav old_d, T.Spare ->
if D.is_bottom old_d then (true, m) else (false, old)
| T.Spare, T.Cav new_d ->
if D.is_bottom new_d then (false, old) else (true, m)
| T.Cav old_d, T.Cav new_d ->
let new_d = D.combine old_d new_d in
if old_d = new_d then (false, old) else (true, mk_mark new_d)