]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't fold >32bit constants into a MULQ
authorKeith Randall <khr@golang.org>
Tue, 16 Aug 2016 16:19:05 +0000 (09:19 -0700)
committerKeith Randall <khr@golang.org>
Tue, 16 Aug 2016 16:46:48 +0000 (16:46 +0000)
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>

src/cmd/compile/internal/ssa/gen/AMD64.rules
src/cmd/compile/internal/ssa/rewriteAMD64.go
test/fixedbugs/issue16733.go [new file with mode: 0644]

index aa81ca7aa8512d92685f9c4e7d2903b2484eacb5..f676608c279407ac6399c49c2a23d973dc9958dd 100644 (file)
 (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)
index d09e706fddb9ff42e5080e4dea993c1f064af9b6..7d07c66ec0027b64df61d182df15ccfa056955dd 100644 (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)
diff --git a/test/fixedbugs/issue16733.go b/test/fixedbugs/issue16733.go
new file mode 100644 (file)
index 0000000..850b042
--- /dev/null
@@ -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
+}