let reduce_by_left_comparison ~with_alarms eval pos expl binop expr state =
  try
    let loc,value_for_loc,typ_loc = eval_as_exact_loc ~with_alarms state expl in
(*    Format.printf "red_by_left1  %a %a %a@." 
      Locations.pretty loc
      Cvalue.V.pretty value_for_loc
      !d_type typ_loc; *)

    let cond_v = eval_expr ~with_alarms state expr in
    let v_sym = eval.eval_symetric pos binop cond_v value_for_loc in
    let v_asym = eval.eval_antisymetric ~typ_loc pos binop cond_v v_sym in
(*    Format.printf "red_by_left  %a@." Cvalue.V.pretty v_asym; *)
    if V.equal v_asym V.bottom then raise Reduce_to_bottom;
    if V.equal v_asym value_for_loc
    then state, Some loc
    else 
      (  Cvalue.Model.reduce_binding
          ~with_alarms:CilE.warn_none_mode
          state loc v_asym, 
      Some loc )
  with Not_an_exact_loc  -> state, None