]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: teach peephole optimizer that duffcopy clobbers X0
authorKeith Randall <khr@golang.org>
Fri, 6 Nov 2015 08:06:52 +0000 (00:06 -0800)
committerKeith Randall <khr@golang.org>
Fri, 6 Nov 2015 15:11:42 +0000 (15:11 +0000)
Duffcopy now uses X0, as of 5cf281a.  Teach the peephole
optimizer that duffcopy clobbers X0 so that it does not
rename registers use X0 across the duffcopy instruction.

Fixes #13171

Change-Id: I389cbf1982cb6eb2f51e6152ac96736a8589f085
Reviewed-on: https://go-review.googlesource.com/16715
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Minux Ma <minux@golang.org>
Reviewed-by: Ilya Tocar <ilya.tocar@intel.com>
src/cmd/compile/internal/amd64/peep.go
src/cmd/compile/internal/amd64/prog.go
src/cmd/compile/internal/amd64/reg.go
test/fixedbugs/issue13171.go [new file with mode: 0644]

index 130f369a8b657be4a642caccef7036ccd3786b82..452f954bd828c881e64adf082527543c89588559 100644 (file)
@@ -823,6 +823,10 @@ func copyu(p *obj.Prog, v *obj.Addr, s *obj.Addr) int {
                return 2
        }
 
+       if (p.Info.Reguse|p.Info.Regset)&FtoB(int(v.Reg)) != 0 {
+               return 2
+       }
+
        if p.Info.Flags&gc.LeftAddr != 0 {
                if copyas(&p.From, v) {
                        return 2
index eff6ccee5b3bc9ca2e15632f56cffcbd0abda6ed..ae8f5255a968a4fb40f437c20f3b0450bce1a8cf 100644 (file)
@@ -140,7 +140,7 @@ var progtable = [x86.ALAST]obj.ProgInfo{
        x86.AMOVSL:     {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
        x86.AMOVSQ:     {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
        x86.AMOVSW:     {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
-       obj.ADUFFCOPY:  {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI | CX},
+       obj.ADUFFCOPY:  {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI | X0},
        x86.AMOVSD:     {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move},
        x86.AMOVSS:     {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move},
 
index 8fab6399b1d88c86a08ca92b980eade55f7b0b95..60822fbfe99558c70536645c68c7b99cd5537476 100644 (file)
@@ -107,6 +107,7 @@ const (
        DI  = 1 << (x86.REG_DI - x86.REG_AX)
        SI  = 1 << (x86.REG_SI - x86.REG_AX)
        R15 = 1 << (x86.REG_R15 - x86.REG_AX)
+       X0  = 1 << 16
 )
 
 func RtoB(r int) uint64 {
diff --git a/test/fixedbugs/issue13171.go b/test/fixedbugs/issue13171.go
new file mode 100644 (file)
index 0000000..5d127a5
--- /dev/null
@@ -0,0 +1,34 @@
+// run
+
+// Copyright 2015 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 main
+
+// Make sure the compiler knows that DUFFCOPY clobbers X0
+
+import "fmt"
+
+//go:noinline
+func f(x float64) float64 {
+       // y is allocated to X0
+       y := x + 5
+       // marshals z before y.  Marshalling z
+       // calls DUFFCOPY.
+       return g(z, y)
+}
+
+//go:noinline
+func g(b [64]byte, y float64) float64 {
+       return y
+}
+
+var z [64]byte
+
+func main() {
+       got := f(5)
+       if got != 10 {
+               panic(fmt.Sprintf("want 10, got %f", got))
+       }
+}