diff --git a/mercurial/phases.py b/mercurial/phases.py
index 6b2aeeec3ed001cceef27438543b58fcb0fbdb4e_bWVyY3VyaWFsL3BoYXNlcy5weQ==..c9ceb4f6025690167bdb245e530de6bac8baae95_bWVyY3VyaWFsL3BoYXNlcy5weQ== 100644
--- a/mercurial/phases.py
+++ b/mercurial/phases.py
@@ -703,6 +703,7 @@
             return set()
 
         # search for affected high phase changesets and roots
+        seen = set(new_revs)
         push = heapq.heappush
         pop = heapq.heappop
         parents = cl.parentrevs
@@ -735,5 +736,6 @@
                 # higher phases
                 delroots.add(current)
             # schedule a walk down if needed
-            if p1_phase > targetphase:
+            if p1_phase > targetphase and p1 not in seen:
+                seen.add(p1)
                 push(revs, -p1)
@@ -739,5 +741,6 @@
                 push(revs, -p1)
-            if p2_phase > targetphase:
+            if p2_phase > targetphase and p2 not in seen:
+                seen.add(p2)
                 push(revs, -p2)
             if p1_phase < targetphase and p2_phase < targetphase:
                 new_target_roots.add(current)