Proof with eauto with renamings reg_renamings val_renamings.
intros.
destruct Hmem_obs_eq.
pose proof (injective weak_obs_eq0).
induction Heval; subst;
try by (eexists; split)...
- eapply loadv_val_obs with (vptr2 := Val.offset_ptr (rs' RSP) ofs) in H...
destruct H as (varg' & Hload' & Hval_obs)...
- assert (Hb: val_obs f (Senv.symbol_address g id ofs)
(Senv.symbol_address g id ofs))
by (eapply symb_val_obs; eauto).
eapply loadv_val_obs with (vptr2 := Senv.symbol_address g id ofs) in H;
eauto.
destruct H as (varg' & Hload' & Hval_obs)...
- assert (Hb: val_obs f (Senv.symbol_address g id ofs)
(Senv.symbol_address g id ofs))
by (eapply symb_val_obs; eauto)...
- destruct IHHeval1 as (vhi' & ? & ?), IHHeval2 as (vlo' & ? & ?)...
- destruct IHHeval1 as (vhi' & ? & ?), IHHeval2 as (vlo' & ? & ?).
eexists; split; [constructor; eauto|].
destruct Archi.ptr64...
Qed.

(* Specifications: *)
Lemma eval_builtin_args_ren:
forall (g : genv) (rs rs' : regset) (f fg: memren) (m m' : mem)
(args : seq (builtin_arg preg)) (vargs : seq val)
(Hmem_obs_eq: mem_obs_eq f m m')
(Hrs_ren: regset_ren f rs rs')
(Hfg: forall b1 b2, fg b1 = Some b2 -> b1 = b2)
(Hge_wd: ge_wd fg g)
(Hincr: ren_incr fg f)
(Heval: eval_builtin_args g rs (rs RSP) m args vargs),
exists vargs',
eval_builtin_args g rs' (rs' RSP) m' args vargs' /\
val_obs_list f vargs vargs'.
Lemma block_is_volatile_ren:
forall g fg f b1 b2
(Hfg: forall b1 b2 : block, fg b1 = Some b2 -> b1 = b2)
(Hge_wd: ge_wd fg g)
(Hincr: ren_incr fg f)
(Hf: f b1 = Some b2)
(Hinjective: forall b1 b1' b2, f b1 = Some b2 -> f b1' = Some b2 ->
b1 = b1')
(Hvolatile: Senv.block_is_volatile g b1 = false),
Senv.block_is_volatile g b2 = false.
Lemma val_obs_addrmode32:
forall f fg g (a : addrmode) rs rs'
(Hrs_ren: regset_ren f rs rs')
(Hfg: forall b1 b2, fg b1 = Some b2 -> b1 = b2)
(Hge_wd: ge_wd fg g)
(Hincr: ren_incr fg f),
val_obs f (eval_addrmode32 g a rs) (eval_addrmode32 g a rs').