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>
(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)
b := v.Block
_ = b
// match: (MULQconst [c] (MULQconst [d] x))
- // cond:
+ // cond: is32Bit(c*d)
// result: (MULQconst [c * d] x)
for {
c := v.AuxInt
}
d := v_0.AuxInt
x := v_0.Args[0]
+ if !(is32Bit(c * d)) {
+ break
+ }
v.reset(OpAMD64MULQconst)
v.AuxInt = c * d
v.AddArg(x)
--- /dev/null
+// 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
+}