let getDefRhs didstmh defId =
if IH.mem rhsHtbl defId then IH.find rhsHtbl defId else
let stm =
try IH.find didstmh defId
with Not_found -> Kernel.fatal "getDefRhs: defId %d not found\n" defId in
let (_,s,iosh) =
try ReachingDef.StmtStartData.find stm
with Not_found -> Kernel.fatal "getDefRhs: sid %d not found \n" stm.sid in
match stm.skind with
Instr il ->
let ivihl = instrRDs il stm.sid ((),s,iosh) true in
let ivihl_in = instrRDs il stm.sid ((),s,iosh) false in
begin try
let iihl = List.combine (List.combine [il] ivihl) ivihl_in in
(try let ((i,(_,_,_diosh)),(_,_,iosh_in)) = List.find (fun ((i,(_,_,iosh')),_) ->
match time "iosh_defId_find" (iosh_defId_find iosh') defId with
Some vid ->
(match i with
Set((Var vi',NoOffset),_,_) -> vi'.vid = vid
| Call(Some(Var vi',NoOffset),_,_,_) -> vi'.vid = vid
| Call(None,_,_,_) -> false
| Asm(_,_,sll,_,_,_) -> List.exists
(function (_,_,(Var vi',NoOffset)) -> vi'.vid = vid | _ -> false) sll
| _ -> false)
| None -> false) iihl in
(match i with
Set((lh,_),e,_) ->
(match lh with
Var _vi' ->
(IH.add rhsHtbl defId (Some(RDExp(e),stm.sid,iosh_in));
Some(RDExp(e), stm.sid, iosh_in))
| _ -> Kernel.fatal "Reaching Defs getDefRhs: right vi not first")
| Call(_lvo,_e,_el,_) ->
(IH.add rhsHtbl defId (Some(RDCall(i),stm.sid,iosh_in));
Some(RDCall(i), stm.sid, iosh_in))
| Skip _ | Code_annot _ -> None
| Asm(_a,_sl,_slvl,_sel,_sl',_) -> None)
with Not_found ->
(if !debug then (Kernel.debug "getDefRhs: No instruction defines %d" defId);
IH.add rhsHtbl defId None;
None))
with Invalid_argument _ -> None end
| _ -> Kernel.fatal "getDefRhs: defining statement not an instruction list %d" defId