Skip to content

Commit

Permalink
cmd/compile: fix half multiply issue
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
tzneal authored and rsc committed Jun 26, 2015
1 parent cd0a8ed commit 765c0f3
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 4 deletions.
1 change: 1 addition & 0 deletions src/cmd/compile/internal/gc/align.go
Original file line number Diff line number Diff line change
Expand Up @@ -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[:]
Expand Down
1 change: 1 addition & 0 deletions src/cmd/compile/internal/gc/typecheck.go
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,7 @@ OpSwitch:
OEQ,
OGE,
OGT,
OHMUL,
OLE,
OLT,
OLSH,
Expand Down
6 changes: 2 additions & 4 deletions src/cmd/compile/internal/gc/walk.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
27 changes: 27 additions & 0 deletions test/fixedbugs/issue11369.go
Original file line number Diff line number Diff line change
@@ -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")
}
}

0 comments on commit 765c0f3

Please sign in to comment.