anchor.diff:        NonTrivial g
       | _ -> g2
   
  +
   (*
    * e has type lc, and lc is either pure or ghost
    * This function inserts a return (x==e) in lc
  
positive.code:  *
   * This forces the lcomp thunk and recreates it to keep the callers same
   *)
  let maybe_assume_result_eq_pure_term_in_m env (m_opt:option<lident>) (e:term) (lc:lcomp) : lcomp =
    let should_return =
        not (env.lax)
     && Env.lid_exists env C.effect_GTot_lid //we're not too early in prims
     && should_return env (Some e) lc
     && not (TcComm.is_lcomp_partial_return lc)
    in
    (*
     * AR: m is the effect that we are going to do return in
     *)
  
negative.code:         (e2:term)
          (x, lc2)
     : lcomp =
     let env_x =
       match x with
       | None -> env
       | Some x -> Env.push_bv env x in
  
     //AR: use c1's effect to return c2 into
     let lc2 =
          let eff1 = Env.norm_eff_name env lc1.eff_name in
          let eff2 = Env.norm_eff_name env lc2.eff_name in
  
          if lid_equals eff2 C.effect_PURE_lid &&
             Env.join_opt env eff1 eff2 |> is_none &&
             Env.exists_polymonadic_bind env eff1 eff2 |> is_none
          then assume_result_eq_pure_term_in_m env_x (eff1 |> Some) e2 lc2
          else if (not (is_pure_or_ghost_effect env eff1)
               ||  should_not_inline_lc lc1)
               && is_pure_or_ghost_effect env eff2
          then maybe_assume_result_eq_pure_term_in_m env_x (eff1 |> Some) e2 lc2
          else lc2 in //the resulting computation is still pure/ghost and inlineable; no need to insert a return
     bind r env e1opt lc1 (x, lc2)
  
  