mirror of
https://github.com/golang/go
synced 2024-10-05 21:31:21 -06:00
[dev.ssa] cmd/compile: detect rewrite loops of length > 1
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>
This commit is contained in:
parent
e98edc88c9
commit
baf2c3ec4a
@ -44,9 +44,18 @@ func applyRewrite(f *Func, rb func(*Block) bool, rv func(*Value, *Config) bool)
|
|||||||
}
|
}
|
||||||
// Rewriting can generate OpCopy loops.
|
// Rewriting can generate OpCopy loops.
|
||||||
// They are harmless (see removePredecessor),
|
// They are harmless (see removePredecessor),
|
||||||
// but take care not to loop forever.
|
// but take care to stop if we find a cycle.
|
||||||
for a.Op == OpCopy && a != a.Args[0] {
|
slow := a // advances every other iteration
|
||||||
|
var advance bool
|
||||||
|
for a.Op == OpCopy {
|
||||||
a = a.Args[0]
|
a = a.Args[0]
|
||||||
|
if slow == a {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if advance {
|
||||||
|
slow = a
|
||||||
|
}
|
||||||
|
advance = !advance
|
||||||
}
|
}
|
||||||
v.Args[i] = a
|
v.Args[i] = a
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user