]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix register allocation for == operator
authorUlrich Kunitz <uli.kunitz@gmail.com>
Thu, 20 Aug 2015 16:56:18 +0000 (18:56 +0200)
committerRuss Cox <rsc@golang.org>
Tue, 25 Aug 2015 18:10:14 +0000 (18:10 +0000)
The issue 12226 has been caused by the allocation of the same register
for the equality check of two byte values. The code in cgen.go freed the
register for the second operand before the allocation of the register
for the first operand.

Fixes #12226

Change-Id: Ie4dc33a488bd48a17f8ae9b497fd63c1ae390555
Reviewed-on: https://go-review.googlesource.com/13771
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/compile/internal/gc/cgen.go
test/fixedbugs/issue12226.go [new file with mode: 0644]

index 4160ae9d402f374f9216c9b57829b24e8fad2916..b6a3e5bbebfc6b1ff524d952cb649f8f2fa7014f 100644 (file)
@@ -2018,11 +2018,11 @@ func bgenx(n, res *Node, wantTrue bool, likely int, to *obj.Prog) {
                Regalloc(&n2, nr.Type, nil)
                Cgen(nr, &n2)
                nr = &n2
-               Regfree(&n2)
 
                Regalloc(&n1, nl.Type, nil)
                Cgen(&tmp, &n1)
                Regfree(&n1)
+               Regfree(&n2)
        } else {
                var n1 Node
                if !nl.Addable && Ctxt.Arch.Thechar == '8' {
diff --git a/test/fixedbugs/issue12226.go b/test/fixedbugs/issue12226.go
new file mode 100644 (file)
index 0000000..2246711
--- /dev/null
@@ -0,0 +1,15 @@
+// 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
+
+import "fmt"
+
+func main() {
+       if []byte("foo")[0] == []byte("b")[0] {
+               fmt.Println("BUG: \"foo\" and \"b\" appear to have the same first byte")
+       }
+}