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
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
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