anchor.diff:                if is_impure lc && not (is_reifiable env.tcenv lc)
                 then fallback() //we know it's not pure; so don't encode it precisely
                 else
  -                let cache_size = BU.smap_size env.cache in
  +                let cache_size = BU.smap_size env.cache in  //record the cache size before starting the encoding
                   let vars, guards, envbody, decls, _ = encode_binders None bs env in
                   let lc, body =
                     if is_reifiable env.tcenv lc
  
positive.code:                 in
                  let key_body = mkForall([], vars, mkImp(mk_and_l guards, body)) in
                  let cvars = Term.free_variables key_body in
                  let cvars =
                    match arrow_t_opt with
                    | None   -> cvars
  
negative.code: 
          let encoding = mkAnd(tm_has_type_with_fuel, refinement) in
  
          //earlier we used to get cvars from encoding
          //but mkAnd is optimized and when refinement is False, it returns False
          //in that case, cvars was turning out to be empty, resulting in non well-formed encoding (e.g. of hasEq, since free variables of base_t are not captured in cvars)
          //to get around that, computing cvars separately from the components of the encoding variable
          let cvars = BU.remove_dups fv_eq (Term.free_variables refinement @ Term.free_variables tm_has_type_with_fuel) in
          let cvars = cvars |> List.filter (fun (y, _) -> y <> x && y <> fsym) in
  
  