Commit d251030f authored by Keith Randall's avatar Keith Randall

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: default avatarDavid Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 562d06fc
...@@ -522,7 +522,7 @@ ...@@ -522,7 +522,7 @@
(XORQconst [c] (XORQconst [d] x)) -> (XORQconst [c ^ d] x) (XORQconst [c] (XORQconst [d] x)) -> (XORQconst [c ^ d] x)
(MULLconst [c] (MULLconst [d] x)) -> (MULLconst [int64(int32(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 x (MOVQconst [c])) && is32Bit(c) -> (ORQconst [c] x)
(ORQ (MOVQconst [c]) x) && is32Bit(c) -> (ORQconst [c] x) (ORQ (MOVQconst [c]) x) && is32Bit(c) -> (ORQconst [c] x)
......
...@@ -9753,7 +9753,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value, config *Config) bool { ...@@ -9753,7 +9753,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value, config *Config) bool {
b := v.Block b := v.Block
_ = b _ = b
// match: (MULQconst [c] (MULQconst [d] x)) // match: (MULQconst [c] (MULQconst [d] x))
// cond: // cond: is32Bit(c*d)
// result: (MULQconst [c * d] x) // result: (MULQconst [c * d] x)
for { for {
c := v.AuxInt c := v.AuxInt
...@@ -9763,6 +9763,9 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value, config *Config) bool { ...@@ -9763,6 +9763,9 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value, config *Config) bool {
} }
d := v_0.AuxInt d := v_0.AuxInt
x := v_0.Args[0] x := v_0.Args[0]
if !(is32Bit(c * d)) {
break
}
v.reset(OpAMD64MULQconst) v.reset(OpAMD64MULQconst)
v.AuxInt = c * d v.AuxInt = c * d
v.AddArg(x) v.AddArg(x)
......
// 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
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment