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 -> Cilmsg.fatal "getDefRhs: defId %d not found\n" defId in
  let (_,s,iosh) =
    try ReachingDef.StmtStartData.find stm.sid
    with Not_found -> Cilmsg.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 (* defs that reach out of each instr *)
      let ivihl_in = instrRDs il stm.sid ((),s,iosh) false in (* defs that reach into each instr *)
      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 (* _ -> NoOffset *)
              | Call(Some(Var vi',NoOffset),_,_,_) -> vi'.vid = vid (* _ -> NoOffset *)
              | 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))
               | _ -> Cilmsg.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 (Cilmsg.debug "getDefRhs: No instruction defines %d" defId);
           IH.add rhsHtbl defId None;
           None))
      with Invalid_argument _ -> None end
  | _ -> Cilmsg.fatal "getDefRhs: defining statement not an instruction list %d" defId