let doGuardOneCond stmt exp t =
if State_set.is_empty (t.value)
then Dataflow.GUnreachable
else begin
CilE.start_stmt (Kstmt stmt);
let with_alarms = warn_all_quiet_mode () in
let new_values =
State_set.fold
(fun acc state ->
let test =
eval_expr
~with_alarms
state exp
in
CilE.set_syntactic_context
(CilE.SyBinOp (Ne, Cil.zero ~loc:exp.eloc, exp));
let warn, _, test =
check_comparable Eq V.singleton_zero test
in
let do_it =
(warn && Value_parameters.UndefinedPointerComparisonPropagateAll.get ()) ||
let t1 = unrollType (typeOf exp) in
if isIntegralType t1 || isPointerType t1
then V.contains_non_zero test
else true
in
if do_it then
try
State_set.add
(reduce_by_cond ~with_alarms:CilE.warn_none_mode
state {positive = true; exp = exp})
acc
with Reduce_to_bottom -> acc
else acc)
State_set.empty
t.value
in
let result =
if State_set.is_empty new_values then Dataflow.GUnreachable
else Dataflow.GUse {t with value = new_values}
in
CilE.end_stmt ();
result
end