let rec process_stmt graph ~prev_list ~stmt =
  let ki_stmt = Kstmt stmt in

  add_links graph prev_list ki_stmt;

  match stmt.skind with
  | If (_,bthen,belse,_) ->
      let last_then = process_block graph bthen in
      let last_else = process_block graph belse in
      last_then @ last_else

  | Switch (_,blk,_,_)
  | Block blk -> process_block graph blk
  | UnspecifiedSequence seq ->
      process_block graph (Cil.block_from_unspecified_sequence seq)
  | Loop (_,body,_,_,_) ->
      let last_list = process_block graph body in
      add_links graph last_list ki_stmt; [ki_stmt]

  | Instr _
  | Return _ | Goto _ | Break _ | Continue _
  | TryFinally _ | TryExcept _
    -> [ki_stmt]

(** Process each statement in tail (statement list) knowing that the first element of 'tail' is the successor of every statement in prev_list. @return a list of the last statements in tail or prev_list if tail=[]. *)

and process_tail graph prev_list tail =
  match tail with
  | [] -> prev_list
  | s :: tail -> let s_last_stmt = process_stmt graph prev_list s in
                 let tail_last_stmt = process_tail graph s_last_stmt tail
                 in tail_last_stmt

(** Process each statement in blk with no previous statement to begin with *)

and process_block graph blk = process_tail graph [Kglobal]  blk.bstmts