]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile,runtime: skip zero'ing order array for select statements
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Fri, 28 Aug 2020 20:25:21 +0000 (03:25 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Sat, 29 Aug 2020 08:02:52 +0000 (08:02 +0000)
The order array was zero initialized by the compiler, but ends up being
overwritten by the runtime anyway.

So let the runtime takes full responsibility for initializing, save us
one instruction per select.

Fixes #40399

Change-Id: Iec1eca27ad7180d4fcb3cc9ef97348206b7fe6b8
Reviewed-on: https://go-review.googlesource.com/c/go/+/251517
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/select.go
src/runtime/select.go
test/codegen/select.go [new file with mode: 0644]

index 3812a0e1faa6e5c333d39095981ecf01c0e02b10..97e0424ce07f8411d4b5b786d51d5d31369484b0 100644 (file)
@@ -251,10 +251,8 @@ func walkselectcases(cases *Nodes) []*Node {
        r = typecheck(r, ctxStmt)
        init = append(init, r)
 
+       // No initialization for order; runtime.selectgo is responsible for that.
        order := temp(types.NewArray(types.Types[TUINT16], 2*int64(ncas)))
-       r = nod(OAS, order, nil)
-       r = typecheck(r, ctxStmt)
-       init = append(init, r)
 
        var pc0, pcs *Node
        if flag_race {
index 80768b285bd9ffc36ad9feaa116b7887bcff020c..a506747910f4ca8d953d45803f8d7339a4c65f55 100644 (file)
@@ -118,6 +118,7 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, nsends, nrecvs int, blo
        scases := cas1[:ncases:ncases]
        pollorder := order1[:ncases:ncases]
        lockorder := order1[ncases:][:ncases:ncases]
+       // NOTE: pollorder/lockorder's underlying array was not zero-initialized by compiler.
 
        // Even when raceenabled is true, there might be select
        // statements in packages compiled without -race (e.g.,
diff --git a/test/codegen/select.go b/test/codegen/select.go
new file mode 100644 (file)
index 0000000..4426924
--- /dev/null
@@ -0,0 +1,20 @@
+// asmcheck
+
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package codegen
+
+func f() {
+       ch1 := make(chan int)
+       ch2 := make(chan int)
+       for {
+               // amd64:-`MOVQ\t[$]0, ""..autotmp_3`
+               select {
+               case <-ch1:
+               case <-ch2:
+               default:
+               }
+       }
+}