diff --git a/iris/algebra/ofe.v b/iris/algebra/ofe.v
index df78c64fe5be742685e05a5dc1dd4fe6858f8d46..b2c909d267e01fdd93dea89d7fcdebcc3ab4890b 100644
--- a/iris/algebra/ofe.v
+++ b/iris/algebra/ofe.v
@@ -261,7 +261,9 @@ Ltac f_contractive :=
   | |- @dist_later ?A _ ?n ?x ?y =>
          destruct n as [|n]; [exact I|change (@dist A _ n x y)]
   end;
-  try simple apply reflexivity.
+  (* Only try reflexivity if the terms are syntactically equal. This avoids
+     very expensive failing unification. *)
+  try match goal with  |- _ ?x ?x => simple apply reflexivity end.
 
 Ltac solve_contractive :=
   solve_proper_core ltac:(fun _ => first [f_contractive | f_equiv]).
diff --git a/iris/program_logic/weakestpre.v b/iris/program_logic/weakestpre.v
index b918c293379f1c1bef06f481c0807cef1aa162eb..733294c4adf74f8ac2171302b9051060071b1e44 100644
--- a/iris/program_logic/weakestpre.v
+++ b/iris/program_logic/weakestpre.v
@@ -100,9 +100,6 @@ Global Instance wp_ne s E e n :
 Proof.
   revert e. induction (lt_wf n) as [n _ IH]=> e Φ Ψ HΦ.
   rewrite !wp_unfold /wp_pre /=.
-  (* FIXME: figure out a way to properly automate this proof *)
-  (* FIXME: reflexivity, as being called many times by f_equiv and f_contractive
-  is very slow here *)
   do 24 (f_contractive || f_equiv).
   (* FIXME : simplify this proof once we have a good definition and a
      proper instance for step_fupdN. *)
diff --git a/iris_heap_lang/proofmode.v b/iris_heap_lang/proofmode.v
index 2d78d4319c941f329510af9964d614001fd25e5a..9d44d43ee5565ca11851c1eac9a820a3859a70b0 100644
--- a/iris_heap_lang/proofmode.v
+++ b/iris_heap_lang/proofmode.v
@@ -473,7 +473,7 @@ Lemma tac_twp_cmpxchg_fail Δ s E i K l q v v1 v2 Φ :
 Proof.
   rewrite envs_entails_eq. intros. rewrite -twp_bind.
   eapply wand_apply; first exact: twp_cmpxchg_fail.
-  rewrite envs_lookup_split //=. by do 2 f_equiv.
+  rewrite envs_lookup_split //=. simpl. by do 2 f_equiv.
 Qed.
 
 Lemma tac_wp_cmpxchg_suc Δ Δ' s E i K l v v1 v2 Φ :