]> Cypherpunks repositories - gostls13.git/commit
[release-branch.go1.9] cmd/compile: fix sign-extension merging rules
authorKeith Randall <khr@golang.org>
Thu, 21 Sep 2017 19:52:38 +0000 (12:52 -0700)
committerRuss Cox <rsc@golang.org>
Wed, 25 Oct 2017 20:24:00 +0000 (20:24 +0000)
commit78952c06c53c8455d03430b17b5a7fe2693b5d35
treed90f34c4cd3acd94a03a18513422d703787c8d92
parent79996e4a1d33b7404ee076d7455ff8dcc7270250
[release-branch.go1.9] cmd/compile: fix sign-extension merging rules

If we have

  y = <int16> (MOVBQSX x)
  z = <int32> (MOVWQSX y)

We used to use this rewrite rule:

(MOVWQSX x:(MOVBQSX _)) -> x

But that resulted in replacing z with a value whose type
is only int16.  Then if z is spilled and restored, it gets
zero extended instead of sign extended.

Instead use the rule

(MOVWQSX (MOVBQSX x)) -> (MOVBQSX x)

The result is has the correct type, so it can be spilled
and restored correctly.  It might mean that a few more extension
ops might not be eliminated, but that's the price for correctness.

Fixes #21963

Change-Id: I6ec82c3d2dbe43cc1fee6fb2bd6b3a72fca3af00
Reviewed-on: https://go-review.googlesource.com/65290
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-on: https://go-review.googlesource.com/70986
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/ssa/gen/AMD64.rules
src/cmd/compile/internal/ssa/rewriteAMD64.go
test/fixedbugs/issue21963.go [new file with mode: 0644]