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.RDExp(e) as r, dsid, defiosh) ->
              if !debug then Cilmsg.debug "Can I replace %s with %a?"
                vi.vname d_exp e;
              if ok_to_replace vi iosh sid defiosh dsid fd r
              then
                (if !debug then (Cilmsg.debug "Yes.");
                 ChangeTo(e))
              else (if !debug then (Cilmsg.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 once *)
          (match cur_rd_dat with
            Some(_,_s,iosh) -> do_change iosh vi
          | None -> let iviho = RD.getRDs sid in
            match iviho with
              Some(_,_s,iosh) ->
                (if !debug then
                   (Cilmsg.debug "Try to change %s outside of instruction." vi.vname);
                 do_change iosh vi)
            | None ->
                (if !debug then
                   (Cilmsg.debug "%s in statement w/o RD info" vi.vname);
                 DoChildren))
        else DoChildren)
    | _ -> DoChildren