let join_env e1 e2 =
  let join_opt v1 v2 = match v1, v2 with
    | NoneNone -> None
    | Some v, None | NoneSome v -> Some v
    | Some v1, Some v2 -> Some (Cvalue.Model.join v1 v2)
  in {
    e_cur = (assert (e1.e_cur = e2.e_cur); e1.e_cur);
    e_pre =  Cvalue.Model.join e1.e_pre  e2.e_pre;
    e_here = Cvalue.Model.join e1.e_here e2.e_here;
    e_old = join_opt e1.e_old e2.e_old;
    e_post = join_opt e1.e_post e2.e_post;
  }