let instrRDs il sid (_ivih, s, iosh) out =
  if Hashtbl.mem iRDsHtbl (sid,out) then Hashtbl.find iRDsHtbl (sid,out) else

(*   let print_instr i (_,s', iosh') = *)
(*     let d = d_instr () i ++ line in *)
(*     fprint stdout 80 d; *)
(*     flush stdout *)
(*   in *)

  let proc_one hil i =
    match hil with
    | [] ->
        let _, defd = UD.computeUseDefInstr i in
        if UD.VS.is_empty defd
        then ((*if !debug then print_instr i ((), s, iosh);*)
              [((), s, iosh)])
        else
          let iosh' = IH.copy iosh in
          proc_defs defd iosh' (idMaker () s);
          (*if !debug then
            print_instr i ((), s + UD.VS.cardinal defd, iosh');*)

          ((), s + UD.VS.cardinal defd, iosh')::hil
    | (_, s', iosh')::_hrst as l ->
        let _, defd = UD.computeUseDefInstr i in
        if UD.VS.is_empty defd
        then
          ((*if !debug then
            print_instr i ((),s', iosh');*)

           ((), s', iosh')::l)
        else let iosh'' = IH.copy iosh' in
        proc_defs defd iosh'' (idMaker () s');
        (*if !debug then
          print_instr i ((), s' + UD.VS.cardinal defd, iosh'');*)

        ((),s' + UD.VS.cardinal defd, iosh'')::l
  in
  let folded = List.fold_left proc_one [((),s,iosh)] [il] in
  let foldedout = List.tl (List.rev folded) in
  let foldednotout = List.rev (List.tl folded) in
  Hashtbl.add iRDsHtbl (sid,true) foldedout;
  Hashtbl.add iRDsHtbl (sid,false) foldednotout;
  if out then foldedout else foldednotout