let doInstr stmt (i: instr) (d: t) =
    !Db.progress ();
    CilE.start_stmt (Kstmt stmt);
    let d_states = !(d.value) in
    let unreachable = State_set.is_empty d_states in
    let result =
      if unreachable then
        Dataflow.Done d
      else begin
          let apply_each_state f =
            Dataflow.Done
              {
                counter_unroll = 0;
                value =
                  ref
                    (State_set.fold
                        (fun state_value acc ->
                          State_set.add
                            (f state_value)
                            acc)
                        d_states
                        State_set.empty) }
          in
          (* update current statement *)
          match i with
          | Set (lv,exp,_loc) ->
              apply_each_state
                (fun state_value ->
                  do_assign
                    ~with_alarms:(warn_all_quiet_mode ())
                    state_value
                    lv
                    exp)
          | Call (None,
                 {enode = Lval (Var {vname=("__builtin_va_start"|"__builtin_va_arg"|"__builtin_va_end" as _builtin_name) },NoOffset)},
                 [{enode = Lval lv}],_loc) ->
(*              Format.printf "builtin: %s@." _builtin_name; *)
              apply_each_state
                (fun state_value ->
                  do_assign_abstract_value
                    ~with_alarms:(warn_all_quiet_mode ())
                    ~former_state:state_value
                    state_value
                    lv
                    Cvalue_type.V.top_int)
          | Call (lval_to_assign,funcexp,argl,_loc) ->
              Dataflow.Done
                {
                  counter_unroll = 0;
                  value =
                    ref (interp_call stmt lval_to_assign funcexp argl d_states)
                }
          | Asm _ ->
              Value_parameters.warning ~once:true ~current:true
                "assuming assembly code has no effects in function %t"
                pretty_current_cfunction_name;
              Dataflow.Default
          | Skip _ ->
              Dataflow.Default
          | Code_annot (_,_) -> (* processed in dostmt from Db *)
              Dataflow.Default
        end
    in
    CilE.end_stmt ();
    result