method vexpr e =

    let do_change iosh vi =
      let ido = RD.iosh_singleton_lookup iosh vi in
      (match ido with
        Some id ->
          let riviho = getDefRhs id in
          (match riviho with
               Some(RD.RDCall(i) as r, dsid, defiosh) ->
                 if !debug then Kernel.debug "Can I replace %s with %a?" vi.vname d_instr i;
                 if ok_to_replace
                   vi iosh (Extlib.the self#current_stmt).sid defiosh dsid fd r
                 then (if !debug then (Kernel.debug "Yes.");
                       IH.add iioh vi.vid (Some(i));
                       DoChildren)
                 else (if !debug then (Kernel.debug "No.");
                       DoChildren)
             | _ -> DoChildren)
         | _ -> DoChildren)
    in

    match e.enode with
      Lval (Var vi,NoOffset->
        (if check_forms vi.vname forms then
         (* only allowed to replace a tmp with a function call if there is only one use *)
          if IH.mem iioh vi.vid
          then (IH.replace iioh vi.vid NoneDoChildren)
          else
            (match cur_rd_dat with
              Some(_,_s,iosh) -> do_change iosh vi
            | None -> let iviho = RD.getRDs (Extlib.the self#current_stmt) in
              match iviho with
                Some(_,_s,iosh) ->
                  (if !debug then (Kernel.debug "Try to change %s:%d outside of instruction." vi.vname vi.vid);
                   do_change iosh vi)
              | None ->
                  (if !debug then (Kernel.debug "%s in statement w/o RD info" vi.vname);
                   DoChildren))
          else DoChildren)
    | _ -> DoChildren