Use a version of Floyd's cycle finding algorithm,
but advance by 1 and 1/2 steps per cycle rather
than by 1 and 2. It is simpler and should be cheaper
in the normal, acyclic case.
This should fix the 386 and arm builds,
which are currently hung.
Change-Id: If8bd443011b28a5ecb004a549239991d3dfc862b
Reviewed-on: https://go-review.googlesource.com/13473
Reviewed-by: Keith Randall <khr@golang.org>
}
// Rewriting can generate OpCopy loops.
// They are harmless (see removePredecessor),
- // but take care not to loop forever.
- for a.Op == OpCopy && a != a.Args[0] {
+ // but take care to stop if we find a cycle.
+ slow := a // advances every other iteration
+ var advance bool
+ for a.Op == OpCopy {
a = a.Args[0]
+ if slow == a {
+ break
+ }
+ if advance {
+ slow = a
+ }
+ advance = !advance
}
v.Args[i] = a
}