mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: place combined loads at the location of the last byte load
We need to make sure all the bounds checks pass before issuing a load which combines several others. We do this by issuing the combined load at the last load's block, where "last" = closest to the leaf of the dominator tree. Fixes #15002 Change-Id: I7358116db1e039a072c12c0a73d861f3815d72af Reviewed-on: https://go-review.googlesource.com/21246 Reviewed-by: Todd Neal <todd@tneal.org>
This commit is contained in:
parent
b83618f964
commit
b81f2f106f
4 changed files with 434 additions and 234 deletions
|
|
@ -261,3 +261,53 @@ func duff(size int64) (int64, int64) {
|
|||
}
|
||||
return off, adj
|
||||
}
|
||||
|
||||
// mergePoint finds a block among a's blocks which dominates b and is itself
|
||||
// dominated by all of a's blocks. Returns nil if it can't find one.
|
||||
// Might return nil even if one does exist.
|
||||
func mergePoint(b *Block, a ...*Value) *Block {
|
||||
// Walk backward from b looking for one of the a's blocks.
|
||||
|
||||
// Max distance
|
||||
d := 100
|
||||
|
||||
for d > 0 {
|
||||
for _, x := range a {
|
||||
if b == x.Block {
|
||||
goto found
|
||||
}
|
||||
}
|
||||
if len(b.Preds) > 1 {
|
||||
// Don't know which way to go back. Abort.
|
||||
return nil
|
||||
}
|
||||
b = b.Preds[0]
|
||||
d--
|
||||
}
|
||||
return nil // too far away
|
||||
found:
|
||||
// At this point, r is the first value in a that we find by walking backwards.
|
||||
// if we return anything, r will be it.
|
||||
r := b
|
||||
|
||||
// Keep going, counting the other a's that we find. They must all dominate r.
|
||||
na := 0
|
||||
for d > 0 {
|
||||
for _, x := range a {
|
||||
if b == x.Block {
|
||||
na++
|
||||
}
|
||||
}
|
||||
if na == len(a) {
|
||||
// Found all of a in a backwards walk. We can return r.
|
||||
return r
|
||||
}
|
||||
if len(b.Preds) > 1 {
|
||||
return nil
|
||||
}
|
||||
b = b.Preds[0]
|
||||
d--
|
||||
|
||||
}
|
||||
return nil // too far away
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue