let local_after_states superposed =
    lazy (
      let superposed = Lazy.force superposed in
      Stmt.Hashtbl.iter
        (fun stmt state ->
           List.iter
             (fun pred ->
                if not (store_state_after_during_dataflow pred stmt) then
                  try
                    let cur = Stmt.Hashtbl.find states_after pred in
                    Stmt.Hashtbl.replace states_after pred
                      (Cvalue.Model.join state cur)
                  with Not_found -> Stmt.Hashtbl.add states_after pred state
             ) stmt.preds;
        ) superposed;
      (* Since the return instruction has no successor, it is not visited
         by the iter above. We fill it manually *)

      (try
         let ret = Kernel_function.find_return (current_kf ()) in
         let s = Stmt.Hashtbl.find superposed ret in
         Stmt.Hashtbl.add states_after ret s
       with Kernel_function.No_Statement | Not_found -> ()
      );
      states_after
    )