let doGuard stmt exp t =
    let not_exp = new_exp ~loc:exp.eloc (UnOp(LNot, exp, intType)) in
    let th, el as thel =
      doGuardOneCond stmt exp t, doGuardOneCond stmt not_exp t
    in
    let current_condition_status =
      try
        Cil_datatype.Stmt.Hashtbl.find conditions_table stmt
      with Not_found -> 0
    in
    let new_status =
      ( if (current_condition_status land mask_then) <> 0
        then mask_then
        else
          match th with
            Dataflow.GUse _ | Dataflow.GDefault -> mask_then
          | Dataflow.GUnreachable -> 0) lor
      ( if (current_condition_status land mask_else) <> 0
        then mask_else
        else
          match el with
            Dataflow.GUse _ | Dataflow.GDefault -> mask_else
          | Dataflow.GUnreachable -> 0)
    in
    if new_status <> 0
    then Cil_datatype.Stmt.Hashtbl.replace conditions_table stmt new_status;
    Separate.filter_if stmt thel