let combine ~old m =
     match old, m with
     | T.SpareT.Spare -> (false, old)
     | T.Cav old_d, T.Spare ->
         if D.is_bottom old_d then (true, m) else (false, old)
     | T.SpareT.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)