anchor.diff:          in
           if Env.is_layered_effect env c2.effect_name
           then solve_layered_sub c1 edge c2
  -        else if problem.relation = EQ
  -        then solve_eq (lift_c1 ()) c2 Env.trivial_guard
  +        else if not wl.repr_subcomp_allowed
  +                && not (lid_equals c1.effect_name c2.effect_name)
  +                && Env.is_reifiable_effect env c2.effect_name
  +                  // GM: What I would like to write instead of these two
  +                  // last conjuncts is something like
  +                  // [Option.isSome edge.mlift.mlift_term],
  +                  // but it seems that we always carry around a Some
  +                  // (fun _ _ e -> e) instead of a None even for
  +                  // primitive effects.
  +        then giveup env (mklstr (fun () -> BU.format2 "Cannot lift from %s to %s, it needs a lift\n"
  +                                            (string_of_lid c1.effect_name)
  +                                            (string_of_lid c2.effect_name)))
  +                        orig
           else let is_null_wp_2 = c2.flags |> BU.for_some (function TOTAL | MLEFFECT | SOMETRIVIAL -> true | _ -> false) in
                let wpc1, wpc2 = match c1.effect_args, c2.effect_args with
                 | (wp1, _)::_, (wp2, _)::_ -> wp1, wp2
  
positive.code:   if debug env <| Options.Other "Rel" then
      BU.print3 "sub_comp of %s --and-- %s --with-- %s\n" (Print.comp_to_string c1) (Print.comp_to_string c2) (if rel = EQ then "EQ" else "SUB");
    let prob, wl = new_problem (empty_worklist env) env c1 rel c2 None (Env.get_range env) "sub_comp" in
    let prob = CProb prob in
    def_check_prob "sub_comp" prob;
    let (r, ms) = BU.record_time
  
negative.code:         solve env (attempt sub_probs wl) in
  
      let solve_sub c1 edge c2 =
          if problem.relation <> SUB then
            failwith "impossible: solve_sub";
          let r = Env.get_range env in
          let lift_c1 () =
               let univs =
  