let computeRDs fdec =
  try
    if String.compare fdec.svar.vname (!debug_fn) = 0 then
      (debug := true;
       Kernel.debug "%s =\n%a\n" (!debug_fn) d_block fdec.sbody);
    let bdy = fdec.sbody in
    let slst = bdy.bstmts in
    ReachingDef.StmtStartData.clear ();
    IH.clear ReachingDef.defIdStmtHash;
    IH.clear rhsHtbl;
    Hashtbl.clear iRDsHtbl;
    ReachingDef.nextDefId := 0;
    let fst_stm = List.hd slst in
    let fst_iosh = IH.create 32 in
    UD.onlyNoOffsetsAreDefs := false;
    ReachingDef.StmtStartData.add fst_stm ((), 0, fst_iosh);
    time "liveness" L.computeLiveness fdec;
    ignore(ReachingDef.computeFirstPredecessor fst_stm ((), 0, fst_iosh));
    if !debug then Kernel.debug "computeRDs: fst_stm.sid=%d\n" fst_stm.sid ;
    RD.compute [fst_stm];
    if String.compare fdec.svar.vname (!debug_fn) = 0 then
      debug := false
    (* now ReachingDef.stmtStartData has the reaching def data in it *)
  with Failure "hd" -> if String.compare fdec.svar.vname (!debug_fn) = 0 then
    debug := false