]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix half multiply issue
authorTodd Neal <todd@tneal.org>
Tue, 23 Jun 2015 23:59:52 +0000 (18:59 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 26 Jun 2015 15:55:22 +0000 (15:55 +0000)
In walkdiv, an OMUL node was created and passed to typecheck,
before the op was changed back to OHMUL.  In some instances,
the node that came back was an evaluated literal constant that
occurred with a full multiply.  The end result was a literal node
with a non-shifted value and an OHMUL op. This change causes code
to be generated for the OHMUL.

Fixes #11358
Fixes #11369

Change-Id: If42a98c6830d07fe065d5ca57717704fb8cfbd33
Reviewed-on: https://go-review.googlesource.com/11400
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/compile/internal/gc/align.go
src/cmd/compile/internal/gc/typecheck.go
src/cmd/compile/internal/gc/walk.go
test/fixedbugs/issue11369.go [new file with mode: 0644]

index 0fc3c2b97c3bf5792fc96804780072820c6dda43..60c59fc32ba11f4fc014d4113c41e0c69dded55a 100644 (file)
@@ -554,6 +554,7 @@ func typeinit() {
        okfor[OLE] = okforcmp[:]
        okfor[OLT] = okforcmp[:]
        okfor[OMOD] = okforand[:]
+       okfor[OHMUL] = okforarith[:]
        okfor[OMUL] = okforarith[:]
        okfor[ONE] = okforeq[:]
        okfor[OOR] = okforand[:]
index c6626048dc9e0202604846b1e27e7ffa4558389a..65fd29d2661071f403b18b488c0184d2044f51e2 100644 (file)
@@ -524,6 +524,7 @@ OpSwitch:
                OEQ,
                OGE,
                OGT,
+               OHMUL,
                OLE,
                OLT,
                OLSH,
index c0fbc751089fff6cab68a31a02641e6e65de0173..bbbc990cb17806ad130b776019422db175fe22ba 100644 (file)
@@ -3599,9 +3599,8 @@ func walkdiv(np **Node, init **NodeList) {
                        nc := Nod(OXXX, nil, nil)
 
                        Nodconst(nc, nl.Type, int64(m.Um))
-                       n1 := Nod(OMUL, nl, nc)
+                       n1 := Nod(OHMUL, nl, nc)
                        typecheck(&n1, Erv)
-                       n1.Op = OHMUL
                        if m.Ua != 0 {
                                // Select a Go type with (at least) twice the width.
                                var twide *Type
@@ -3644,9 +3643,8 @@ func walkdiv(np **Node, init **NodeList) {
                        nc := Nod(OXXX, nil, nil)
 
                        Nodconst(nc, nl.Type, m.Sm)
-                       n1 := Nod(OMUL, nl, nc)
+                       n1 := Nod(OHMUL, nl, nc)
                        typecheck(&n1, Erv)
-                       n1.Op = OHMUL
                        if m.Sm < 0 {
                                // add the numerator.
                                n1 = Nod(OADD, n1, nl)
diff --git a/test/fixedbugs/issue11369.go b/test/fixedbugs/issue11369.go
new file mode 100644 (file)
index 0000000..9df37c3
--- /dev/null
@@ -0,0 +1,27 @@
+// 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.
+
+// Test that the half multiply resulting from a division
+// by a constant generates correct code.
+
+package main
+
+func main() {
+       var _ = 7 / "0"[0] // test case from #11369
+       var _ = 1 / "."[0] // test case from #11358
+       var x = 0 / "0"[0]
+       var y = 48 / "0"[0]
+       var z = 5 * 48 / "0"[0]
+       if x != 0 {
+               panic("expected 0")
+       }
+       if y != 1 {
+               panic("expected 1")
+       }
+       if z != 5 {
+               panic("expected 5")
+       }
+}