Skip to content

Commit

Permalink
[release-branch.go1.15] cmd/compile: fix left shift constant folding …
Browse files Browse the repository at this point in the history
…rule

The 32-bit left shift constant folding rule should keep its result
properly sign extended.

Fixes #41720
Fixes #41711

Change-Id: I0fc74444d444274e911952e1725dab0b7737a846
Reviewed-on: https://go-review.googlesource.com/c/go/+/258817
Trust: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
  • Loading branch information
randall77 authored and toothrot committed Oct 14, 2020
1 parent 8b224e9 commit 7863f74
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/cmd/compile/internal/ssa/gen/AMD64.rules
Original file line number Diff line number Diff line change
Expand Up @@ -1454,7 +1454,7 @@
(XORQ x x) -> (MOVQconst [0])
(XORL x x) -> (MOVLconst [0])

(SHLLconst [d] (MOVLconst [c])) -> (MOVLconst [int64(int32(c)) << uint64(d)])
(SHLLconst [d] (MOVLconst [c])) -> (MOVLconst [int64(int32(c) << uint64(d))])
(SHLQconst [d] (MOVQconst [c])) -> (MOVQconst [c << uint64(d)])
(SHLQconst [d] (MOVLconst [c])) -> (MOVQconst [int64(int32(c)) << uint64(d)])

Expand Down
4 changes: 2 additions & 2 deletions src/cmd/compile/internal/ssa/rewriteAMD64.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions test/fixedbugs/issue41711.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// compile -d=ssa/check/on

// Copyright 2020 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.

package main

func f() uint32 {
s := "food"
x := uint32(s[0]) + uint32(s[1])<<8 + uint32(s[2])<<16 + uint32(s[3])<<24
// x is a constant, but that's not known until lowering.
// shifting it by 8 moves the high byte up into the high 32 bits of
// a 64-bit word. That word is not properly sign-extended by the faulty
// rule, which causes the compiler to fail.
return x << 8
}

0 comments on commit 7863f74

Please sign in to comment.