(** Operations that are so cheap to recompute that CSE should not factor them out. *)
Definition is_trivial_op (op: operation) : bool :=
match op with
| Omove => true
| Ointconst _ => true
| Oaddrsymbol _ _ => true
| Oaddrstack _ => true
| _ => false
end.
(** Operations that depend on the memory state. *)
Definition op_depends_on_memory (op: operation) : bool :=
match op with
| Ocmp (Ccompu _) => true
| Ocmp (Ccompuimm _ _) => true
| Ocmp (Ccomplu _) => Archi.ppc64
| Ocmp (Ccompluimm _ _) => Archi.ppc64
| _ => false
end.

Lemma op_depends_on_memory_correct:
forall (F V: Type) (ge: Genv.t F V) sp op args m1 m2,
op_depends_on_memory op = false ->
eval_operation ge sp op args m1 = eval_operation ge sp op args m2.