let instrRDs il sid (_ivih, s, iosh) out =
if Hashtbl.mem iRDsHtbl (sid,out) then Hashtbl.find iRDsHtbl (sid,out) else
let proc_one hil i =
match hil with
| [] ->
let _, defd = UD.computeUseDefInstr i in
if UD.VS.is_empty defd
then (
[((), s, iosh)])
else
let iosh' = IH.copy iosh in
proc_defs defd iosh' (idMaker () s);
((), 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
(
((), s', iosh')::l)
else let iosh'' = IH.copy iosh' in
proc_defs defd iosh'' (idMaker () s');
((),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