mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: randomize compilation order when race-enabled
There's been one failure on the race builder so far, before we started sorting functions by length. The race detector can only detect actual races, and ordering functions by length might reduce the odds of catching some kinds of races. Give it more to chew on. Updates #20144 Change-Id: I0206ac182cb98b70a729dea9703ecb0fef54d2d0 Reviewed-on: https://go-review.googlesource.com/41973 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
26e126d6e6
commit
f5c878e030
3 changed files with 35 additions and 6 deletions
|
|
@ -13,6 +13,7 @@ import (
|
|||
"cmd/internal/src"
|
||||
"cmd/internal/sys"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"sort"
|
||||
"sync"
|
||||
)
|
||||
|
|
@ -253,12 +254,22 @@ func compileSSA(fn *Node, worker int) {
|
|||
// and waits for them to complete.
|
||||
func compileFunctions() {
|
||||
if len(compilequeue) != 0 {
|
||||
// Compile the longest functions first,
|
||||
// since they're most likely to be the slowest.
|
||||
// This helps avoid stragglers.
|
||||
obj.SortSlice(compilequeue, func(i, j int) bool {
|
||||
return compilequeue[i].Nbody.Len() > compilequeue[j].Nbody.Len()
|
||||
})
|
||||
if raceEnabled {
|
||||
// Randomize compilation order to try to shake out races.
|
||||
tmp := make([]*Node, len(compilequeue))
|
||||
perm := rand.Perm(len(compilequeue))
|
||||
for i, v := range perm {
|
||||
tmp[v] = compilequeue[i]
|
||||
}
|
||||
copy(compilequeue, tmp)
|
||||
} else {
|
||||
// Compile the longest functions first,
|
||||
// since they're most likely to be the slowest.
|
||||
// This helps avoid stragglers.
|
||||
obj.SortSlice(compilequeue, func(i, j int) bool {
|
||||
return compilequeue[i].Nbody.Len() > compilequeue[j].Nbody.Len()
|
||||
})
|
||||
}
|
||||
var wg sync.WaitGroup
|
||||
c := make(chan *Node)
|
||||
for i := 0; i < nBackendWorkers; i++ {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue