let elim_dead_code (fd : fundec) :  fundec =
  (* fundec -> fundec *)
  usedDefsSet := IS.empty;
  IH.clear defUseSetHash;
  IH.clear sidUseSetHash;
  removedCount := 0;
  time "reaching definitions" RD.computeRDs fd;
  if !debug then (Kernel.debug "DCE: collecting used definitions\n");
  ignore(time "ud-collector"
           (visitCilFunction (new usedDefsCollectorClass :> cilVisitor)) fd);
  if !debug then (Kernel.debug "DCE: eliminating useless instructions\n");
  let fd' = time "useless-elim" (visitCilFunction (new uselessInstrElim)) fd in
  fd'