Proof with eauto with val_erasure.
intros.
destruct v1,v2; simpl in *; inv Hval_erasure; auto;
unfold Val.cmpu, Val.cmpu_bool; simpl; eauto with val_erasure;
do 2 rewrite andb_if;
repeat match goal with
| [|- context[match ?Expr with | _ => _ end]] =>
destruct Expr eqn:?
end; simpl; eauto with val_erasure.
- eapply mem_erasure_valid_pointer_guard in Heqb2; eauto.
congruence.
- eapply mem_erasure_valid_pointer_guard in Heqb2; eauto.
congruence.
-  subst.
apply andb_false_iff in Heqb3.
destruct Heqb3 as [Heqb3 | Heqb3];
eapply mem_erasure_valid_pointer_guard in Heqb3; eauto;
congruence.
- apply andb_false_iff in Heqb3.
destruct Heqb3 as [Heqb3 | Heqb3].
eapply mem_erasure_valid_pointer in Heqb0; eauto.
exfalso; now eauto.
eapply mem_erasure_valid_pointer in Heqb2; eauto.
exfalso; now eauto.
Qed.

(* Specifications: *)
Lemma val_erasure_cmplu:
forall v1 v2 v1' v2' m m' cmp
(Hval_erasure: val_erasure v1 v1')
(Hval_erasure2: val_erasure v2 v2')
(Hmem: mem_erasure m m'),
val_erasure (Val.maketotal (Val.cmplu (Mem.valid_pointer m) cmp v1 v2))
(Val.maketotal (Val.cmplu (Mem.valid_pointer m') cmp v1' v2')).