mirror of
https://github.com/golang/go
synced 2024-11-11 21:50:21 -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:
parent
562d06fc23
commit
d251030fa6
@ -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)
|
||||
|
@ -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)
|
||||
|
16
test/fixedbugs/issue16733.go
Normal file
16
test/fixedbugs/issue16733.go
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user