let rec iter_read_il f = function
    ILstmtIf( t, n, m ) -> f n
  | ILstmtSwitch( n, jump_table ) -> f n
  | ILstmtGoto _ -> ()
  | ILstmtReturn None -> ()
  | ILstmtReturn (Some n) -> f n
  | ILstmtAssign( n, t, e ) -> iter_read_expr f e
  | ILstmtRead( n, t, lv, l ) -> iter_read_lvalue f lv
  | ILstmtWriteILlvTemp _, _, _ ) -> assert false
  | ILstmtWrite( lv, l, n ) -> iter_read_lvalue f lv; f n
  | ILstmtInitialize( n, t, i ) -> f n
  | ILstmtSequence l -> List.iter (iter_read_il f) l
  | ILstmtParallel l -> List.iter (iter_read_il f) l