1
0
mirror of https://github.com/golang/go synced 2024-11-26 16:57:14 -07:00

cmd/compile: don't fold >32bit constants into a MULQ

Don't fold constant factors into a multiply
beyond the capacity of a MULQ instruction (32 bits).

Fixes #16733

Change-Id: Idc213c6cb06f7c94008a8cf9e60a9e77d085fd89
Reviewed-on: https://go-review.googlesource.com/27160
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Keith Randall 2016-08-16 09:19:05 -07:00
parent 562d06fc23
commit d251030fa6
3 changed files with 21 additions and 2 deletions

View File

@ -522,7 +522,7 @@
(XORQconst [c] (XORQconst [d] x)) -> (XORQconst [c ^ d] x)
(MULLconst [c] (MULLconst [d] x)) -> (MULLconst [int64(int32(c * d))] x)
(MULQconst [c] (MULQconst [d] x)) -> (MULQconst [c * d] x)
(MULQconst [c] (MULQconst [d] x)) && is32Bit(c*d) -> (MULQconst [c * d] x)
(ORQ x (MOVQconst [c])) && is32Bit(c) -> (ORQconst [c] x)
(ORQ (MOVQconst [c]) x) && is32Bit(c) -> (ORQconst [c] x)

View File

@ -9753,7 +9753,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value, config *Config) bool {
b := v.Block
_ = b
// match: (MULQconst [c] (MULQconst [d] x))
// cond:
// cond: is32Bit(c*d)
// result: (MULQconst [c * d] x)
for {
c := v.AuxInt
@ -9763,6 +9763,9 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value, config *Config) bool {
}
d := v_0.AuxInt
x := v_0.Args[0]
if !(is32Bit(c * d)) {
break
}
v.reset(OpAMD64MULQconst)
v.AuxInt = c * d
v.AddArg(x)

View File

@ -0,0 +1,16 @@
// compile
// Copyright 2016 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.
// Issue 16733: don't fold constant factors into a multiply
// beyond the capacity of a MULQ instruction (32 bits).
package p
func f(n int64) int64 {
n *= 1000000
n *= 1000000
return n
}